2013-12-03 5 views
-3

Раньше это был адский контроль пользовательского интерфейса из другого потока в MFC и WinForm. Я действительно ненавидел это.Нет больше пользовательского интерфейса в WPF?

В WPF все еще боль, но гораздо меньше: при использовании MVVM и привязок к данным все, что мне нужно сделать, это обновить VM, либо сформировать поток пользовательского интерфейса, либо мой фоновый поток. Я почти управляю элементами управления пользовательского интерфейса в своих потоках. Конечно, синхронизация потоков по-прежнему остается вопросом, но не более проблем с потоком пользовательского интерфейса.

Я случайно понял это сейчас, но мне было интересно: я прав? что я пропустил?

Благодаря

+4

-1, плохой вопрос, вернуться, когда вы нашли конкретный вопрос :) –

+0

Если типы реализации INotifyPropertyChanged , да. DependencyProperties, ObservableCollections , no. – Will

ответ

1

Вы также можете получить доступ ко всем элементам пользовательского интерфейса с помощью Диспетчера окна из другого потока:

windowObj.Dispatcher.Invoke(DispatcherPriority.Normal, (Action)delegate() 
{ 
    // Do some changes on the window, like changing textbox content, ... 
    // TextBox1.Text = "test"; 
}); 

В WPF это намного проще синхронизировать различные темы, как вы сказали, MVVM - отличный шаг вперед в этом отношении.

1

Каждое взаимодействие с пользовательским интерфейсом должно происходить в потоке пользовательского интерфейса. Так, в принципе, этот код не будет работать:

public class Context 
{ 
    public Context() 
    { 
     Items = new ObservableCollection<string>(); 

     Task.Factory.StartNew(() => 
     { 
      for (var i = 0; i < 10; i++) 
      { 
       Thread.Sleep(1000); 

       Items.Add("Test item"))); 
      } 
     }); 
    } 

    public ObservableCollection<string> Items { get; set; } 
} 

И это один будет:

public class Context 
{ 
    public Context(Dispatcher dispatcher) 
    { 
     Items = new ObservableCollection<string>(); 

     Task.Factory.StartNew(() => 
     { 
      for (var i = 0; i < 10; i++) 
      { 
       Thread.Sleep(1000); 

       dispatcher.BeginInvoke(new Action(() => Items.Add("Test item"))); 
      } 
     }); 
    } 

    public ObservableCollection<string> Items { get; set; } 
} 
Смежные вопросы