在WPF WindowsFormHost中设置“AcceptButton”

13

我有一个winforms用户控件,在WPF控件中有多个按钮。

我的用户控件以前托管在Windows窗体中,我能够这样做。


this.ParentForm.AcceptButton = this.btnSearch;

我现在正在尝试确定如何在WindowsFormHost中的usercontrol上实现类似的操作。 ParentForm属性为null。

我希望实现两件事情:

  1. AcceptButton行为(按Enter键触发按钮按下)
  2. AcceptButton格式 - 即WinForms按钮应用了接受按钮的备用格式。

非常感谢, 克里斯


对于第二点,您可以在 Windows 窗体按钮上调用 NotifyDefault(true) 方法,它将显示备选格式,就像它是默认按钮一样。 - ghord
6个回答

33

在页面上设置按钮的Button.IsCancel(Esc)或Button.IsDefault(Enter)。

示例:

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

我不知道一个完全没有回答问题的答案怎么成为了最受欢迎的答案。这个问题是关于Windows Forms互操作的,而不是关于如何在WPF中设置使用IsDefault/IsCancel。 - ghord

3
将默认按钮的IsDefault属性设置为true。

0

为了使用 Esc 和 Enter,我使用了以下代码:

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

0

WPF的Window没有Windows Forms中的AcceptButton概念。您可能无法使Enter键自动触发btnSearch.Click处理程序。此外,您也无法获得接受按钮的备用样式。

您可以在Windows Forms控件上公开一个方法,该方法就像单击搜索按钮一样,并在WPF侧按下Enter键时调用该方法。否则,您会发现Forms控件和WPF控件之间的交互不足(WindowsFormsHost从未旨在提供完全保真度的访问)。


我认为/担心这就是情况。我将再等几天不予回复,看是否有更好的想法出现。祝好。 - Chris

-1

很遗憾在WPF中没有AcceptButton,这真的很烦人。

我通过处理窗体的KeyUp事件成功地实现了该功能。以下是代码:

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

看起来工作得很好。在我的情况下,我有文本框在 WPF 表单上,用户输入值并按 Enter 键,它似乎很好地工作。 可能会出现一些控件覆盖(捕获 KeyUp 事件)表单或其他一些问题,因此您的结果可能会有所不同。 :)


-1

我不确定,但你能把焦点设置到那个按钮上吗?这样它就会像在winforms中一样具有相同的行为。


1
“接受按钮”通常没有焦点。当用户在其他控件中按下Enter键时(该控件具有焦点),如果该控件未配置为接受Enter键,则会“单击”它。这是IsDialogMessage函数的一个功能。 - Tergiver
我需要一个文本框获得焦点 - 使用情况是搜索字段,按下回车键应触发搜索。我不想为每个winforms字段实现键盘处理以支持wpf。 - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接