启动应用程序时,我想默认打开一个用户控件,但只显示空外壳视图。
遵循通常的Caliburn模式并在ShellViewModel构造函数中使用SimpleContainer,一切都可以正常执行,但看不到激活的VM。
壳视图模型
public class ShellViewModel : Conductor<object>, IHandle<NewLayoutCreatedEvent>
{
private readonly SimpleContainer _container;
private readonly IEventAggregator _events;
private readonly IWindowManager _manager;
public ShellViewModel(IEventAggregator events, IWindowManager manager, SimpleContainer container)
{
_events = events;
_events.Subscribe(this);
_manager = manager;
_container = container;
ActivateItem(_container.GetInstance<WorkLayoutViewModel>());
}
}
WorkLayoutViewModel 继承自 Screen。在 Bootstrapper 类中,在运行 WorkLayoutViewModel 的构造函数后发生的情况:
protected override object GetInstance(Type service, string key)
{
return _container.GetInstance(service, key);
}
使用空键和服务调用一次 = ShellViewModel 然后继续:
protected override IEnumerable<object> GetAllInstances(Type service)
{
return _container.GetAllInstances(service);
}
其中再次服务ShellViewModel,它在ShellView类中运行InitializeComponent()。 在此之后跳转到:
protected override void OnStartup(object sender, StartupEventArgs e)
{
DisplayRootViewFor<ShellViewModel>();
}
其中发送者是应用程序本身,没有参数。在此之后,应用程序类OnStartup()覆盖调用了我正在设置语言和调用基础的地方。OnStartup()
我相信 GetAllInstances 也应该调用 WorkLayoutViewModel,而不仅仅是 ShellViewModel,这不会发生,视图也不会显示。
根据要求,ShellView:
<Window x:Class="MyApp.Views.ShellView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:MyApp.Views"
xmlns:lang="clr-namespace:MyApp.Language;assembly=MyApp.Language"
xmlns:interact="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:cal="http://www.caliburnproject.org"
mc:Ignorable="d"
Title="{x:Static lang:Resources.AppName}" Height="800" Width="1000" WindowStartupLocation="CenterScreen">
<DockPanel>
<StackPanel DockPanel.Dock="Top">
<Menu FontSize="14" Height="27">
<Menu.ItemsPanel>
<ItemsPanelTemplate>
<DockPanel HorizontalAlignment="Stretch" />
</ItemsPanelTemplate>
</Menu.ItemsPanel>
<MenuItem Header="{x:Static lang:Resources.Mnu_File}" HorizontalAlignment="Left">
<MenuItem Header="{x:Static lang:Resources.Mnu_New}">
<MenuItem.Icon>
<Image Source="/Images/new.png" />
</MenuItem.Icon>
<interact:Interaction.Triggers>
<interact:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="NewLayout"/>
</interact:EventTrigger>
</interact:Interaction.Triggers>
</MenuItem>
</MenuItem>
</Menu>
<ToolBar Height="36">
<Button ToolTip="{x:Static lang:Resources.Tip_New}">
<Image Source="/Images/new.png" />
<interact:Interaction.Triggers>
<interact:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="NewLayout"/>
</interact:EventTrigger>
</interact:Interaction.Triggers>
</Button>
</ToolBar>
</StackPanel>
<Grid>
<ContentControl x:Name="ActivateItem" Margin="10 5 10 10" />
</Grid>
</DockPanel>
</Window>
而WorkLayoutView只是一个标准的用户控件,带有红色背景。
您在窗口中的ContentControl
可能应该被称为ActiveItem
而不是ActivateItem
。ActiveateItem
是设置ActiveItem
属性的方法。