一个非常简单明了的例子。
我有一个窗口。它将CommandBindings设置为捕获RoutedUICommand执行。
<Window
...
>
<Window.CommandBinding>
<CommandBinding
Command="{x:Static local:Commands.Command1}"
Executed="OnCommand1Executed"
CanExecute="OnCanCommand1Execute"
/>
</Window.CommandBinding>
</Window>
在窗口中托管了一个UserControl,其中声明了ContextMenu。 ContextMenu项具有分配给相同RoutedUICommand的Command属性。
<ContextMenu>
<MenuItem Command="{x:Static local:Commands.Command1}" />
</ContextMenu>
但菜单项保持不活动状态(==禁用)。不知何故,命令执行没有进入窗口。也许是因为ContextMenu在弹出窗口内?
如果我将所需的CommandBinding添加到ContextMenu.CommandBindings集合中,一切正常。但是,如果没有一个“全局”CommandBinding的地方,这是一个可怕的选择。
如何以最佳方式解决问题?
UPD:原来并没有那么糟糕。仅在第一次用户打开菜单时,命令才会绑定。如果关闭并重新打开,一切都很好。不过,这似乎是不可取的,也是一种非常奇怪的行为。答案 0 :(得分:4)
如果添加Focus(),是否仍会发生这种情况;就在InitializeComponent()之后;在windows构造函数中?
这听起来像WPF在从上下文菜单中找到可视树时遇到问题。将焦点设置到主窗口可能会修复它。
答案 1 :(得分:1)
我们如何在用户控件中处理此问题?似乎焦点在那种情况下不起作用
更新:我在How to set CommandTarget for MenuItem inside a ContextMenu?
找到了解决方案似乎它与CommandTarget
有关<MenuItem x:Name="mnuProperties" Header="_Properties"
Command="{x:Static localcommands:TaskCommands.ViewTaskProperties}"
CommandTarget="{Binding PlacementTarget,
RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type ContextMenu}}}"/>