我想要一个用于ListBoxItems的上下文菜单。 所以我创造了这个:
<ListBox Name="listBoxName">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding UserName}" />
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu>
<MenuItem Header="View" Name="MenuItemView" />
</ContextMenu>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
这很有效。我有所有项目的contextmenu,但是如果我想在menuitem中添加click-eventhandler,就像这样:
<MenuItem Header="View" Name="MenuItemView" Click="MenuItemView_Click" />
创建窗口时出现XamlParseException。
的InnerException: Object System.Windows.Controls.MenuItem无法转换为System.Windows.Controls.Grid类型
如果我添加一个事件处理程序,它只抛出异常。事件方法是空的。
编辑: InnerException的Stacktrace:
在 Chat_Client.ChatWindow.System.Windows.Markup.IComponentConnector.Connect(的Int32 connectionId,Object target)in C:\ XXX \ Chat_Client \ ChatWindow.xaml:行 19。
在 MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetConnectionId(对象 root,Int32 connectionId,Object 实例)
EDIT2: 现在我必须得到我用contextmenu点击的对象。首先我试过这个:
//MenuItem s = sender as MenuItem;
//ContextMenu cm = s.Parent as ContextMenu;
//Popup pu = cm.Parent as Popup;
//object o = pu.Parent;
但是Popup的父级是null。 然后我只是从ListBox中获取selectedItem。这有效,但是没有办法获得所点击的Contextmenu的ListBoxRow吗?
答案 0 :(得分:4)
我无法使用VS2010和WPF4重现您的崩溃。
您只需要为所有项目设置一个上下文菜单,以便将其提取到窗口资源,例如:
<Window.Resources>
<ContextMenu x:Key="ListBoxItemContextMenu">
<MenuItem Header="View" Name="MenuItemView" Click="MenuItemView_Click"/>
</ContextMenu>
</Window.Resources>
然后更改您的setter以引用该上下文菜单:
<Setter Property="ContextMenu" Value="{StaticResource ListBoxItemContextMenu}"/>
然后事件处理程序工作:
private void MenuItemView_Click(object sender, RoutedEventArgs e)
{
Debug.WriteLine("Clicked!");
}