列表框 contextMenu 子项单击
Posted
技术标签:
【中文标题】列表框 contextMenu 子项单击【英文标题】:ListBox contextMenu SubItem Click 【发布时间】:2018-06-25 03:21:56 【问题描述】:我有ListBox
和ContextMenu
,我已将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
事件,但它不起作用。
例子:
<MenuItem Header="Copia" Click="MessagesLbCopySubMi_Click" />
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弹出菜单,那怎么获取这个子项的数据呢?