2011-02-08 63 views
0

我的主窗口中有一個動態加載UserControl。此UserControl通過調用BackgroundWorker來執行任務。完成後,我必須通知MainWindow。當工作人員完成時,它會在內部用戶控件中輸入workercompleted函數,但是如何讓外部用戶控件知道這一點?WPF BackgroundWorker完成從子用戶控件更新到MainWindow

就我而言,我在工人啓動時禁用了一個按鈕。我必須啓用它,當工人完成但不知道如何

回答

0

您可以傳播事件。因此,當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(); }; 

在自己的窗口。

+0

你能舉個例子去做這個 – Aks 2011-02-08 10:03:37

0

您可以使用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);