2012-10-10 51 views
1

我在使用KeyBindings的xaml中聲明瞭鍵盤快捷鍵。 我想忽略由於少數關鍵持有人的重複。忽略KeyBinding中的重複(只保存一次key - execute命令)

我發現只有使用事件和檢查「IsRepetition」的解決方案,它不適合我的鍵綁定聲明。

當然,我可以在Command定義本身中進行測量,並測量2個最後執行的時間差,但這無法區分多個按鍵和1個按鍵。

只有在第一次按下時才執行的最好方法是什麼,如果按住按鍵則忽略其餘部分?

回答

1

您正試圖改變按鈕的行爲。更好地使用代碼。 最簡單的方法是將一個預覽事件附加到窗口那樣:

<Window 
     ... 
      PreviewKeyDown="HandlePreviewKeyDown"> 

然後在代碼中處理它這樣:

private void HandlePreviewKeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.IsRepeat) 
     { 
      e.Handled = true; 
     } 
    } 

可悲的是,這將禁用任何重複的行爲,即使是在一個文本框由表單託管。這是個有趣的問題。如果我找到一個更優雅的方式來做這件事,我會增加答案。

編輯:

確定有兩種方法來定義鍵綁定。

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


    <Window.InputBindings> 
     <KeyBinding x:Name="altD" Gesture="Alt+D" Command="{Binding ClickCommand}"/> 
    </Window.InputBindings> 

    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition/> 
      <RowDefinition/> 
     </Grid.RowDefinitions> 
      <Button Content="_Click" Command="{Binding ClickCommand}" /> 
     <TextBox Grid.Row="1"/> 
    </Grid> 
</Window> 

以上按鈕將產生一個點擊,因爲你通過隱含的下劃線要求Alt + C鍵手勢:_Click內容。然後該窗口有一個明確的鍵綁定到Alt + D。

這後面的代碼現在應該爲這兩種情況下工作,不應該定期重複的干擾:

protected override void OnPreviewKeyDown(KeyEventArgs e) 
    { 
     base.OnPreviewKeyDown(e); 

     if (e.IsRepeat) 
     { 
      if (((KeyGesture)altD.Gesture).Matches(this, e)) 
      { 
       e.Handled = true; 
      } 
      else if (e.Key == Key.System) 
      { 
       string sysKey = e.SystemKey.ToString(); 
       //We only care about a single character here: _{character} 
       if (sysKey.Length == 1 && AccessKeyManager.IsKeyRegistered(null, sysKey)) 
       { 
        e.Handled = true; 
       } 
      } 
     } 
    } 
+0

謝謝。不過,我想這種行爲只爲幾個命令,而不是所有的鍵盤輸入:( –

+0

我更新了答案 – user195275

+0

我會試試看,謝謝 –