Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF BackgroundWorker已完成从sub usercontrol到MainWindow的更新_Wpf - Fatal编程技术网

WPF BackgroundWorker已完成从sub usercontrol到MainWindow的更新

WPF BackgroundWorker已完成从sub usercontrol到MainWindow的更新,wpf,Wpf,我的主窗口中有一个动态加载的UserControl。此用户控件通过调用BackgroundWorker执行任务。完成后,我必须通知主窗口。当worker完成时,它在内部usercontrol中进入workercompleted函数,但是如何让外部用户控件知道这一点 在我的例子中,当工人启动时,我禁用了一个按钮。我必须在工作程序完成时启用它,但不知道如何传播该事件。因此,当BackgroundWorker完成时,您会引发另一个UserControl级别的事件,然后您可以在主窗口中观察到 e、 g

我的主窗口中有一个动态加载的
UserControl
。此用户控件通过调用
BackgroundWorker
执行任务。完成后,我必须通知主窗口。当worker完成时,它在内部usercontrol中进入workercompleted函数,但是如何让外部用户控件知道这一点


在我的例子中,当工人启动时,我禁用了一个按钮。我必须在工作程序完成时启用它,但不知道如何传播该事件。因此,当BackgroundWorker完成时,您会引发另一个UserControl级别的事件,然后您可以在主窗口中观察到

e、 g

然后您可以使用:

MyUserControl.BackgroundWorkerCompleted += delegate { EnableButton(); };
在您的窗口中。

您可以使用它。然后引发一个路由事件,它将在可视化树中冒泡,并可以在父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);

你能给我举个这样做的例子吗
AddHandler(MyUserControl.OperationCompletedEvent, OnUserControlOperationCompleted);