KeyCoown事件不会触发AutoCompleteBox中的“enter”

时间:2010-08-18 12:52:03

标签: asp.net silverlight events autocomplete keydown

我在ASP.NET Web应用程序中使用Silverlight用户控件。 用户控件有几个自动完成框,似乎在触发其他键时,Enter键永远不会触发其中任何一个的keydown事件。

我假设自动填充框必须以不同的方式处理回车键,可能是为了从列表中选择一个项目。 - 因此它适用于简单的文本框。

我在考虑在新的派生控件中覆盖eventhandler ......

你们有没有为此找到解决方案?

4 个答案:

答案 0 :(得分:4)

Joe White是正确的,有些控件自己处理关键事件,这会将它们屏蔽到更高级别的控件。如果您查看Reflector中的AutoCompleteBox,您会看到Enter,Escape和F4都会导致某些事情发生并标记为e.Handled = true。

不幸的是,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"/>

此类事情会阻止基本AutoCompleteBox标记e.Handled = true并允许事件冒泡,以便您的更高级别控件可以使用它执行其他操作。如果你想阻止其他KeyDown事件(除了Enter)之外,你可以更加具体地处理哪些键被处理。

答案 1 :(得分:2)

小学生错误 - 我专注于KeyDown,我忘记了我可以使用KeyUp代替...... :) 它仍然没有回答我的问题,但至少我可以继续前进!

答案 2 :(得分:0)

我不知道自动完成框,但我知道一些WPF控件(也可能是一些Silverlight控件)自己处理一些键,并将它们标记为Handled。所以通常你不会看到那些事件。

最简单的解决方案是挂钩PreviewKeyDown。这几乎就是它的用途。

答案 3 :(得分:0)

我基于Dan Auclair的解决方案,简化它以删除依赖属性并更改逻辑以反映我认为您正在寻找的用例。

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