窗口中的CommandBinding无法捕获来自ContextMenu的命令执行

4

一个非常简单和直接的例子。

我有一个窗口。它设置了CommandBindings,以捕获RoutedUICommand的执行。

<Window
   ...
   >
   <Window.CommandBinding>
       <CommandBinding 
           Command="{x:Static local:Commands.Command1}"  
           Executed="OnCommand1Executed" 
           CanExecute="OnCanCommand1Execute" 
           />
   </Window.CommandBinding>
</Window>

窗口中托管了一个UserControl,在其中声明了一个ContextMenu。ContextMenu的一个项将Command属性分配给相同的RoutedUICommand。

<ContextMenu>
    <MenuItem Command="{x:Static local:Commands.Command1}" />
</ContextMenu>

但是菜单项仍然无法使用(==禁用)。某种方式下命令执行不会传递到窗口。也许是因为ContextMenu在弹出窗口内部?
如果我将所需的CommandBinding添加到ContextMenu.CommandBindings集合中,则一切正常。但这是一个糟糕的选择,因为没有单个“全局”CommandBinding的位置。
如何以最佳方式解决问题?
更新:事实证明情况并不那么糟糕。只有在用户第一次打开菜单时才会绑定命令。如果关闭并重新打开,则一切正常。尽管如此,这似乎并不理想,是一种相当奇怪的行为。
2个回答

4

如果在Windows构造函数中的InitializeComponent();后面添加Focus();,这个问题是否仍会出现?

这听起来像是WPF在上下文菜单中无法找到可视树的问题。将焦点设置到主窗口可能会解决它。


恰如其分地给予赞扬,我认为这是我第一次看到这个解决方法的地方:http://cebla5.spaces.live.com/blog/cns!1B8262ED00250003!206.entry?wa=wsignin1.0&sa=834175698 - Trent F Guidry
请参考https://dev59.com/mFfUa4cB1Zd3GeqPHmV3#6070771获取另一种解决方法。在我看来,这是更好的方法——仅使用XAML,不依赖于焦点的副作用——但它确实有一个缺点,在XAML编辑器中会导致虚假的“对象引用未设置为对象的实例”错误消息(只在编辑器中...代码仍然可以编译和运行)。如果我能找到修复该错误的方法,我会说这个替代方案是100%可取的。 - Peter Duniho

1

在用户控件中,我们如何处理这个问题?似乎在那种情况下焦点不起作用。

更新:我在这里找到了解决方案 如何为ContextMenu内的MenuItem设置CommandTarget?

似乎与CommandTarget有关。

<MenuItem x:Name="mnuProperties" Header="_Properties"
          Command="{x:Static localcommands:TaskCommands.ViewTaskProperties}"
          CommandTarget="{Binding PlacementTarget,
          RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type ContextMenu}}}"/>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接