4

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

我有一个窗户。它设置了 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:事实证明它并没有那么糟糕。命令不仅在用户第一次打开菜单时绑定。如果它关闭并重新打开一切都很好。尽管如此,这似乎是不可取的,而且是一种非常奇怪的行为。

4

2 回答 2

4

如果添加 Focus(); 是否仍然会发生这种情况?在 InitializeComponent() 之后;在 Windows 构造函数中?

这听起来像 WPF 在从上下文菜单中查找可视化树时遇到问题。将焦点设置到主窗口可能会修复它。

于 2009-06-07T19:55:17.210 回答
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}}}"/>
于 2009-08-22T16:19:09.347 回答