我的主窗口中有一个动态加载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