3

ASP.NET Web アプリで Silverlight ユーザー コントロールを使用しています。ユーザーコントロールにはいくつかのオートコンプリートボックスがあり、Enterキーは他のキーに対して発火している間、いずれのキーダウンイベントも発火しないようです。

おそらくリストからアイテムを選択するために、オートコンプリートボックスは別の方法でエンターキーを処理する必要があると思います。- したがって、単純なテキスト ボックスで動作します。

新しい派生コントロールでイベントハンドラーをオーバーライドすることを考えていました...

皆さんはこれに対する解決策を見つけましたか?

4

4 に答える 4

4

一部のコントロールはキー イベントを独自に処理するため、より高いレベルのコントロールにそれらをマスクする効果があるという Joe White の意見は正しいです。Reflector の AutoCompleteBox を見ると、Enter、Escape、および F4 のすべてが何かを引き起こし、e.Handled = true とマークされていることがわかります。

残念ながら、PreviewKeyDown は Silverlight の世界には存在しません。

コントロールがこれらの重要なイベントに応答してキャプチャするのを防ぐことができた 1 つの方法は、コントロールをサブクラス化し、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 以外) が壊れないようにしたい場合は、どのキーが処理されたかをより具体的に知ることができます。

于 2010-08-18T15:38:53.020 に答える
2

男子生徒のエラー - KeyDown に集中しすぎて、代わりに KeyUp を使用できることを忘れていました... :) 元の質問にはまだ答えていませんが、少なくとも先に進むことができました!

于 2010-08-18T13:22:35.543 に答える
0

私はこのソリューションをDanAuclairのソリューションに基づいており、依存関係プロパティを削除するために単純化し、探しているユースケースを反映するようにロジックを変更しました。

public class MyAutoCompleteBox : AutoCompleteBox
{
    protected override void OnKeyDown(KeyEventArgs e)
    {
        if (e.Key == Key.Enter && !IsDropDownOpen)
        {
            e.Handled = false;
        }
        else
        {
            base.OnKeyDown(e);
        }
    }
}
于 2011-11-11T14:01:45.297 に答える
0

オートコンプリート ボックスについては知りませんが、一部の WPF コントロール (およびおそらく一部の Silverlight コントロールも同様) が独自にいくつかのキーを処理し、それらを Handled としてマークすることは知っています。したがって、通常、これらのイベントは表示されません。

最も簡単な解決策は、代わりに PreviewKeyDown をフックすることです。これはほとんどそれが目的です。

于 2010-08-18T12:58:32.323 に答える