2013-10-01 118 views
2

考虑带有菜单和一个按钮下面的例子:为什么绑定到按钮的命令与绑定菜单项的命令有不同的行为?

<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 routed command enabling works with menu but not with a button < - 但这不适合在这种情况下。该按钮不应该是键盘可调焦的,并将其设置为焦点范围使其可以聚焦。我无法绑定源,因为实际源需要通过键盘焦点进行控制。

回答

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> 

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

+0

如果它在工具栏中工作,必须有ToolBar正在做的事情来实现这一点,这在其他地方可以轻松完成。 –

+0

设置IsFocusScope在这种减少的情况下工作,但不是一般情况。此外,它使按钮可以用键盘调焦,这在这里是不可取的。 –