WPF шаблон

Автор Тема: WPF шаблон  (Прочитано 2598 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн А.BalmАвтор темы

  • ADN OPEN
  • Сообщений: 9
  • Карма: 0
WPF шаблон
« : 16-02-2019, 12:22:53 »
Добрый день!
Попытался разобраться с шаблоном WPF под Revit https://thebuildingcoder.typepad.com/blog/2019/01/room-boundaries-to-csv-and-wpf-template.html#3

В этом шаблоне реализован MVVM.
Насколько я понимаю сперва создается форма в revit  _wpfWindowController.ShowForm(commandData.Application);
Код - C# [Выбрать]
  1.         private WpfWindowController _wpfWindowController = new WpfWindowController();
  2.  
  3.         /// <summary>
  4.         /// External command mainline
  5.         /// </summary>
  6.         public Result Execute(
  7.             ExternalCommandData commandData,
  8.             ref string message,
  9.             ElementSet elements)
  10.         {
  11.             try
  12.             {
  13.                 // Display WPF Form
  14.                 AppInfoProvider.Initialise(commandData);
  15.                 _wpfWindowController.ShowForm(commandData.Application);
  16.  
  17.                 return Result.Succeeded;
  18.             }
  19.  
  20.             catch (Exception ex)
  21.             {
  22.                 message = ex.Message;
  23.                 return Result.Failed;
  24.             }
  25.         }
  26.  

Затем как содержимое к форме прикручивается WPF Window.Content = _ElementFilterUserControl;
Код - C# [Выбрать]
  1.       public void ShowForm(UIApplication uiapp)
  2.         {
  3.             if (_ElementFilterUserControl == null)
  4.             {
  5.                 if (Instance == null)
  6.                 {
  7.                     Instance = this;
  8.                 }
  9.  
  10.                 // A new handler to handle request posting by the dialog
  11.                 RevitHandler handler = new RevitHandler();
  12.  
  13.                 // External Event for the dialog to use (to post requests)
  14.                 ExternalEvent exEvent = ExternalEvent.Create(handler);
  15.  
  16.                 // We give the objects to the new dialog;
  17.                 // The dialog becomes the owner responsible for disposing them, eventually.
  18.  
  19.  
  20.                 _ElementFilterUserControl = new ElementFilterUserControl(exEvent);
  21.                 BitmapImage pb1Image = new BitmapImage(new Uri("pack://application:,,,/ElementFilter;component/Resources/icon.ico"));
  22.  
  23.                 Window.Content = _ElementFilterUserControl;
  24.                 Window.Icon = pb1Image;
  25.                 Window.Title = Util.ApplicationWindowTitle;
  26.                 Window.Height = Util.ApplicationWindowHeight;
  27.                 Window.Topmost = Util.IsApplicationWindowTopMost;
  28.                 Window.Width = Util.ApplicationWindowWidth;
  29.                 Window.WindowStartupLocation = WindowStartupLocation.CenterScreen;
  30.                 Window.Show();
  31.  
  32.                 Window.Closed += OnClosing;
  33.                 App.ElementFilterButton.Enabled = false;
  34.  
  35.  
  36.             }
  37.         }
  38.  
метод ShowForm принимает параметр UIApplication uiapp, которые нигде дальше не используется, затем создается WPF, которая создает viewmodel итд. Получается, что во вьюмодел не передается никак параметр UIApplication uiapp и не понятно как тогда добраться до UIApplication. Пока что вышел из положения создав статический Класс - помощник, который инициализируется при создании приложения и содержит в себе поля:
Код - C# [Выбрать]
  1.    
  2.     static class AppInfoProvider
  3.     {
  4.         public static UIApplication Uiapp { get; private set; }
  5.         public static UIDocument Uidoc { get; private set; }
  6.         public static Application App { get; private set; }
  7.         public static Document Doc { get; private set; }
  8.  
  9.         public static void Initialise(ExternalCommandData commandData)
  10.         {
  11.             Uiapp = commandData.Application;
  12.             Uidoc = Uiapp.ActiveUIDocument;
  13.             App = Uiapp.Application;
  14.             Doc = Uidoc.Document;
  15.         }
  16.     }
  17.  
Вопрос как правильно эти параметры пробросить в Model
« Последнее редактирование: 16-02-2019, 13:07:40 от А.Balm »

Отмечено как Решение А.Balm 17-02-2019, 12:04:30

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: WPF шаблон
« Ответ #1 : 16-02-2019, 12:53:35 »
Во-первых - правильно отформатируйте ваше сообщение. В редакторе есть выпадающий список с указанием на каком языке вы прикладываете код
Во-вторых - ИМХО: использование шаблонов - это плохая идея. В большинстве случаев шаблон содержит такой код, который просто удобнее и понятнее автору шаблона. В 90% случаев в этих шаблонах куча всякого ненужного барахла.

Реализовать паттерн mvvm в приложении под Ревит вполне легко. Типа того:
1. Создаете класс вьюмодел с конструктором, который принимает UIApplication:
Код - C# [Выбрать]
  1. public class MainViewModel
  2. {
  3.     private readonly UIApplication _uiApplication;
  4.  
  5.     public MainViewModel()
  6.     {
  7.        
  8.     }
  9.  
  10.     public MainViewModel(UIApplication uiApplication)
  11.     {
  12.         _uiApplication = uiApplication;
  13.     }
  14. }

Конструктор без параметров оставляете, чтобы в xaml редакторе окну (ну не форма, блин, а окно! отвратный шаблон) указать вьюмодель - чтобы редактор подхватывал публичные свойства при привязке. Но это не обязательно в общем, просто удобно

2. В методе Execute вашей команды пишите типа того:
Код - C# [Выбрать]
  1. var mainWindow = new MainWindow();
  2. var viewModel = new MainViewModel(uiApplication);
  3. mainWindow.DataContext = viewModel;
  4. mainWindow.ShowDialog();

Вот и все! И вспомогательные классы не нужны и 90% того мусора, который представлен в шаблоне

Оффлайн А.BalmАвтор темы

  • ADN OPEN
  • Сообщений: 9
  • Карма: 0
Re: WPF шаблон
« Ответ #2 : 16-02-2019, 22:50:33 »
2. В методе Execute вашей команды пишите типа того:
Код - C# [Выбрать]
var mainWindow = new MainWindow();
var viewModel = new MainViewModel(uiApplication);
mainWindow.DataContext = viewModel;
mainWindow.ShowDialog();

Вот и все! И вспомогательные классы не нужны и 90% того мусора, который представлен в шаблоне

Действительно так намного проще! Единственное что не пойму почему в проект dll нельзя добавить нормальное окно WPF, а только UserControl. В тестовом проекте сменил ему базовый класс на Windows. Если так поступить это не вызовет проблем в проекте?

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: WPF шаблон
« Ответ #3 : 16-02-2019, 22:53:47 »
Действительно так намного проще! Единственное что не пойму почему в проект dll нельзя добавить нормальное окно WPF, а только UserControl
Это причуды Visual Studio. Если вы изначально создадите проект "WPF приложение", то сможете добавлять окна. Но если создаете библиотеку классов, то почему-то только UserControl

Если так поступить это не вызовет проблем в проекте?
Нет, не вызовет