我有一个应用程序,用户希望F4成为“Process Orders”按钮。 (执行此功能的密钥有很长的历史。)
今天我发现如果焦点在ComboBox中,那么F4会让ComboBox执行下拉列表。
有没有办法让这种事情不发生?
更新:我尝试使用Delphi,它也在那里发生。虽然我仍然很好奇,但这似乎是一个“烘焙”的Windows事物。我将要求用户选择另一种快捷方式。
答案 0 :(得分:3)
使用此
cboTest.PreviewKeyDown += (o,e) => {
if (e.Key == Key.F4)
e.Handled = true;
};
cboTest是您的ComboBox名称
答案 1 :(得分:1)
解决方案:使用这样的组合框:
public class myComboBox : ComboBox
{
protected override void OnKeyDown(KeyEventArgs e)
{
if (e.Key != Key.F4)
{
base.OnKeyDown(e);
}
}
}
这就是你想要的一切。
答案 2 :(得分:1)
除了上述答案外,这是一种可重用的解决方案,无需创建自定义控件:
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" />
答案 3 :(得分:0)
你是如何捕捉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");
}
}
答案 4 :(得分:-1)
默认情况下,F4键会打开或关闭组合框的下拉列表。可以更改此行为以忽略F4键并使用向下箭头键打开列表。这是通过向提供TRUE
参数的组合框发送CB_SETEXTENDEDUI
来完成的。这假设WPF确实在内部使用本机公共控件。