2013-10-01 50 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在這種減少的情況下工作,但不是一般情況。此外,它使按鈕可以用鍵盤調焦,這在這裏是不可取的。 –