我有一个ListView
,我想设置一个上下文菜单,我不仅可以在点击某些列中的某些文字但是ListViewItem
上的任何位置时打开这样做我以为我只是使用样式设置器设置我的ContextMenu
,因为我无法直接访问ListViewItem
。
不幸的是,当您尝试这样做时,它将无法编译:
<Style TargetType="ListViewItem">
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu>
<MenuItem Header="Header" Click="Handler"/>
...
</ContextMenu>
</Setter.Value>
</Setter>
</Style>
错误102'处理程序'无效。 '点击'不是一个事件 'System.Windows.Controls.GridView'。
我认为您可以通过EventSetter
- Click
事件使用EventSetters
来避免这种情况。但很明显,代码会从您需要的所有包装标签中充分膨胀。
我的问题是,是否有一些解决方法,因此您无需处理{{1}}。
修改:有关为何发生此错误的说明,请参阅this question。
答案 0 :(得分:10)
您可以将ContextMenu
放在ListView
的资源中,然后将其用作静态资源,这样您就不必使用MenuItem
'的样式小号
<ListView ...>
<ListView.Resources>
<ContextMenu x:Key="listViewContextMenu">
<MenuItem Header="Header" Click="MenuItem_Click"/>
</ContextMenu>
</ListView.Resources>
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="ContextMenu" Value="{StaticResource listViewContextMenu}"/>
</Style>
</ListView.ItemContainerStyle>
<!--...-->
</ListView>
答案 1 :(得分:0)
您可以ListBoxItem.HorizontalContentAlignment
到Stretch
,然后将ContextMenu
放入ListBox.ItemTemplate
。这是一个例子:
<Grid>
<Grid.Resources>
<PointCollection x:Key="sampleData">
<Point X="10" Y="20"/>
<Point X="30" Y="40"/>
</PointCollection>
</Grid.Resources>
<ListBox Width="100" ItemsSource="{StaticResource sampleData}">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<Grid Background="Red">
<Grid.ContextMenu>
<ContextMenu>
<MenuItem Header="Test" Click="MenuItem_Click"/>
</ContextMenu>
</Grid.ContextMenu>
<TextBlock Text="{Binding}"/>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>