2011-09-19 21 views
2

正如標題中所述,我們試圖截取一個密鑰並將其替換爲另一個密鑰。認爲類似於關鍵重新映射。在WPF密鑰處理程序中,我可以通過編程更改/覆蓋按下的密鑰嗎?

我們的具體用法是將左右箭頭鍵分別改爲Shift-Tab和Tab。

現在我知道我可以攔截這些並手動控制焦點,但我試圖儘可能多地利用內置的導航行爲。我們只想(也)使用這種類型的行爲的箭頭鍵。

我能想到的唯一的事情就是吞嚥事件,然後用正確的參數重新拋出,但我很擔心,這將有類似的事情鍵釋放干擾,重複等

我如果這種做法實際上不可行,也可以採取其他方式來做到這一點。再次,我們的目標是利用內置的行爲,只需通過其他鍵。

+0

不知道是否可以更改事件以指示不同的鍵;但您應該能夠將事件標記爲「處理」,然後使用重新映射的關鍵點創建一個新事件。 – EtherDragon

+0

是的,這就是我上面所說的,但我擔心的是,通過將其標記爲「已處理」,我可能會失去其他內容,例如發佈,重複等。猜測是時候讓測試應用程序了! – MarqueIV

+0

與其嘗試重新映射鍵,爲什麼不將鍵綁定到與「Tab」和「Shift-Tab」組合綁定的任何命令? –

回答

3

由於您的目標是映射箭頭鍵來執行某些鍵盤選項卡導航,因此您應該將相應的命令映射到鍵並實施它們。 ComponentCommands.MoveFocusForwardComponentCommands.MoveFocusBack命令在這裏是合適的,因爲這正是我們正在做的,將焦點轉移到下一個或回到先前的控制。

下面是一個例子,你可以做到這一切。

首先,您需要將命令綁定到您的密鑰。

<Window.CommandBindings> 
    <CommandBinding Command="ComponentCommands.MoveFocusForward" Executed="MoveFocusForward_Executed" /> 
    <CommandBinding Command="ComponentCommands.MoveFocusBack" Executed="MoveFocusBack_Executed" /> 
</Window.CommandBindings> 
<Window.InputBindings> 
    <KeyBinding Command="ComponentCommands.MoveFocusForward" Key="Right" /> 
    <KeyBinding Command="ComponentCommands.MoveFocusBack" Key="Left" /> 
</Window.InputBindings> 

然後執行處理程序。

private static bool RequestFocusChange(FocusNavigationDirection direction) 
{ 
    var focused = Keyboard.FocusedElement as UIElement; 
    if (focused != null) 
    { 
     return focused.MoveFocus(new TraversalRequest(direction)); 
    } 
    return false; 
} 

private void MoveFocusForward_Executed(object target, ExecutedRoutedEventArgs e) 
{ 
    RequestFocusChange(FocusNavigationDirection.Next); 
} 

private void MoveFocusBack_Executed(object target, ExecutedRoutedEventArgs e) 
{ 
    RequestFocusChange(FocusNavigationDirection.Previous); 
} 
+0

問題給你......我想知道爲什麼你甚至在第一時間添加了處理程序和命令綁定。不會簡單地設置InoutBinding做伎倆嗎? (在我們的代碼中,實際上是其他事情正在發生,所以我正在用您的代碼構建一個測試應用程序以找出問題,但如果這些是標準命令,標準控件是否不應該對它們進行本質響應? – MarqueIV

+0

至於I知道,預定義的命令只是提供一組標準命令來綁定的手段,沒有與它們相關的實現,你可以允許一個「Open」命令來做一些對你的應用程序有意義的事情,而不一定會引起一個FileOpenDialog(或其他預定義的行爲)。我知道你正在尋找那種預定義的行爲,但我擔心它不可用。 –

+0

我當然會贊同'開放'之類的東西,但是您提到的這些命令是已經存在的預定義行爲。換句話說,'Open'沒有上下文,除了以特定於應用程序的方式,但將焦點移到下一個控件不是特定於應用程序的事情,而是OS級別的事情,所以我不確定該聲明實際上是正確的,因爲再次,該行爲*已經實施。它是如何被調用的。必須有一種方法可以利用內置的行爲,而無需像這裏所做的那樣重新編寫它們的實現。 – MarqueIV

相關問題