2

我有一个应用程序,用户希望 F4 成为“处理订单”按钮。(执行此功能的那个键有很长的历史。)

今天我发现如果焦点在 ComboBox 中,那么 F4 会使 ComboBox 执行下拉。

有没有办法让这种情况不发生?

更新:我用 Delphi 试过这个,它也发生在那里。虽然我仍然很好奇,但这似乎是 Windows 的“成熟”事物。我将要求用户选择另一个快捷方式。

4

5 回答 5

3

用这个

cboTest.PreviewKeyDown += (o,e) => {
    if (e.Key == Key.F4)
        e.Handled = true;
};

cboTest 是您的组合框名称

于 2013-01-07T19:56:18.077 回答
2

解决方案:使用这样的组合框:

  public class myComboBox : ComboBox
    {
        protected override void OnKeyDown(KeyEventArgs e)
        {
            if (e.Key != Key.F4)
            {
                base.OnKeyDown(e);
            }
        }
    }

这就是你想要的。

于 2018-01-07T12:05:41.387 回答
2

除了上面的答案,这里是一个无需创建自定义控件的可重用解决方案:

public static class ComboBoxHelper
{
    public static readonly DependencyProperty DisableF4HotKeyProperty =
        DependencyProperty.RegisterAttached("DisableF4HotKey", typeof(bool),
            typeof(ComboBoxHelper), new PropertyMetadata(false, OnDisableF4HotKeyChanged));

    public static bool GetDisableF4HotKey(DependencyObject obj)
    {
        return (bool)obj.GetValue(DisableF4HotKeyProperty);
    }

    public static void SetDisableF4HotKey(DependencyObject obj, bool value)
    {
        obj.SetValue(DisableF4HotKeyProperty, value);
    }

    private static void OnDisableF4HotKeyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var box = d as ComboBox;
        if (d == null) return;

        box.PreviewKeyDown -= OnComboBoxKeyDown;
        box.PreviewKeyDown += OnComboBoxKeyDown;
    }

    private static void OnComboBoxKeyDown(object _, KeyEventArgs e)
    {
        if (e.Key == System.Windows.Input.Key.F4)
        {
            e.Handled = true;
        }
    }
}

在您的 xaml 文件中,添加对该ComboBoxHelper类的命名空间引用并在您的 ComboBox 上设置附加属性:

 <ComboBox h:ComboBoxHelper.DisableF4HotKey="True" />
于 2020-10-27T10:48:33.630 回答
1

你是怎么抓住F4键的?如果您使用 keypreview,您可以覆盖它,从冒泡到组合框:

private void Form1_Load(object sender, EventArgs e)
{
    this.KeyPreview = true;
    this.KeyDown += new KeyEventHandler(Form1_KeyDown);
}

void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.F4)
    {
        e.Handled = true;
        MessageBox.Show("F4 Pressed");
    }
}
于 2013-01-07T20:25:11.407 回答
-1

默认情况下 F4 键打开或关闭组合框的下拉列表。可以更改此行为以忽略 F4 键并改用向下箭头键打开列表。这是通过将 a 发送CB_SETEXTENDEDUI到提供TRUE参数的组合框来完成的。这是假设 WPF 实际上在内部使用本机通用控件。

于 2013-01-08T16:26:59.860 回答