Использование ссылки на главное окно из статического класса - Хорошая практика? - PullRequest
2 голосов
/ 24 января 2011

У меня есть приложение WPF с основным классом Window, которое называется MainWindow.Поскольку у меня есть другие классы, которым требуется доступ к Dispatcher потока пользовательского интерфейса для обновления ограниченных списков, я нашел это решение:

Я создал статический класс:

 static class UI 
    {
        static public MainWindow window;
    }

И добавил следующеестрока в конструкторе приложения:

 public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            UI.window = this;
...

Теперь я могу получить доступ к компонентам моего GUI везде, используя UI.window.Dispatcher.Invoke().

Вопрос в том, является ли это хорошей практикой программирования?Есть ли лучший способ сделать это?

Спасибо

Обновление:

Кажется, я получаю исключение только при обновлении ObservableCollectionкоторый связан с контролем третьей стороны.У меня есть еще один статический OC, связанный со списком (для отображения обновленных сообщений), и я могу обновить его из других потоков без использования диспетчера.Как так?Это потому что это статический OC или он связан с управлением?

Ответы [ 3 ]

4 голосов
/ 24 января 2011

В случае general это не идеально - у static есть некоторые ошибки, если вы ожидаете, что потоки будут независимы, или если вы ожидаете, что сборщик мусора соберет окно - но, возможно, вы, вероятно, можетеуйдите с этим для вас главное окно, так как оно, вероятно, по сути одноэлементное и длится время жизни приложения.

Лично я бы, наверное, не стал бы - я бы передал его черезсвойство или аргумент конструктора - но я немного суетливый.

4 голосов
/ 24 января 2011

Поскольку у меня есть другие классы, которым требуется доступ к Dispatcher потока пользовательского интерфейса для обновления ограниченных списков

Лично, если вам это нужно, я просто сохраню ссылку на Dispatcher, а не на весь пользовательский интерфейс.

Предоставление ссылки на само окно может потенциально привести к путанице.Намерение здесь не так ясно.

2 голосов
/ 24 января 2011

Если речь идет только о диспетчере, вы можете сделать это

Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, (Action)delegate()
    {
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...