wpf : onkeydown () wpf textbox에서 파생 된 컨트롤에서 공간 키를 요구하지 않음

StackOverflow https://stackoverflow.com/questions/1458748

  •  12-09-2019
  •  | 
  •  

문제

WPF 응용 프로그램에는 다음과 같은 텍스트 상자에서 파생 된 컨트롤이 있습니다.

public class SelectableTextBlock : TextBox
{
    protected override void OnKeyDown(KeyEventArgs e)
    {
        base.OnKeyDown(e);
        e.Handled = false;
    }
}

OnkeyDown 방법은 텍스트 상자에 공간을 입력하거나 백 스페이스를 칠 때 호출되지 않지만 일반 인쇄용 문자 (예 : 'A') 및 수정 자 키 (예 :)를 포함한 다른 입력에 대해 발사됩니다.

이 컨트롤을 ISREADONLY로 설정하여 TRUE로 설정하여 선택 가능하고 부탁 할 수없는 텍스트를 표시 할 수 있습니다. wpftoolkit의 DataGrid 내에서 사용 된 제어는 SelectableTxtBlock에 초점이 있어도 KeyDown 이벤트가 데이터 그리드를 전파하기를 원하기 때문에 사용자 정의 컨트롤을 사용하여 이벤트를 명시 적으로 처리하지 않은 것으로 표시하는 이유입니다.

문제는 이벤트가 특정 키를 제어 할조차하지 않는다는 것입니다. 데이터 그리드에 사용 된 다른 컨트롤이 Space Keydown 이벤트를 삼키기를 원하기 때문에 Datagrid에서 OnpreviewKeydown을 사용하여이를 해결할 수 없습니다.

우주 키에 대한 키 다운 이벤트를 어떻게 전파 할 수 있는지 아는 사람이 있습니까?

감사.

도움이 되었습니까?

해결책 2

문제는 공간 (및 백 스페이스 등) 키 다운 이벤트가 내 파생 된 컨트롤로 기포되기 전에 텍스트 상자 내에서 이미 처리되고있는 것 같습니다. Wim이 게시 한대로 텍스트 구성 프로세스의 일부로 가정합니다.

이 작업을 해결하기 위해 키 다운 이벤트를 이미 처리 한 핸들러를 추가하고 처리 된 멤버를 False로 설정하여 정상적으로 버블 링을 수행 할 수 있도록합니다. 아래의 예에서는 공간 키를 위해이 작업을 수행하지만 제 경우에는 이벤트를 수행해야합니다. 진짜 부모님이 아직 어떤 주요 이벤트가 관심을 가질 수 있는지 모르기 때문에 선택한 AbletextBlock에서 처리하고 싶지 않습니다.

public class SelectableTextBlock : TextBox
{
    public SelectableTextBlock() : base()
    {
        this.AddHandler(SelectableTextBlock.KeyDownEvent, new RoutedEventHandler(HandleHandledKeyDown), true);
    }

    public void HandleHandledKeyDown(object sender, RoutedEventArgs e)
    {
        KeyEventArgs ke = e as KeyEventArgs;
        if (ke.Key == Key.Space)
        {
            ke.Handled = false;
        }
    }
    ...
}

누군가 더 나은 해결책이 있다면 여전히 관심이 있습니다 ...

감사합니다, E.

다른 팁

PreviewKeydown 이벤트는 이런 종류의 것들에 대해 정확하게 존재합니다.

private void spacebarHandler_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Space)
        e.Handled = true;
}

키 다운 핸들러는 Spacebar의 키 다운 이벤트를받지 않습니다.

텍스트 상자에서 한 번 공백과 이벤트와 관련 하여이 문제가있었습니다. 공간 문자를 추가하거나 제거 할 때만 이벤트가 트리거되지 않습니까?

이것이 제가 답으로 얻은 것입니다 : (http://social.msdn.microsoft.com/forums/en-us/wpf/thread/446ec083-04c8-43f2-89dc-1e2521a31f6b)

일부 IMES는 텍스트 구성 프로세스의 일부로 공백 키 스트로크를 취급하기 때문에 Avalon이 TextInput 이벤트를 통해 올바른 복합 텍스트를보고하는 이유입니다.

나는 완전히 범위를 벗어날 수 있었지만이 스레드를 읽는 것은 내가 한 번 가지고있는 그 문제를 생각하게 만들었습니다.

친절한 안부, wim

TextBox에서 SAY, SONGICKKEYSTEXTBOX를 도출하십시오.

public class RestrictKeysTextBox : TextBox
{
    ....
}

제한 keystextbox에서 onpreviewkeydown 이벤트를 무시하십시오.

다음과 같이이 재정의에 논리를 넣으십시오.

if (e.Key == Key.Space)
{
    e.Handled = true;
}

restrictKeyStextBox의 인스턴스를 Datagrid에 바인딩하십시오.

데이터 그 리드에서 onpreviewkeydown을 무시하지 않고 작동하고 관련 문제를 제거해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top