当多个控件想要使用同样的ContextMenu时,使用Style来设置肯定是更加简便的方法。
    但在WPF中,倘若直接在Style中定义ContextMenu时,会出现错误:
    定义代码:

    1. <Setter Property="ContextMenu">
    2. <Setter.Value>
    3. <ContextMenu>
    4. <MenuItem Header="全选"/>
    5. <MenuItem Header="全不选"/>
    6. <Separator />
    7. <MenuItem Header="删除" Click="removeRight_Button_Click" />
    8. <<Separator />
    9. <MenuItem Header="清空" Click="clear_Button_Click" />
    10. </ContextMenu>
    11. </Setter.Value>
    12. </Setter>

    报错:

    System.Windows.Markup.XamlParseException:““设置 connectionId 时引发了异常。”,行号为“156”,行位置为“42”。” 内部异常 InvalidCastException: 无法将类型为“System.Windows.Controls.MenuItem”的对象强制转换为类型“System.Windows.Controls.TabItem”。

    经过仔细检查发现,给MenuItem关联了事件处理器,就无法通过编译,直接报错。
    但总不能真的真的去每个控件都写一个ContextMenu吧……
    好在绝大多数问题都有人已经发现过了,在不存在的网站上一搜索,轻松找到解决问题的方式——将ContextMenu当做资源,然后再调用:

    1. <ContextMenu x:Key="ListBox_ContextMenu">
    2. <MenuItem Header="全选"/>
    3. <MenuItem Header="全不选"/>
    4. <Separator />
    5. <MenuItem Header="删除" Click="removeRight_Button_Click" />
    6. <Separator />
    7. <MenuItem Header="清空" Click="clear_Button_Click" />
    8. </ContextMenu>
    9. <Style TargetType="ListBox">
    10. <Setter Property="ContextMenu" Value="{StaticResource ListBox_ContextMenu}"/>
    11. </Style>

    原帖链接: