Работа счётчика (System.Timers.Timer) в плагине AutoCAD с GUI на основе WPF

Для взаимодействия с объектами WPF из других потоков, следует использовать System.Windows.Threading.Dispatcher. 
Код:

  1.    1:  using System;
       2:  using Autodesk.AutoCAD.ApplicationServices;
       3:  using System.Windows;
       4:  using System.Windows.Media;
       5:  using System.Windows.Controls;
       6:  using Autodesk.AutoCAD.Runtime;
       7:  using System.Timers;
       8:  using Autodesk.AutoCAD.EditorInput;
       9:  using System.Windows.Threading;
      10:   
      11:  [assembly: ExtensionApplication(typeof(StartWindow.Class1))]
      12:   
      13:  namespace StartWindow
      14:  {
      15:      //Тестировать следует на AutoCAD 2009
      16:      //Обрабатывать события сворачивания/разворачивания/изменения размеров основного окна приложения не стал
      17:      public class Class1 : IExtensionApplication
      18:      {
      19:          Window win;
      20:          Editor editor;
      21:          Timer timer;
      22:          Dispatcher dispatcher;//Поскольку используется технология WPF, а не WinForms, все изменения контролов следует выполнять через диспетчера
      23:          int i = 100;
      24:          public void ShowStartDialog()
      25:          {            
      26:              editor = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
      27:              LinearGradientBrush brash = new LinearGradientBrush(Colors.Brown, Colors.DarkGray, new Point(0, 0), new Point(1, 1));
      28:              StackPanel panel = new StackPanel();
      29:              Label txt = new Label { Content = "Hello World!", HorizontalAlignment = HorizontalAlignment.Center,
      30:                  VerticalAlignment = VerticalAlignment.Center, FontSize = 34 };
      31:              panel.Children.Add(txt);
      32:              txt = new Label { Content = "100", HorizontalAlignment = HorizontalAlignment.Center,
      33:                  VerticalAlignment = VerticalAlignment.Center, FontSize = 34 };
      34:              panel.Children.Add(txt);
      35:              win = new Window {Width = 400, Height = 200, WindowStartupLocation = WindowStartupLocation.CenterScreen, WindowStyle = WindowStyle.None,
      36:                  Background = brash, Content=panel, Opacity = 1, AllowsTransparency = true, ShowInTaskbar = false, Topmost = true};
      37:              
      38:              win.MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(win_MouseLeftButtonDown);
      39:   
      40:              timer = new Timer { Interval = 100, AutoReset = true };
      41:              timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
      42:              dispatcher = win.Dispatcher;
      43:              win.Show();
      44:              timer.Start();
      45:          }
      46:          //Пусть окошко потихоньку плавно исчезает, демонстрируя обратный отсчёт
      47:          void timer_Elapsed(object sender, ElapsedEventArgs e)
      48:          {
      49:              dispatcher.Invoke((Action)delegate
      50:              {
      51:                  Label lab = (win.Content as StackPanel).Children[1] as Label;
      52:                  lab.Content = i;
      53:                  --i;
      54:                  win.Opacity -= 0.01;
      55:                  //Если окно невидимо - закрыть его
      56:                  if (i <= 0) { win.Close(); timer.Stop();}
      57:              }, null);
      58:          }
      59:   
      60:          //Кликом левой кнопки мыши закрыть окно
      61:          void win_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
      62:          {
      63:              win.Close();
      64:          }
      65:   
      66:          #region IExtensionApplication Members
      67:   
      68:          public void Initialize()
      69:          {
      70:              ShowStartDialog();
      71:          }
      72:          public void Terminate()
      73:          { }
      74:          #endregion
      75:      }
      76:  }

Результат:


Всё работает, как и ожидалось. Исходники примера выложены ниже...

ċ
StartWindow.rar
(27k)
Андрей Бушман,
10 окт. 2011 г., 07:06
Comments