Захоплення клавіші Enter у TextBox


77

У своєму поданні 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>

Цей код працює, і мій EnterKeyCommand спрацьовує, коли користувачі натискають клавішу Enter. Однак проблема полягає в тому, що коли подія запускається, WPF ще не прив'язав текст у текстовому полі до "Критерії пошуку". Отже, коли моя подія запускається, вміст «Критеріїв пошуку» порожній. Чи можу я просто внести зміни в цей код, щоб я міг отримати вміст текстового поля, коли моя команда EnterKey спрацює?

Відповіді:


74

Вам потрібно змінити UpdateSourceTriggerна вашому TextBox.Textзв'язуючись з PropertyChanged. Дивіться тут .


Привіт, мікатене! Як я можу захопити клавішу Enter у PreviewTextInput?
Mahavirsinh Padhiyar

Привіт @ 0MV1, описаний метод використовує прив'язку WPF. Якщо ви хочете використовувати PreviewTextInput, вам доведеться використовувати обробку подій.
micahtan

9
Отже, в основному він повинен змінитись Text="{Binding SearchCriteria, Mode=OneWayToSource}"на, Text="{Binding SearchCriteria, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}"і це буде працювати нормально.
Nimp

18

Ви можете зробити це, передавши InputBindingsвластивість TextBox як a CommandParameterдо Command:

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

Це було місце на! Це плюс інформація тут, допомогла мені через мою плутанину! stackoverflow.com/questions/19847860/…
Джессі

8

Ви також можете зробити це в коді ззаду.

Як: виявити, коли натиснута клавіша Enter

Під час перевірки на введення / повернення просто викличте код обробника події.


6
Зазвичай слід уникати використання коду, якщо це не є абсолютно необхідним. Вхідне прив'язування є набагато більш доречним та декларативним.
aaronburro

7

Я знаю, що цьому 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 після натискання кнопки return / enter. Таким чином, у команді SearchEnterHit весь рядок у TextBox доступний через властивість SearchText.

Як згадувалося вище, UpdateSourceTrigger = PropertyChanged - це те, що змиває кожне натискання клавіші на властивість SearchText . KeyBindings захоплюють клавішу Enter.

Це насправді найпростіший спосіб зробити це без коду і всіх XAML. Звичайно, ви часто змиваєте ключі до властивості SearchText, але це, як правило, не є проблемою.


0

Це також можна зробити як асинхронну подію. Ось приклад.

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();
      }
  }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.