2011-02-08 61 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);