我的主窗口中有一個動態加載UserControl
。此UserControl通過調用BackgroundWorker
來執行任務。完成後,我必須通知MainWindow。當工作人員完成時,它會在內部用戶控件中輸入workercompleted函數,但是如何讓外部用戶控件知道這一點?WPF BackgroundWorker完成從子用戶控件更新到MainWindow
就我而言,我在工人啓動時禁用了一個按鈕。我必須啓用它,當工人完成但不知道如何
我的主窗口中有一個動態加載UserControl
。此UserControl通過調用BackgroundWorker
來執行任務。完成後,我必須通知MainWindow。當工作人員完成時,它會在內部用戶控件中輸入workercompleted函數,但是如何讓外部用戶控件知道這一點?WPF BackgroundWorker完成從子用戶控件更新到MainWindow
就我而言,我在工人啓動時禁用了一個按鈕。我必須啓用它,當工人完成但不知道如何
您可以傳播事件。因此,當BackgroundWorker完成後,您將引發另一個處於UserControl級別的事件,然後您可以在主窗口中觀察該事件。
例如
partial class MyUserControl
{
private readonly BackgroundWorker bgWorker = new BackgroundWorker();
public event EventHandler BackgroundWorkerCompleted;
private void InitializeComponent()
{
...
bgWorker.RunWorkerCompleted += delegate { OnBackgroundWorkerCompleted(); };
}
private void OnBackgroundWorkerCompleted()
{
if (BackgroundWorkerCompleted != null)
{
BackgroundWorkerCompleted(this, null);
}
}
}
那麼你可以使用:
MyUserControl.BackgroundWorkerCompleted += delegate { EnableButton(); };
在自己的窗口。
您可以使用Routed Events。然後你發起一個路由事件,它會讓可視化樹形成泡泡,並且可以在父UI元素(比如你的窗口)中處理。
在用戶控件定義路由事件是這樣的:
public static readonly RoutedEvent OperationCompletedEvent = EventManager.RegisterRoutedEvent(
"OperationCompleted", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyUserControl));
public event RoutedEventHandler OperationCompleted
{
add { AddHandler(OperationCompletedEvent, value); }
remove { RemoveHandler(OperationCompletedEvent, value); }
}
當背景工人操作完成募集使用RaiseEvent
方法上的用戶控件的事件:
protected virtual OnOperationCompleted() {
RaiseEvent(new RoutedEventArgs(OperationCompletedEvent));
}
然後,訂閱這個事件在你的窗口中:
AddHandler(MyUserControl.OperationCompletedEvent, OnUserControlOperationCompleted);
你能舉個例子去做這個 – Aks 2011-02-08 10:03:37