2015-10-01 2 views
1

У меня есть необходимость отображать два элемента управления 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; 
} 

Я пытался несколько возможных решений, ни один из которых работал:

  1. Откройте window2 из конструктора ViewModel Window1 (с использованием WindowManager. Витрина). Однако это только открыло Window2 и никогда не открывало Window1. Вероятно, это не очень хорошая идея.

  2. Создайте одно окно в AppBootstrapper.OnStartup и в другом окне с помощью App.xaml StartupUri, однако это не позволило мне включить элемент управления пользователя в родительское окно общего типа. Все, что я мог сделать, это открыть пустое родительское окно.

  3. Вызов DisplayRootViewFor() для интерфейса для открытия каждого окна при запуске. Проблема с этим заключается в том, что нет способа установить содержимое окна, поэтому вы не получите настраиваемое родительское окно, просто окно по умолчанию, предоставленное Caliburn.Micro.

ответ

1

Вот как я это сделал:

В AppBootstrapper.cs, вместо вызова DisplayRootViewFor, создать экземпляр родительского окна первого:

var parentWindow = _kernel.Get<IParentWindow>(); 

Обеспечить контроль пользователя к родительский контекст окна:

parentWindow = _kernel.Get<IControl1>(); 

Открыть окно с помощью WindowManager.ShowWindow:

_kernel.Get<IWindowManager>().ShowWindow(parentWindow, null, windowSettings); 

Просто повторите процедуру для второго окна:

var window2 = _kernel.Get<IParentWindow>(); 
window2.WindowContent = _kernel.Get<IControl2>() ; 
_kernel.Get<IWindowManager>().ShowWindow(window2, null, windowSettings); 

Это создаст два окна, содержащее пользовательские элементы управления, определенные в внешних сборках, используя Caliburn.Micro в WPF.

Смежные вопросы