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

本文关键字:绑定 命令 菜单项 按钮 为什么 | 更新日期: 2023-09-27 18:33:27

考虑以下带有菜单和按钮的示例:

<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>

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

这是怎么回事,有什么办法可以解决这个问题吗?


编辑:我确实发现了这个问题 ->启用的WPF路由命令适用于菜单,但不适用于按钮<- 但这不适合这种情况。按钮不应是键盘可聚焦的,将其设置为对焦范围可使其可聚焦。我无法绑定源,因为实际源需要由键盘焦点控制。

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

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

有关详细信息,请参阅使用 WPF 按钮复制和粘贴命令。

编辑:

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

WPF 路由命令启用适用于菜单,但不适用于按钮

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

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

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