В чтении статьи Shawn Wildermuth Потоки WPF: Создайте Больше Быстро реагирующих Приложений С Диспетчером .
я приехал через следующее, которое указывает, что можно использовать Второстепенного Рабочего точно так же, как Вы могли в WindowsForms. Предположите что:
BackgroundWorker Теперь, когда у Вас есть смысл того, как Диспетчер работает, Вы могли бы быть удивлены знать, что Вы не найдете использование для него в большинстве случаев. В Windows Forms 2.0 Microsoft представила класс для обработки потока неUI для упрощения модели разработки для разработчиков пользовательского интерфейса. Этот класс называют BackgroundWorker. Рисунок 7 показывает типичное использование класса BackgroundWorker.
рисунок 7 Используя BackgroundWorker в WPF
BackgroundWorker _backgroundWorker = new BackgroundWorker(); ... // Set up the Background Worker Events _backgroundWorker.DoWork += _backgroundWorker_DoWork; backgroundWorker.RunWorkerCompleted += _backgroundWorker_RunWorkerCompleted; // Run the Background Worker _backgroundWorker.RunWorkerAsync(5000); ... // Worker Method void _backgroundWorker_DoWork(object sender, DoWorkEventArgs e) { // Do something } // Completed Method void _backgroundWorker_RunWorkerCompleted( object sender, RunWorkerCompletedEventArgs e) { if (e.Cancelled) { statusText.Text = "Cancelled"; } else if (e.Error != null) { statusText.Text = "Exception Thrown"; } else { statusText.Text = "Completed"; } }
компонент BackgroundWorker работает хорошо с WPF, потому что под покрытиями он использует класс AsyncOperationManager, который в свою очередь использует класс SynchronizationContext для контакта с синхронизацией. В Windows Forms, AsyncOperationManager руки прочь от класса WindowsFormsSynchronizationContext, который происходит из класса SynchronizationContext. Аналогично, в ASP.NET это работает с другой деривацией SynchronizationContext по имени AspNetSynchronizationContext. Эти SynchronizationContext-производные-классы знают, как обработать синхронизацию перекрестного потока вызова метода.
В WPF, эта модель расширяется с помощью класса DispatcherSynchronizationContext. При помощи BackgroundWorker Диспетчер нанимается автоматически для вызова вызовов метода перекрестного потока. Хорошие новости - то, что, так как Вы, вероятно, уже знакомы с этим общим шаблоном, можно продолжить использовать BackgroundWorker в новых проектах WPF.
Чтобы иметь возможность изменять режим отображения, используемый для каждого экземпляра, я бы сделал это примерно так:
UserControl
с 3 TextBlock
s для отображения трех частей имени. Вышеупомянутое требует привязки для каждой части имени, поэтому один из способов упростить это - создать единственное свойство для UserControl
типа NameData
объявлена как структура со свойствами First
, Middle
и Last
. Тогда вы по-прежнему можете использовать одно MultiBinding
для этого свойства. Разница будет в том, что ваш NameConverter
возьмет 3 части и вернет новую структуру NameData
вместо форматированной строки.
<NameTextBlock NameData="{DynamicResource CustomerFullNameBinding}" NameDisplayMode="LastNameFirst" />
<NameTextBlock NameData="{DynamicResource CustomerFullNameBinding}" NameDisplayMode="FirstNameFirst" />
<NameTextBlock NameData="{DynamicResource CustomerFullNameBinding}" NameDisplayMode="Initials" />
<!-- and so on... -->
Идея состоит в том, чтобы отделить форматирование от данных.
Часть, которая спровоцировала сбой, объявляла один MultiBinding
как ресурс. Как правило,