2016-08-03 26 views
2

我得到了一個WPF UserPanel這樣設置的一些鍵盤快捷鍵:鍵盤快捷方式並不總是觸發一個WPF用戶控件

<UserControl.../> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="KeyDown"> 
      <mvvm:EventToCommand Command="{Binding Mode=OneWay, Path=CheckShortcutsCommand}" PassEventArgsToCommand="True" /> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
... 

它在全球的工作excep,如果重點是在控制的CheckShortcutsCommand命令只調用的UserControl。

所以如果我點擊一個文本框或usercontrol的列表框並敲擊鍵盤鍵,它將觸發命令。 如果我點擊usercontrol背景,它不會觸發它。

這是預期的行爲?即使沒有控制集中(如果我點擊背景並按下一個鍵),我怎樣才能觸發命令?

提前

回答

2

這就是鍵盤焦點工作的方式。如果你真正想要的是讓鍵盤綁定工作,而不管窗口中的哪些控件是關注的,那麼你需要把它們放在窗口中。

<Window.InputBindings> 

    <KeyBinding Modifiers="Ctrl" Key="C" Command="{Binding CheckShortcutsCommand}" /> 

    <!-- More KeyBindings and MouseBindings here --> 

</Window.InputBindings> 

如果i:Interaction.Triggers真的是你所需要的做,你會做,只是因爲你擁有了它 - 但在Window,而不是UserControl

如果您嘗試使用UserControl作爲將打包的命令組添加到任意窗口的手段,那是一個很好的想法,它是可行的,但這是在WPF中執行它的錯誤方法。

你可以寫這需要一個UserControl引用一個靜態方法,「通過VisualTreeHelper的頂層父,並會將所有UserControl的」發現UserControl的輸入綁定到頂級父。然後你會在UserControlLoaded事件中調用該方法。做一個基類,你可以敲出十幾個不同的「命令包」UserControls。

你也可以寫一個attached property,增加了一組命令到窗口的InputBindings

<Window 
    ...etc.... 
    myProps:AddFooBarCommands="True" 
    ...etc.... 
    > 
    ...etc.... 
+0

非常感謝埃德!將KeyBinding代碼切換到窗口完美的技巧。 :) –

0

THX可能不是最強大的解決方案,但如果你的用戶控件的背景是「點擊」你可以將焦點放到該控件之一的它的內部,使得該鍵盤快捷方式工作?