Текущая ситуацияПоказать BusyIndicator при инициализации элементы управления UserControl (WPF + MVVM + DataTemplate приложений)
Я использую следующий подход для решения View для согласования ViewModel. (Упрощенный)
<Window.Resources>
<ResourceDictionary>
<DataTemplate DataType="{x:Type local:DemoVm2}">
<local:DemoViewTwo />
</DataTemplate>
<DataTemplate DataType="{x:Type local:DemoVm}">
<local:DemoView />
</DataTemplate>
</ResourceDictionary>
</Window.Resources>
<DockPanel LastChildFill="True">
<Button Content="Switch To VmOne" Click="ButtonBase_OnClick"></Button>
<Button Content="Switch To VmTwo" Click="ButtonBase_OnClick2"></Button>
<ContentPresenter Content="{Binding CurrentContent}" />
</DockPanel>
Взгляды получить автоматически разрешаться WPF после переключения ViewModel внутри ContentPresenter.
При использовании сложного вида, который может занять 2-4 секунды для инициализации, я хочу отобразить BusyIndicator. Они занимают до 2-4 секунд из-за количества визуальных данных NOT.
Проблема
Я не знаю, когда View-х завершили процесс инициализации/загрузки, потому что имеют доступ только к текущей ViewModel.
Мой подход
Моя идея в том, чтобы присоединить поведение к каждому UserControl, который может установить логическое значение к их присоединенной ViewModel (IsBusy = ложь) после InitializeComponent() обработанную или обрабатывать их LoadedEvent. Это свойство может быть привязано к BusyIndicator в другом месте.
Я не очень доволен этим решением, потому что мне нужно будет приложить это поведение к каждому отдельному Usercontrol/view.
У кого-нибудь есть другое решение для такого рода проблем? Наверное, я не единственный, кто хочет скрыть процесс загрузки графического интерфейса пользователя?
Я недавно натолкнулся на эту тему http://blogs.msdn.com/b/dwayneneed/archive/2007/04/26/multithreaded-ui-hostvisual.aspx. Но так как это с 2007 года, могут быть лучшие/более удобные способы достижения моей цели?
Кто-то меня исправит, если я ошибаюсь, но, думаю, вы находитесь в плохом месте. Индикатор занятости должен запускаться в потоке пользовательского интерфейса, но контроль инициализации также выполняется в потоке пользовательского интерфейса. Я не думаю, что ваш индикатор занятости обновится в течение от 2 до 4 секунд, чтобы инициализировать ваше представление. –
Я не знаю, как ребята DevExpress справились с этим сценарием, но я видел, что их WPF LoadingDecorator делает что-то подобное. Он украшает каждый ChildControl, пока они загружаются. Реализация такого декоратора также будет работать, но я думаю, мне придется вставлять его в каждый Datatemplate. – KroaX
Альтернатива: http://stackoverflow.com/questions/3601125/wpf-tabcontrol-preventing-unload-on-tab-changeI У меня тоже была медленная проблема загрузки визуального дерева, но после перехода в кешированный ContentPresenter я очень доволен. – Peter