У меня есть необходимость отображать два элемента управления WPF за один раз в отдельных окнах при запуске. Родительские окна одного типа, а пользовательские элементы управления (и родительское окно) определяются в отдельной сборке, на которую ссылается только проект-хозяин. Я использую Caliburn.Micro как структуру MVVM и Ninject для IoC. Как это может быть сделано?Показывать два окна WPF одновременно с помощью Caliburn.Micro
Все модели представлений основаны на PropertyChangedBase. У меня есть уже настройки AppBootstrapper для определения стандартных привязок Caliburn.Micro, такие как WindowManager:
_kernel.Bind<IControl1>().To<Control1ViewModel>().InSingletonScope();
_kernel.Bind<IControl2>().To<Control2ViewModel>().InSingletonScope();
_kernel.Bind<IParentWindow>().To<ParentWindowViewModel>();
и создали переопределение для OnStartup, который создал Control1:
DisplayRootViewFor<IWindow1>();
пользовательский элемент управления подается к родителю окно в ContentControl в контексте окна, как это:
<ContentControl x:Name="WindowView"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
cal:View.Context="{Binding ViewContext}"
cal:View.Model="{Binding WindowContent}" />
Наконец, я также предоставил переопределение SelectAssemblies, так что Caliburn.Micro может найти точку и ViewModels в библиотеке DLL:
protected override IEnumerable<Assembly> SelectAssemblies()
{
var assemblies = base.SelectAssemblies().ToList();
assemblies.Add(typeof(IControl1).GetTypeInfo().Assembly);
return assemblies;
}
Я пытался несколько возможных решений, ни один из которых работал:
Откройте window2 из конструктора ViewModel Window1 (с использованием WindowManager. Витрина). Однако это только открыло Window2 и никогда не открывало Window1. Вероятно, это не очень хорошая идея.
Создайте одно окно в AppBootstrapper.OnStartup и в другом окне с помощью App.xaml StartupUri, однако это не позволило мне включить элемент управления пользователя в родительское окно общего типа. Все, что я мог сделать, это открыть пустое родительское окно.
Вызов DisplayRootViewFor() для интерфейса для открытия каждого окна при запуске. Проблема с этим заключается в том, что нет способа установить содержимое окна, поэтому вы не получите настраиваемое родительское окно, просто окно по умолчанию, предоставленное Caliburn.Micro.