2011-12-16 3 views
4

바로 가기에 문제가있어 도움이나 팁을 많이 주시면 감사하겠습니다. 목표 : 앱에서 수정자를 사용하거나 사용하지 않는 단축키를 처리 할 수 ​​있어야합니다. 예를 들어, 'CTR + a'뿐만 아니라 'a'키도 처리해야합니다. 하지만 컨트롤을 이러한 키를 처리하는 경우에만 처리 ​​할 싶어요. 예를 들어, TextBox 클래스는 'Ctrl + C'등과 같은 일부 명령을 포함하여 대부분의 키를 사용하므로 TextBox에서 처리 할 때 이러한 이벤트를 가로 채고 싶지 않습니다.바로 가기 및 키보드 이벤트를 올바르게 처리하는 방법은 무엇입니까?

Command를 사용하여 KeyUp에 이벤트를 연결하려고 시도했지만 TextBox에서 키를 사용하기 전에 키를 가로 채기 명령을했지만 TextBox에서 키를 사용한 경우에도 KeyDown이 Window 수준으로 버블되었습니다! 자식 컨트롤에 의해 처리되지 않는 키를 얻기 위해 내 윈도우를 얻으려면 어떻게해야합니까? 아래 코드는 저에게 맞지 않습니다. 또한 여러 컨트롤이 있기 때문에 차라리 "적절한"솔루션이 있습니다. 즉, 창에서 컨트롤의 각 인스턴스에 핸들러를 연결하지 않습니다.

그리고

<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"를 누르면 텍스트 상자에 내가 텍스트 만 이동에 '시간'을 원하는 경우에도 명령을 트리거에 대한 상자. 또한, 내 텍스트 상자, 모든 숫자 키를 누르면 KeyUp 이벤트를 발생, 비록 내가 이해할 수있는, 텍스트 상자를 처리 했어야 그 사실!

도움 주셔서 감사합니다.

+0

+1 이것은 정말 WPF 초보자를위한 참조가 될 수있는 유용한 질문입니다. –

답변

1

야, PreviewKeydown 및 PreviewKeyup Event가 터널링 효과를 발생시키기 때문에 여기에서 keyup 이벤트 대신 previewKeyDown 또는 PreviewKeyUp 이벤트를 사용해야한다고 생각합니다. 이벤트를 발생시킨 컨트롤의 RootParent에서 시작한 이벤트가 버블 링 효과의 반대 위치에 생성됩니다. 원래 이벤트를 시작한 컨트롤 (원래 소스라고도 함)). 버블 링 효과를 통해 발생하는 이벤트를 사용하는 대신이 터널링 효과를 활용하여 이벤트를 처리 할 수 ​​있습니다. 또 다른 한가지는 PreviewKeyDown과 PrevieKeyup 이벤트가 keydown 이벤트가 발생하기 전에 시작된 이벤트입니다. 이렇게하면 가장 깨끗한 방법으로 이벤트를 가로 챌 수 있습니다.

또 다른 것은이 이벤트를 발생시킬 수있는 컨트롤을 선택할 수 있도록 이벤트의 원본 소스를 확인해야한다고 생각합니다. 여기

내가이 작은 방법으로 도움을 줄 수 희망 샘플 코드

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; 
    } 
} 

입니다. 감사합니다.

2

미리보기 이벤트 유형을 사용하여 조사해야합니다. 다른 컨트롤이 이벤트를 처리하기 전에 이러한 이벤트가 발생합니다. 그런 다음 이벤트의 거품을 멈추고 싶습니다. 나는 당신이 e.Handled로 올바르게하고 있다고 믿습니다.

이 조사 : http://msdn.microsoft.com/en-us/library/system.windows.input.keyboard.previewkeydown.aspx

당신이 원하는 것을 위해 XAML에서 그것을 할 방법을 잘하지 않습니다. Expression 블렌드 라이브러리는 이벤트 명령을 생성하는 데 매우 유용합니다. 여기를 참조하십시오 : http://jacokarsten.wordpress.com/2009/03/27/applying-command-binding-to-any-control-and-any-event/

+1

Dessus는 여기에 요점이 있습니다. 친구에게 +1 –

+0

코드 숨김과 대비하여 명령을 계속 사용하는 것이 좋습니다. – Dessus

관련 문제