为什么命令绑定到按钮的行为与命令绑定菜单项的行为不同?

时间:2013-10-01 22:10:02

标签: c# wpf routed-commands

使用菜单和按钮考虑以下示例:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
  <DockPanel>
    <Menu DockPanel.Dock="Top">
      <MenuItem Header="Paste" Command="ApplicationCommands.Paste" />
    </Menu>
    <Button Command="ApplicationCommands.Paste">Paste</Button>
    <TextBox>Content</TextBox>
    <TextBox>Content2</TextBox>
  </DockPanel>
</Window>

当我将键盘焦点放在其中一个文本框中时,TextBox声明它可以处理ApplicationCommands.Paste,因此我希望按钮和菜单项能够自行启用。我得到的是菜单项自动启用,而按钮不启用。 (该按钮似乎没有“聆听”TextBox'CommandBinding

这里发生了什么,有什么方法可以解决这个问题吗?


编辑:我确实发现了这个问题 - &gt; WPF routed command enabling works with menu but not with a button&lt; - 但在这种情况下这不合适。该按钮不应该是键盘可对焦的,将其设置为对焦范围使其可以聚焦。我无法绑定源,因为实际的源需要通过键盘焦点来控制。

1 个答案:

答案 0 :(得分:1)

看起来您不能以这种方式使用按钮的Command属性,除非它包含在工具栏中。我得到的结果与xaml相同,但我会定期使用相同的代码将此命令分配给工具栏中的按钮。

有关详细信息,请参阅Copy and paste commands with WPF buttons

修改

你是对的。它与FocusScope有关,有两种方法可以修复它,如下所示:

WPF routed command enabling works with menu but not with a button

您可以在按钮上设置FocusManager.IsFocusScope

<Button Command="ApplicationCommands.Paste" FocusManager.IsFocusScope="True">Paste</Button>

或者,您可以设置按钮的命令目标,但这只适用于一个文本框。