【问题标题】:Setting "AcceptButton" from WPF WindowsFormHost从 WPF WindowsFormHost 设置“AcceptButton”
【发布时间】:2011-03-25 11:59:38
【问题描述】:

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

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

this.ParentForm.AcceptButton = this.btnSearch;

我正在尝试确定如何在用户控件上执行类似操作,因为它位于 WindowsFormHost 中。 ParentForm 属性为空。

理想情况下,我希望实现两件事。

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

非常感谢, 克里斯

【问题讨论】:

  • 对于第 2 点。可以在 Windows 窗体按钮上调用 NotifyDefault(true),它将显示替代格式,就好像它是默认按钮一样。

标签: c# wpf winforms winforms-interop


【解决方案1】:

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

例子:

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

【讨论】:

  • 我不知道一个根本没有解决问题的答案是如何获得最高票数的。问题是关于 Windows 窗体互操作,而不是如何在 WPF 中设置使用 IsDefault/IsCancel。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    WPF Windows 没有 AcceptButton 的 Windows 窗体概念。您可能无法使用 Enter 键来自动启用您的 btnSearch.Click 处理程序。此外,您也无法获得接受按钮的替代样式。

    您可能会在 Windows 窗体控件上公开一个方法,该方法就像您单击了搜索按钮一样,并在按下 Enter 键时从 WPF 端调用该方法。否则,您会发现缺少 Forms 控件和 WPF 控件之间的交互(WindowsFormsHost 从未打算提供完全保真访问)。

    【讨论】:

    • 我认为/担心是这种情况。打算再待几天,看看是否有更好的想法出现。干杯
    【解决方案4】:

    为了使用 Esc 和 Enter,我使用了这个:

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

    【讨论】:

      【解决方案5】:

      我不确定,但你能把焦点设置在那个按钮上吗?所以它的行为与 winforms 中的行为相同。

      【讨论】:

      • “接受按钮”没有焦点(通常)。当用户在某个其他控件(具有焦点)中按下 Enter 键时,如果该控件配置为不接受 Enter 按键,则它被“单击”。它是 IsDialogMessage 的一个函数。
      • 我需要一个文本框来获得焦点 - 用例是一个搜索字段,按 Enter 应该会触发搜索。我宁愿不必在 winforms 中为每个字段实现键盘处理以支持 wpf。
      【解决方案6】:

      不幸的是,WPF 中没有 AcceptButton —— 而且很烦人。

      我通过处理表单的 KeyUp 事件成功实现了该功能。 代码如下:

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

      似乎工作正常。在我的情况下,我在 WPF 表单上有文本框,用户输入值和点击,它似乎工作正常。 某些控件可能存在问题,这些控件在表单或其他内容之前覆盖(获取 KeyUp 事件),因此您的里程可能会有所不同。 :)

      【讨论】:

        猜你喜欢
        • 2011-08-22
        • 1970-01-01
        • 2013-10-25
        • 2012-02-24
        • 2016-04-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-10
        • 1970-01-01
        相关资源
        最近更新 更多