代码之家  ›  专栏  ›  技术社区  ›  G Berdal

自动完成框中的“enter”不会触发KeyDown事件

  •  3
  • G Berdal  · 技术社区  · 16 年前

    我正在我的系统中使用Silverlight用户控件ASP.NETweb应用程序。 用户控件有几个自动完成框,似乎enter键在其中任何一个框中都不会触发keydown事件,而会触发其他键。

    我假设自动完成框必须以不同的方式处理enter键,也许是为了从列表中选择一个项目。-因此,它适用于简单的文本框。

    我在考虑在一个新的派生控件中重写eventhandler。。。

    你们找到解决办法了吗?

    4 回复  |  直到 16 年前
        1
  •  4
  •   Dan Auclair    16 年前

    不幸的是,在Silverlight世界中不存在PreviewKeyDown。

    阻止控件响应和捕获这些关键事件的一种方法是对控件进行子类化并重写OnKeyDown方法。类似这样的操作将允许您控制控件是否对关键事件做出反应:

    public class MyAutoCompleteBox : AutoCompleteBox
    {
        public static readonly DependencyProperty HandleKeyEventsProperty = DependencyProperty.Register(
            "HandleKeyEvents",
            typeof(bool),
            typeof(MyAutoCompleteBox),
            new PropertyMetadata(true));
    
        public bool HandleKeyEvents
        {
            get { return (bool)GetValue(HandleKeyEventsProperty); }
            set { SetValue(HandleKeyEventsProperty, value); }
        }
    
        protected override void OnKeyDown(KeyEventArgs e)
        {
            if (this.HandleKeyEvents)
            {
                base.OnKeyDown(e);
            }
        }
    }
    

    然后可以使用XAML中的HandleKeyEvents属性禁用控件处理它们:

    <local:MyAutoCompleteBox HandleKeyEvents="False"/>
    

        2
  •  2
  •   G Berdal    16 年前

    小学生错误-我太专注于键控键控了,以至于忘了我可以用键控键控来代替。。。:)

        3
  •  0
  •   Joe White    16 年前

    我不知道autocomplete框,但是我知道一些WPF控件(可能还有一些Silverlight控件)自己处理一些键,并将它们标记为已处理。所以通常你不会看到这些事件。

    最简单的解决方案是钩住PreviewKeyDown。这就是它的目的。

        4
  •  0
  •   eremzeit    14 年前

    public class MyAutoCompleteBox : AutoCompleteBox
    {
        protected override void OnKeyDown(KeyEventArgs e)
        {
            if (e.Key == Key.Enter && !IsDropDownOpen)
            {
                e.Handled = false;
            }
            else
            {
                base.OnKeyDown(e);
            }
        }
    }