development

TextBox에서 Enter 키 캡처

big-blog 2020. 10. 27. 22:48
반응형

TextBox에서 Enter 키 캡처


내 WPF보기에서 다음과 같이 이벤트를 Enter 키에 연결하려고합니다.

<TextBox Width="240" VerticalAlignment="Center" Margin="2" Text="{Binding SearchCriteria, Mode=OneWayToSource}">
  <TextBox.InputBindings>
      <KeyBinding Key="Enter" Command="{Binding EnterKeyCommand}"/>
      <KeyBinding Key="Tab" Command="{Binding TabKeyCommand}"/>
  </TextBox.InputBindings>
</TextBox>

이 코드는 작동하며 사용자가 Enter 키를 누르면 내 EnterKeyCommand가 실행됩니다. 그러나 문제는 이벤트가 발생할 때 WPF가 아직 텍스트 상자의 텍스트를 'SearchCriteria'에 바인딩하지 않았다는 것입니다. 따라서 내 이벤트가 발생하면 'SearchCriteria'의 내용이 비어 있습니다. EnterKey 명령이 실행될 때 텍스트 상자의 내용을 가져올 수 있도록이 코드에서 간단하게 변경할 수 있습니까?


당신은을 변경해야 UpdateSourceTrigger당신이에 TextBox.Text바인딩 PropertyChanged. 를 참조하십시오 여기 .


TextBox의 InputBindings속성을 a CommandParameter로 전달하면됩니다 Command.

<TextBox x:Name="MyTextBox">
    <TextBox.InputBindings>
        <KeyBinding Key="Return" 
                    Command="{Binding MyCommand}"
                    CommandParameter="{Binding ElementName=MyTextBox, Path=Text}"/>
    </TextBox.InputBindings>
</TextBox>

뒤에있는 코드에서도이를 수행 할 수 있습니다.

방법 : Enter 키를 눌렀을 때 감지

입력 / 반환 확인에서 이벤트 핸들러 코드를 호출하기 만하면됩니다.


나는 이것이 6 살이라는 것을 알고 있지만 어떤 답변도 XAML을 사용하고 코드 숨김을 사용하여 전체적으로 정답을 생성하지 못합니다. 참고로 접근 방식은 다음과 같습니다. 먼저 XAML

 <TextBox Text="{Binding SearchText, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
        <TextBox.InputBindings>
            <KeyBinding Key="Enter" Command="{Binding SearchEnterHit}"/>
            <KeyBinding Key="Return" Command="{Binding SearchEnterHit}"/>
        </TextBox.InputBindings>
    </TextBox>

기본적으로 접근 방식은 모든 키가 모든 키 입력 에서 바인딩 된 SearchText던져지는 것 입니다. 따라서 문자열은 리턴 / 입력을 누르면 SearchText 내에 완전히 존재합니다. 따라서 SearchEnterHit 명령에서 TextBox 내의 전체 문자열은 SearchText 속성을 통해 사용할 수 있습니다.

위에서 언급했듯이 UpdateSourceTrigger = PropertyChanged는 모든 키 입력을 SearchText 속성으로 플러시 합니다. KeyBindings는 Enter 키를 캡처합니다.

이것은 코드 숨김없이 모든 XAML을 사용하여이 작업을 수행하는 가장 간단한 방법입니다. 물론 SearchText 속성에 대한 키를 자주 플러시하지만 일반적으로 문제가되지 않습니다.


비동기 이벤트처럼 할 수도 있습니다. 다음은 그 예입니다.

tbUsername.KeyDown += async (s, e) => await OnKeyDownHandler(s, e);  

private async Task OnKeyDownHandler(object sender, KeyEventArgs e)
{
   if (e.Key == Key.Return)
   {
      if (!string.IsNullOrEmpty(tbUsername.Text) && !string.IsNullOrEmpty(tbPassword.Password))
      {
          Overlay.Visibility = Visibility.Visible;
          await Login();
      }
  }
}

참고 URL : https://stackoverflow.com/questions/5556489/capturing-the-enter-key-in-a-textbox

반응형