【发布时间】:2015-11-12 11:23:43
【问题描述】:
如果问题很容易回答,我深表歉意,但我是 WPF 新手。
我有一个有 2 行的网格。第一行将包含菜单,第二行设置其内容以响应菜单项单击。
为简单起见,让我们假设我有 2 个菜单项和 2 个用户控件。
这是示例场景:
程序开始时,只显示菜单,第二个网格行是空的。
用户选择第一个菜单项 -> 第二个网格行现在应该包含第一个用户控件。
现在用户选择了第二个菜单项,所以第二行应该包含第二个用户控件(而之前的内容被删除)。
问题:
实现这一目标的正确方法是什么?
到目前为止我做了什么:
我已将 ContentControl 放置在第二个网格行中,并在单击菜单项时更改其 Content(以下是小代码示例)。
XAML:
<Window x:Class="ZonaA.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:testUserControl="clr-namespace:ZonaA"
Title="Zona A"
Height="350" Width="525"
WindowStartupLocation="CenterScreen">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Menu Grid.Row="0">
<MenuItem Header="First user control" Click="C1" />
<MenuItem Header="Second user control" Click=C2" />
</Menu>
<ContentControl Name="windowContent" Content="" HorizontalAlignment="Stretch" Grid.Row="1" VerticalAlignment="Stretch"/>
</Grid>
后面的代码:
private void C1(object sender, RoutedEventArgs e)
{
windowContent.Content = new myUserControl1();
}
private void C2(object sender, RoutedEventArgs e)
{
windowContent.Content = new myUserControl2();
}
【问题讨论】:
-
如果您选择在后面使用代码并且最容易理解和修改,那么您的方法完全可以。
-
@NirajDoshi:谢谢。我很难相信没有像
Grid.Row[0] = something这样的东西可以让我的任务更轻松...... -
欢迎来到来自 Winforms 的 Wpf 世界(我假设)。当您可以编辑内容时,它为您提供了更大的灵活性。因为如果您以后计划向网格添加/删除行,则需要手动重构网格的 RowIndexes。这只是优势之一。根据具体情况还有更多。