Как использовать Dispatcher или BackroundWorker с пользовательским элементом управления StatusBar в WPF - PullRequest
1 голос
/ 22 декабря 2011

В моем приложении я реализовал пользовательский контроль состояния строки состояния.Он имеет ProgressBar, StatusTextBox и т. Д. Другие модули могут получить экземпляр этого класса с MEF и связать свои данные в его элементах с помощью методов и свойств.Проблема в том, что вид моего состояния обновляется только после завершения какой-либо операции.Вот пример кода:

[ImportingConstructor]
public IconManagerModel(IStatusBar statusBar)
{
    StatusBar = statusBar;
}

public void SomeMethod()
{    
    for(...)
    {
        //I tried to use Dispatcher but it didn't help. View updates after method has finished
        Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Normal,  
            delegate()
            {
                StatusBar.SetProgress(amountComleted,total)
            }
        );

        // ...
    }
}

Спасибо

Ответы [ 2 ]

1 голос
/ 22 декабря 2011

Вы хотите запустить SomeMethod() в другом потоке, а затем перезвонить на Dispatcher, чтобы обновить прогресс.Действительно, если пользовательский индикатор выполнения подключен к какому-либо элементу пользовательского интерфейса, реализация должна обработать обратный вызов в потоке пользовательского интерфейса.

Возможно, вы захотите что-то вроде:

public IconManagerModel(IStatusBar statusBar)
{
    StatusBar = statusBar;

    var thread = new Thread(new ThreadStart(SomeMethod));
    thread.Start();
}

SomeMethod() теперь будет работать в другом потоке, поэтому, если вы обновите прогресс в потоке пользовательского интерфейса, вы должны увидеть желаемые результаты.

0 голосов
/ 22 декабря 2011

Чтобы добавить к приведенному выше ответу slade , я бы также предложил использовать DispatcherPriority.Render, если вы хотите, чтобы насос сообщений обрабатывал сообщение немедленно. Поиграйте с Invoke (синхронно) и BeginInvoke (асинхронно). Первый из них немедленно запустит обновление, однако заблокирует вашу обработку. Последний будет обновляться, когда насос сообщений свободен и обычно рекомендуется.

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

...