我有一个简单的应用程序,其中有一个包含一些操作的主屏幕,以及第二个屏幕,您可以在第一个屏幕完成并按下按钮时访问该屏幕。见图片:
棕色区域是固定的左侧菜单,将始终出现在同一位置。 蓝色区域是从一个更改到另一个的屏幕。 红色区域正在尝试从 WindowsForms 模拟 MDIContainer。
如何将该容器模拟为:
维护左侧静态菜单
由于某些事件/动作而动态更改我的内容?
我有一个简单的应用程序,其中有一个包含一些操作的主屏幕,以及第二个屏幕,您可以在第一个屏幕完成并按下按钮时访问该屏幕。见图片:
棕色区域是固定的左侧菜单,将始终出现在同一位置。 蓝色区域是从一个更改到另一个的屏幕。 红色区域正在尝试从 WindowsForms 模拟 MDIContainer。
如何将该容器模拟为:
维护左侧静态菜单
由于某些事件/动作而动态更改我的内容?
最好的方法是首先使用网格控件来布置控件(如 Blam 建议的那样),如下所示:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<!-- Menu control. (Whichever you see fit. The menu could be established
within this control, or you could use a custom UserControl depending
on your needs.) -->
<StackPanel />
<!-- Content control -->
<ContentPresenter Name="ContentHolder"
Grid.Column="1" />
</Grid>
根据您的设计模式,有几种方法可以让您的内容按需要显示。
如果您使用的是 MVVM,则 ContentPresenter 控件可以绑定到主窗口数据上下文中的 ViewModel,如下所示:
<ContentPresenter Name="ContentHolder"
Grid.Column="1"
Content="{Binding ContentData}" />
您的 ViewModel 中将存在相应的属性,例如:
public ViewModelBase ContentData{
get { return _contentData; }
}
如果这对您来说很多希腊语,那么您可能没有使用 MVVM 作为您的设计模式。在这种情况下,主窗口类后面的代码可以处理使用事件处理程序设置 ContentPresenter 的内容。
您的事件处理程序的要点可能是这样的:
public void HandleNavigationChange(SwitchCondition sc){
UserControl newContent = null;
switch (sc) {
case SwitchCondition.NavigationItem1:
newContent = new NavigationItem1();
break;
case SwitchCondition.NavigationItem1:
newContent = new NavigationItem1();
break;
//ETC
}
ContentHolder.Content = newContent;
}
然后,您可以从菜单项单击中调用此方法,或者如果您愿意,可以从子控件中调用此方法。
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="2*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" Text="Static"/>
<ContentControl x:Name="content1" Grid.Row="0" Grid.Column="1" Visibility="Visible" >
<StackPanel>
<TextBlock Text="One" />
<Button Click="btn1_click" Content="Button1"/>
</StackPanel>
</ContentControl>
<ContentControl x:Name="content2" Grid.Row="0" Grid.Column="1" Visibility="Hidden" >
<StackPanel>
<TextBlock Text="Two" />
<Button Click="btn2_click" Content="Button2"/>
</StackPanel>
</ContentControl>
</Grid>
private void btn1_click(object sender, RoutedEventArgs e)
{
content1.Visibility = System.Windows.Visibility.Hidden;
content2.Visibility = System.Windows.Visibility.Visible;
}
private void btn2_click(object sender, RoutedEventArgs e)
{
content1.Visibility = System.Windows.Visibility.Visible;
content2.Visibility = System.Windows.Visibility.Hidden;
}
如果您可以将上面的按钮放在菜单区域中
可以使用 Frame 和 Page 内容做我动态的东西
这个示例显示将数据传递给 Page 构造函数
nextPage 是一个 Page
也可以是一个 UserControl
<Frame Name="SrchItemEditField" />
PageDocFieldDetail nextPage = new PageDocFieldDetail(df);
SrchItemEditField.Content = nextPage;