Обновление WPF BackgroundWorker завершено из субконтроля пользователя в MainWindow - PullRequest
0 голосов
/ 08 февраля 2011

У меня динамически загружается UserControl внутри моего главного окна.Этот UserControl выполняет задачу, вызывая BackgroundWorker.Когда это завершится, я должен уведомить MainWindow.Когда работник завершает работу, он входит в функцию workercompleted во внутренний usercontrol, но как я могу сообщить об этом внешнему пользовательскому элементу управления?

В моем случае я отключаю кнопку при запуске работника.Я должен включить его, когда работник завершает, но не знаю, как

Ответы [ 2 ]

0 голосов
/ 08 февраля 2011

Вы можете использовать Routed Events для этого. Затем вы поднимаете перенаправленное событие, оно всплывает в визуальном дереве и может обрабатываться в родительских элементах пользовательского интерфейса (например, в вашем окне).

В вашем пользовательском элементе управления определите перенаправленное событие следующим образом:

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);
0 голосов
/ 08 февраля 2011

Вы можете распространять событие.Поэтому, когда 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(); };

в вашем окне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...