簡體   English   中英

如何正確處理快捷方式和鍵盤事件?

[英]How to handle shortcuts and keyboard events properly?

快捷方式有問題,任何幫助/提示將不勝感激! 目標:我需要能夠在我的應用程序中處理帶有和不帶修飾符的快捷鍵。 因此,例如我需要處理鍵'a'以及'CTR + a'。 但是,只有在沒有控件處理這些鍵時我才想處理它們。 例如,TextBox類占用大多數鍵,包括一些命令,如“Ctrl + C”等,所以當TextBox處理它們時我不想攔截這些事件。

我嘗試使用命令以及將事件附加到KeyUp到窗口,但是,命令在TextBox有機會查看它們之前攔截鍵,KeyDown氣泡到Window級別,即使TextBox使用了鍵! 如何讓我的窗口獲取任何子控件未處理的鍵? 請參閱下面的代碼,該代碼對我不起作用。 此外,由於我有許多不同的控件,我寧願有一個“正確”的解決方案:我寧願不在我的窗口中將控制器附加到控件的每個實例。

<Window x:Class="KeyTest.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.CommandBindings>
    <CommandBinding Command="Help"
                    CanExecute="HelpCanExecute"
                    Executed="HelpExecuted" />
</Window.CommandBindings>

<Window.InputBindings>
    <KeyBinding Command="Help" Key="H" />
</Window.InputBindings>

<Grid>
    <WrapPanel>
        <TextBox Name="myLOG" Width="300" Height="200" Background="LightBlue" />
        <TextBox Name="myINPUT" Width="300" Height="200" />
        <Button Content="JUST FOR FUN" />
    </WrapPanel>
</Grid>

對於C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace KeyTest
{
   /// <summary>
   /// Interaction logic for MainWindow.xaml
   /// </summary>
   public partial class MainWindow : Window
   {
      private void HelpCanExecute(object sender, CanExecuteRoutedEventArgs e)
      {
         myLOG.Text += "HELP CAN EXECUTE\n";
         e.CanExecute = true;
         e.Handled = true;
      }

      private void HelpExecuted(object sender, ExecutedRoutedEventArgs e)
      {
         myLOG.Text += "HELP  EXECUTED!!!\n";
         e.Handled = true;
      }

      public void myKeyUpHandler(Object sender, KeyEventArgs args)
      {
         myLOG.Text += "KEY UP EVENT! " + args.Key + "\n";
      }

      public MainWindow()
      {
         InitializeComponent();
         this.KeyUp += new KeyEventHandler(myKeyUpHandler);
      }
   }
}

當焦點位於文本框中時,按“h”會觸發該命令,即使我希望“h”僅轉到文本框。 此外,當在文本框內時,按任意字母數字鍵會觸發KeyUp事件,即使據我所知,文本框應該處理= true該事件!

感謝幫助!

您需要使用預覽事件類型進行調查。 它們發生在其他控件將處理事件之前。 然后你想停止冒泡的事件。 我相信你正在用e.Handled正確地做到這一點。

調查此: http//msdn.microsoft.com/en-us/library/system.windows.input.keyboard.previewkeydown.aspx

不知道如何在xaml中為你想做的事做。 表達式混合庫對於從事件中生成命令非常有用。 見這里: http//jacokarsten.wordpress.com/2009/03/27/applying-command-binding-to-any-control-and-any-event/

Dude我認為你需要在這里使用previewKeyDown或PreviewKeyUp事件而不是keyup事件,因為PreviewKeydown和PreviewKeyup事件會產生隧道效應(冒泡效果的OPPOSITE,其中事件從觸發事件的控件的RootParent開始觸發控制哪個最初解雇事件(也稱為原始來源))。 您可以利用此隧道效果來處理事件,而不是使用通過冒泡效果觸發的事件。 另一件事是在keydown事件發生之前觸發的PreviewKeyDown和PrevieKeyup事件。 這可以讓你以最干凈的方式攔截事件。

另外,我認為您需要檢查事件的原始來源,以便您可以選擇可能觸發此事件的控件。

這是一個示例代碼

 public void nameOfCotrol_PreviewKeyDown(object sender, RoutedEventArgs e)
 {
    if((e.OriginalSource as Control).Name == "NameOfControls That would be allowed to fire the event")
    {
        You're stuff to be done here
    }
    else
    {
        e.handled = true;
     }
 }

我希望這可以在很小的方面提供幫助。 謝謝

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM