当多个控件想要使用同样的ContextMenu时,使用Style来设置肯定是更加简便的方法。
但在WPF中,倘若直接在Style中定义ContextMenu时,会出现错误:
定义代码:
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu>
<MenuItem Header="全选"/>
<MenuItem Header="全不选"/>
<Separator />
<MenuItem Header="删除" Click="removeRight_Button_Click" />
<<Separator />
<MenuItem Header="清空" Click="clear_Button_Click" />
</ContextMenu>
</Setter.Value>
</Setter>
报错:
System.Windows.Markup.XamlParseException:““设置 connectionId 时引发了异常。”,行号为“156”,行位置为“42”。” 内部异常 InvalidCastException: 无法将类型为“System.Windows.Controls.MenuItem”的对象强制转换为类型“System.Windows.Controls.TabItem”。
经过仔细检查发现,给MenuItem关联了事件处理器,就无法通过编译,直接报错。
但总不能真的真的去每个控件都写一个ContextMenu吧……
好在绝大多数问题都有人已经发现过了,在不存在的网站上一搜索,轻松找到解决问题的方式——将ContextMenu当做资源,然后再调用:
<ContextMenu x:Key="ListBox_ContextMenu">
<MenuItem Header="全选"/>
<MenuItem Header="全不选"/>
<Separator />
<MenuItem Header="删除" Click="removeRight_Button_Click" />
<Separator />
<MenuItem Header="清空" Click="clear_Button_Click" />
</ContextMenu>
<Style TargetType="ListBox">
<Setter Property="ContextMenu" Value="{StaticResource ListBox_ContextMenu}"/>
</Style>
原帖链接: