【问题标题】:How can I add a context menu for an entire row of a WPF grid?如何为 WPF 网格的整行添加上下文菜单?
【发布时间】:2018-03-02 13:53:27
【问题描述】:

我在 WPF 网格(不是数据网格)中有一些控件。我想为整行网格添加上下文菜单。我尝试将上下文菜单添加到 RowDefinition ,但这似乎不起作用。我还尝试在整行上添加边框或矩形,背景设置为透明,并在其上添加上下文菜单。这可行,但我无法与它背后的控件进行交互。

这是我的示例 XAML:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>
    <Label Grid.Row="0" Grid.Column="0" Content="Some Property" />
    <TextBox Grid.Row="0" Grid.Column="1" Text="Actual" />
    <TextBox Grid.Row="0" Grid.Column="2" Text="Setpoint" />
    <Button Grid.Row="0" Grid.Column="3" Content="Set" />
    <Label Grid.Row="1" Grid.Column="0" Content="Another Property" />
    <TextBox Grid.Row="1" Grid.Column="1" Text="Actual" />
    <TextBox Grid.Row="1" Grid.Column="2" Text="Setpoint" />
    <Button Grid.Row="1" Grid.Column="3" Content="Set" />
</Grid>

【问题讨论】:

  • 是否也应该为行中的项目显示上下文菜单?喜欢 TextBox 吗?通常 TextBox 有它自己的 ContextMenu
  • @NawedNabiZada 是的,我想为行中的所有项目覆盖任何现有的 ContextMenus。

标签: .net wpf xaml


【解决方案1】:

您可以将上下文菜单设为静态:

<Grid>
    <Grid.Resources>
       <ContextMenu x:Key="MyContext">
          <MenuItem Header="Test"/>
          <MenuItem Header="Test 1"/>
          <MenuItem Header="Test 2"/>
       </ContextMenu>
    </Grid.Resources>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>

    //Extra border added
    <Border Grid.Column="0" Grid.ColumnSpan="4" Background="Transparent" ContextMenu="{StaticResource MyContext}"/>

    // ContextMenu="{StaticResource MyContext}" added
    <Label Grid.Row="0" Grid.Column="0" Content="Some Property" ContextMenu="{StaticResource MyContext}"/>

    // ContextMenu="{StaticResource MyContext}" added
    <TextBox Grid.Row="0" Grid.Column="1" Text="Actual" ContextMenu="{StaticResource MyContext}"/>

    // ContextMenu="{StaticResource MyContext}" added
    <TextBox Grid.Row="0" Grid.Column="2" Text="Setpoint" ContextMenu="{StaticResource MyContext}"/>

    // ContextMenu="{StaticResource MyContext}" added
    <Button Grid.Row="0" Grid.Column="3" Content="Set" ContextMenu="{StaticResource MyContext}"/>
    <Label Grid.Row="1" Grid.Column="0" Content="Another Property" />
    <TextBox Grid.Row="1" Grid.Column="1" Text="Actual" />
    <TextBox Grid.Row="1" Grid.Column="2" Text="Setpoint" />
    <Button Grid.Row="1" Grid.Column="3" Content="Set" />
</Grid>

我还添加了一个额外的边框来覆盖该行的其余部分。

【讨论】:

  • 很好的解决方案,但我宁愿只为透明边框注册 PreviewMouseDownEvent。无需将菜单绑定到任何元素。这是覆盖托管控件上下文菜单的最可靠方法。
猜你喜欢
  • 2011-03-18
  • 2013-05-25
  • 1970-01-01
  • 2011-02-11
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多