Настройка "AcceptButton" из WPF WindowsFormHost
У меня есть пользовательский контроль winforms с несколькими кнопками в элементе управления WPF.
Мой usercontrol ранее был размещен в форме Windows, и я смог так
this.ParentForm.AcceptButton = this.btnSearch;
Я пытаюсь установить, как сделать подобное на usercontrol сейчас, когда он находится в WindowsFormHost. Свойство ParentForm имеет значение null.
В идеале я хотел бы достичь двух вещей.
- Поведение AcceptButton (клавиша Enter вызывает нажатие кнопки)
- Форматирование 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"/>
Для использования 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) перед формой или чем-то еще, поэтому ваш пробег может отличаться.:)