上下文菜单仅适用于列表框中的项目?

时间:2020-07-02 08:25:10

标签: c# wpf

如何仅激活列表框中的项目的上下文菜单?

以下内容将在整个列表框中调用上下文菜单:

<ListBox Name="lBoxTest">
     <ListBox.ContextMenu>
           <ContextMenu>
                <MenuItem Name="btnTest" Header="Test" Click="btnTest_Click"/>
           </ContextMenu>
     </ListBox.ContextMenu>
</ListBox>

2 个答案:

答案 0 :(得分:1)

您可以使用ItemsContainerStyle:

<ListBox>
   <ListBox.ItemContainerStyle>
       <Style TargetType="ListBoxItem">
            <Setter Property="ContextMenu">
                <Setter.Value>
                    <ContextMenu>
                         <MenuItem Name="btnTest" Header="Test" />
                     </ContextMenu>
                </Setter.Value>
            </Setter>
        </Style>
  </ListBox.ItemContainerStyle>
        
</ListBox>

答案 1 :(得分:1)

通常的方法是以项目容器样式设置上下文菜单。

<ListBox Name="lBoxTest">
    <ListBox.ItemContainerStyle>
        <Style TargetType="{x:Type ListBoxItem}">
            <Setter Property="ContextMenu">
                <Setter.Value>
                    <ContextMenu>
                        <MenuItem Name="btnTest"
                                  Header="Test"
                                  Click="btnTest_Click"/>
                    </ContextMenu>
                </Setter.Value>
            </Setter>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>

但是,由于bug in WPF with code-behind,这可能不起作用。由于将事件处理程序设置为setter值而发生。您可以通过为上下文菜单声明一个单独的资源并使用StaticResource进行引用来缓解此问题。

<ListBox Name="lBoxTest">
    <ListBox.Resources>
        <ContextMenu x:Key="ContextMenu">
            <MenuItem Name="btnTest"
                      Header="Test"
                      Click="MenuItem_OnClick"/>
        </ContextMenu>
    </ListBox.Resources>
    <ListBox.ItemContainerStyle>
        <Style TargetType="{x:Type ListBoxItem}">
            <Setter Property="ContextMenu"
                    Value="{StaticResource ContextMenu}"/>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>