如何在WPF中创建提交按钮?

73
当您在HTML表单中的任何位置按下Enter时,它会触发其action,这相当于按下submit按钮。 如何制作一个窗口,在我按下Enter的任何地方都会触发一个事件?

WPF 中是否有键预览属性?如果有的话,将其设置为 true 将直接将所有按键发送到窗体,您可以使用 KeyPress 事件来处理它。 - David Brunelle
5个回答

150

IsDefault属性设置在按钮上为true,以启用Enter键激活该按钮的操作。还有IsCancel属性,可以为Escape键执行相同的操作。


1
这是我在下面回答中的第一个建议,但后来我注意到XMLforDummies没有在表单上说他/她有一个“OK”或“提交”按钮,所以我编辑了我的答案。你可能会遇到的唯一“问题”是,如果除了“OK” / “Submit”按钮之外的其他按钮具有焦点,则按Enter键将仅单击具有焦点的按钮,并且不会触发其他事件,这可能是您期望的,但只是想提出这一点。 - ihatemash
1
我认为这种行为是有意的。例如,如果该按钮打开了一个模态对话框,并且通过按下回车键触发提交,您不希望两个事件都被触发。 - Alex B

9

在XAML中将PreviewKeyDown事件分配给窗口,然后在代码后台中检查KeyEventArgs以确定用户是否按下了Enter键。

XAML代码:

<Window
    [...]
    PreviewKeyDown="Window_PreviewKeyDown">

后端代码:

private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Enter)
    {
        // Whatever code you want if enter key is pressed goes here
    }
}

抱歉,我刚意识到你没有说在表单上有一个按钮。在此工作之前,你必须在表单上放置一个按钮。 - ihatemash
1
如果没有的话,只需将IsHitTestVisible="true"添加到窗口属性中。 - Guy
警告:此事件将在窗口中的任何控件上触发,甚至包括其他按钮。这通常不是问题,除非您的用户在表单上切换选项卡并使用Enter键单击按钮。 - Walter Stabosz
@WalterStabosz 当你在选项卡之间切换时,应该使用空格键来激活高亮按钮 :) - oo_dev

0
我发现DatePicker控件会吞噬Enter按键,导致默认按钮不能被点击。我写了这个事件处理程序来解决这个问题。使用PreviewKeyUp确保DatePicker在点击默认按钮之前执行其日期格式化代码。
private void DatePicker_PreviewKeyUp(object sender, KeyEventArgs e) {
    // event handler to click the default button when you hit enter on DatePicker
    if (e.Key == Key.Enter) {
        // https://www.codeproject.com/Tips/739358/WPF-Programmatically-click-the-default-button
        System.Windows.Input.AccessKeyManager.ProcessKey(null, "\x000D", false);
    }
}

0
根据此https://wpf.2000things.com/tag/isdefault/
如果以下所有条件都为真,则IsDefaulted将为true:
  1. 按钮的IsDefault设置为true
  2. 某些其他控件当前具有焦点
  3. 当前具有焦点的控件本身不处理ENTER键
在我的情况下,我试图从已经处理Enter键的TextBox中按Enter。解决方法是为TextBox设置AcceptsReturn = false。如果您不需要多行文本框并且Enter键应提交输入的文本,则此选项有效。同时,应在输入时更新文本绑定。
<TextBox Text="{Binding Text, UpdateSourceTrigger=PropertyChanged}" 
 AcceptsReturn="False"/>

0
<Button Name="btnDefault" IsDefault="true" Click="OnClickDefault">OK</Button>

你可以通过将按钮的IsDefault属性设置为True来实现这一点。

你可以从微软的文档中获取详细信息。

Button.IsDefault属性


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