2017-01-11 33 views
1

我試圖尋找解決這個問題的一段時間,但沒有發現解決了我的問題。如何使UI線程中的事件偵聽器偵聽來自第一個線程的另一個UI線程中的事件?

我有兩個UI線程,窗口A和窗口B,在一個單一的實例應用程序,其中B是創建和啓動A.當我嘗試添加一個事件監聽器在A監聽B是否可見或不,我在System.Threading.Tasks.dll中得到了一個N​​ullReferenceException,註釋「對象引用未設置爲對象的一個​​實例,」。我試圖使用調度程序沒有任何運氣。這是一個模擬了我的代碼(這兩個類都在同一個命名空間):

public partial class A : Window 
{ 
    private B _b; 
    private Thread _bThread; 
    private Dispatcher _bDispatcher; 

    public A() 
    { 
     InitializeComponent(); 

     _bThread = new Thread(() => 
     { 
      try 
      { 
       _bDispatcher = Dispatcher.CurrentDispatcher; 
       _b = new B(); 
       Dispatcher.Run(); 
      } 
      catch (Exception ex) 
      { 
       Logger.Log(ex.message); 
      } 
     }); 
     _bThread.SetApartmentState(ApartmentState.STA); 
     _bThread.Start(); 

     _b.VisibleChanged+= _b_VisibleChanged; // <= if this line is removed the program can start, but with this line I get the exception and the program crasches.. 
    } 

    private void _b_VisibleChanged(object sender, EventArgs e) 
    { 
     // change margin values on A.. 
    } 
} 



public partial class B : Window 
{ 

    private static EventHandlerList Events = new EventHandlerList(); 
    private static readonly object EventVisibleChanged = new object(); 

    public B() 
    { 
     InitializeComponent(); 
     // other stuff 
    } 

    private void Window_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) 
    { 
     TriggerOnVisibleChanged(); 
    } 

    #region Triggers 

    private void TriggerOnVisibleChanged() 
    { 
     ((EventHandler<EventArgs>)Events[EventVisibleChanged])?.Invoke(this, null); 
    } 

    #endregion 

    #region Event add/remove handlers 

    public event EventHandler<EventArgs> VisibleChanged 
    { 
     add 
     { 
      Events.AddHandler(EventVisibleChanged, value); 
     } 
     remove 
     { 
      Events.RemoveHandler(EventVisibleChanged, value); 
     } 
    } 

    #endregion 
} 

我不知道我做錯了,我不知道如何使這項工作,可以有人幫忙我?

PS。這是wpf,而不是Forms .. DS。

PS2。我知道我不必創建自己的事件並觸發,並可以在窗口B中使用IsVisibleChanged事件,但我已經嘗試過使用相同的結果.DS。

回答

0

我不相信你想要什麼,因爲WPF使用一個遵循線程相關性的'公寓'模型,即線程不能相互交互。

此外,您可能會更緊張地陷入這個陷阱......正如它在文章中所說:「具有線程親和力的WPF對象派生自Dispatcher對象。」

See here for more information on threading in WPF

編輯:爲什麼它在多線程?也許你正在尋找的是RoutedEventHandler(在子窗口中定義)...看到this SO post for an example

+0

我之所以這樣做是因爲它是一個更大的系統的一部分,需要我擁有它多線程,所以我有點卡在這個問題。然而,我會研究你在編輯中建議的內容,看看它是否可行。感謝您的答案=) – Philip

相關問題