Настройка "AcceptButton" из WPF WindowsFormHost

У меня есть пользовательский контроль winforms с несколькими кнопками в элементе управления WPF.

Мой usercontrol ранее был размещен в форме Windows, и я смог так

this.ParentForm.AcceptButton = this.btnSearch;

Я пытаюсь установить, как сделать подобное на usercontrol сейчас, когда он находится в WindowsFormHost. Свойство ParentForm имеет значение null.

В идеале я хотел бы достичь двух вещей.

  1. Поведение AcceptButton (клавиша Enter вызывает нажатие кнопки)
  2. Форматирование AcceptButton - т.е. кнопка winforms имеет альтернативное форматирование для примененных кнопок подтверждения.

Большое спасибо, Крис

5 ответов

Решение

WPF Windowне имеют концепции Windows Forms AcceptButton, Скорее всего, вы не сможете получить ключ Enter для автоматического включения вашего btnSearch.Click обработчик. Кроме того, вы не сможете получить альтернативный стиль для кнопки принятия.

Вы можете потенциально представить метод в элементе управления Windows Forms, который действует так, как будто вы нажали кнопку поиска, и вызывать этот метод со стороны WPF при нажатии клавиши Enter. В противном случае вы обнаружите, что взаимодействие между элементами управления Forms и элементами управления WPF отсутствует (WindowsFormsHost никогда не предназначался для обеспечения полного доступа).

Установите Button.IsCancel (Esc) или IsDefault (Enter) на кнопках на странице.

Пример:

<Button Content="Yes" Click="Yes_Button_Click" IsDefault="True"/>
<Button Content="No" Click="No_Button_Click" IsCancel="True"/>

Установите для свойства IsDefault кнопки по умолчанию значение true.

Для использования Esc и Enter я использовал это:

<UserControl.InputBindings>
    <KeyBinding Key="Esc" Command="{Binding CancelCommand}"/>
    <KeyBinding Key="Enter" Command="{Binding SaveCommand}"/>
</UserControl.InputBindings>

Я не уверен, но вы можете установить фокус на эту кнопку? Так что это будет иметь такое же поведение, как в winforms.

К сожалению, в WPF нет AcceptButton - и это раздражает.

Я успешно реализовал эту функциональность, обработав событие KeyUp формы. Вот код:

private void Window_KeyUp(object sender, KeyEventArgs e)
{
   if(e.Key == Key.Enter)
   {
      TargetButton_Click(sender, null);
   }
 }  

Кажется, работает нормально. В моем случае у меня есть текстовые поля в форме WPF, и пользователь вводит значения и попадания, и это, кажется, работает нормально. Могут быть проблемы с некоторым элементом управления, который переопределяет (захватывает событие KeyUp) перед формой или чем-то еще, поэтому ваш пробег может отличаться.:)

Другие вопросы по тегам