【问题标题】:Change the content of the grid row更改网格行的内容
【发布时间】: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。这只是优势之一。根据具体情况还有更多。

标签: c# wpf xaml


【解决方案1】:

您可以使用Frame我认为这也可以完成工作here 是一个视频,他使用框架来切换内容,而您只是在第一页中没有放置任何内容。希望对你有帮助

【讨论】:

    【解决方案2】:

    我认为解决您的问题的最佳方法是使用 InteractionTriggers,这是一个示例。

    首先,如果你决定这样做,你需要在你的项目中添加以下引用:

    System.Windows.Interactivity

    Microsoft.Expression.Interactions

    这样做,是时候在 XAML 中声明它们以便使用它了:

        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
        xmlns:ie="http://schemas.microsoft.com/expression/2010/interactions"
    

    现在,如果这样说,您可以做所有您想做的事情,而无需在代码隐藏上写一行,如果您遵循 MVVM 模式,这非常好,就像您的 MenuItem 将是:

    <MenuItem Header="First user control">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="Click">
                        <ie:ChangePropertyAction TargetName="windowContent" PropertyName="Visibility" Value="Hidden"/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
    </MenuItem>
    

    基本上,您“分配”点击事件,并在触发事件时执行一些操作,在我们的例子中,我们将执行一个名为 ChangePropertyAction 的操作,它将 PropertyName="Visibility" 更改为控件“windowContent "(需要定义控件名称)到值“隐藏”。

    您只需根据您的情况调整此示例,您必须在 XAML 上声明两个 usersControls 才能更改它们的属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-05
      • 2021-10-27
      • 2019-06-06
      • 1970-01-01
      • 2017-12-28
      • 2017-08-07
      相关资源
      最近更新 更多