asp.net - AutoCompleteBox 中的 'enter' 不会触发 KeyDown 事件

标签 asp.net silverlight events autocomplete keydown

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

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

我正在考虑在新的派生控件中重写事件处理程序...

你们找到解决办法了吗?

最佳答案

Joe White 的观点是正确的,某些控件会自行处理按键事件,这会产生将它们屏蔽给更高级别控件的效果。如果您查看 Reflector 中的 AutoCompleteBox,您会发现 Enter、Escape 和 F4 都会导致某些事情发生并标记 e.Handled = true。

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

我能够防止控件响应和捕获这些按键事件的一种方法是对控件进行子类化并重写 OnKeyDown 方法。像这样的东西可以让您控制控件是否对关键事件使用react:

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 之外)被破坏,您可以更具体地了解处理哪些键。

关于asp.net - AutoCompleteBox 中的 'enter' 不会触发 KeyDown 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3512246/

相关文章:

c# - Silverlight 的音频输出

android - Android 中父子view 可以同时获取motion 事件吗?

c# - 什么时候应该触发 "property changed"事件?

asp.net - Microsoft.SqlServer.Types 有什么作用,它是如何工作的?

c# - 将 "/Date(1309498021672)/"反序列化为 DateTime

c# - Silverlight 中的数据绑定(bind)进度条值和最大值

javascript - JQuery 不会删除我的 div 来响应 div 单击事件

c# - Azure 云服务无法将 vmsize 设置为 : ExtraSmall, Small、Medium 以外的任何值

asp.net - FileUpload控件回发问题

c# - 使用 Lightswitch、Silverlight 和自定义控件