列表框 contextMenu 子项单击

Posted

技术标签:

【中文标题】列表框 contextMenu 子项单击【英文标题】:ListBox contextMenu SubItem Click 【发布时间】:2018-06-25 03:21:56 【问题描述】:

我有ListBoxContextMenu,我已将MenuItem 配置为仅在我单击所选项目时才起作用。

这是 XAML 代码:

<ListBox x:Name="MessagesLb" Grid.Column="1" Margin="241,100,22.4,50" Grid.Row="1" BorderThickness="0" FontSize="14" FontWeight="SemiBold" ItemsSource="Binding Items" SelectionMode="Extended">
            <ListBox.ItemContainerStyle>
                <Style TargetType="ListBoxItem">
                    <Setter Property="ContextMenu">
                        <Setter.Value>
                            <ContextMenu>
                                <MenuItem Header="Copia" Click="MessagesLbCopySubMi_Click" />
                                <Separator/>
                                <MenuItem Header="Dettagli" />
                            </ContextMenu>
                        </Setter.Value>
                    </Setter>
                    <Style.Triggers>
                        <DataTrigger Binding="Binding SelectedItems.Count, RelativeSource=RelativeSource AncestorType=x:Type ListBox" Value="0">
                            <Setter Property="ContextMenu" Value="x:Null" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </ListBox.ItemContainerStyle>
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="Binding" HorizontalAlignment="Center" VerticalAlignment="Center" />
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

我尝试在我的MenuItem 中添加Click 事件,但它不起作用。

例子:

&lt;MenuItem Header="Copia" Click="MessagesLbCopySubMi_Click" /&gt;
private void MessagesLbCopySubMi_Click(object sender, RoutedEventArgs e)

    MessageBox.Show("Click event done");

我该如何解决这个问题?

【问题讨论】:

"MenuItem 只有在我右键单击它时才能工作" - 你不需要这样的触发器。 ListBox 只会为实际项目创建ListBoxItem,当将上下文菜单分配给ListBoxItem 时,您已经满足此条件,即您必须右键单击ListBoxItem 才能查看上下文菜单。您可以为ListBox 本身分配另一个上下文菜单,然后会显示。 【参考方案1】:

ContextMenu 定义为资源:

<ListBox x:Name="MessagesLb" Grid.Column="1" Margin="241,100,22.4,50" Grid.Row="1" BorderThickness="0" FontSize="14" FontWeight="SemiBold" 
         ItemsSource="Binding Items" SelectionMode="Extended">
    <ListBox.Resources>
        <ContextMenu x:Key="cm">
            <MenuItem Header="Copia" Click="MessagesLbCopySubMi_Click" />
            <Separator/>
            <MenuItem Header="Dettagli" />
        </ContextMenu>
    </ListBox.Resources>
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="ContextMenu" Value="StaticResource cm" />
            <Style.Triggers>
                <DataTrigger Binding="Binding SelectedItems.Count, RelativeSource=RelativeSource AncestorType=x:Type ListBox" Value="0">
                    <Setter Property="ContextMenu" Value="x:Null" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ListBox.ItemContainerStyle>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="Binding" HorizontalAlignment="Center" VerticalAlignment="Center" />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

【讨论】:

你知道为什么 OP 代码不起作用吗?也就是他犯了什么错误? 他为什么要这么做?为什么什么都没有抱怨?我正在尝试他的代码,我可以给Click 事件处理程序(不存在的)任何名称,没有任何错误。我觉得这类似于将事件处理程序添加到字典中定义的样式......就像事件处理程序永远不会连接。 我的意思是我可以正常地为任何东西定义ContextMenu。是“样式中的上下文菜单”makes the problem 的组合吗?仍然很有趣的是为什么:为什么不可能,为什么没有错误。 当您直接在 setter 中定义 ContextMenu 内联时,XAML 处理器无法连接事件处理程序。解决方案是根据我的回答将 ContextMenu 定义为资源。 我试过你的解决方案,它有效,谢谢!从 winform 切换到 wpf 有其缺点..

以上是关于列表框 contextMenu 子项单击的主要内容,如果未能解决你的问题,请参考以下文章

在android中,当我按了listview中的一个子项时,利用ContextMenu弹出菜单,那怎么获取这个子项的数据呢?

无法更新子项列表框

单击子项后侧边菜单关闭

单击时如何仅更改离子列表中的一种离子项颜色?

防止在Winforms C#中右键单击文本框

Fragment 中 ListView绑定ContextMenu