我試圖尋找解決這個問題的一段時間,但沒有發現解決了我的問題。如何使UI線程中的事件偵聽器偵聽來自第一個線程的另一個UI線程中的事件?
我有兩個UI線程,窗口A和窗口B,在一個單一的實例應用程序,其中B是創建和啓動A.當我嘗試添加一個事件監聽器在A監聽B是否可見或不,我在System.Threading.Tasks.dll中得到了一個NullReferenceException,註釋「對象引用未設置爲對象的一個實例,」。我試圖使用調度程序沒有任何運氣。這是一個模擬了我的代碼(這兩個類都在同一個命名空間):
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。
我之所以這樣做是因爲它是一個更大的系統的一部分,需要我擁有它多線程,所以我有點卡在這個問題。然而,我會研究你在編輯中建議的內容,看看它是否可行。感謝您的答案=) – Philip