Событие KeyDown не срабатывает при вводе в AutoCompleteBox - PullRequest
3 голосов
/ 18 августа 2010

Я использую пользовательский контроль Silverlight в своем веб-приложении ASP.NET.У пользовательского элемента управления есть несколько полей автозаполнения, и кажется, что клавиша ввода никогда не запускает событие keydown ни в одном из них, в то время как оно запускается для других клавиш.

Я предполагаю, что блоки автозаполнения должны обрабатывать клавишу ввода виначе, возможно, для выбора элемента из списка.- Таким образом, он работает с простыми текстовыми полями.

Я думал о переопределении обработчика событий в новом элементе управления производными ...

Ребята, вы нашли решение для этого?

Ответы [ 4 ]

4 голосов
/ 18 августа 2010

Джо Уайт прав, что некоторые элементы управления обрабатывают ключевые события самостоятельно, что приводит к маскировке их для элементов управления более высокого уровня. Если вы посмотрите на AutoCompleteBox в Reflector, вы увидите, что Enter, Escape и F4 все вызывают что-то, и отметьте e.Handled = true.

К сожалению, PreviewKeyDown не существует в мире Silverlight.

Один из способов, которым я смог предотвратить реагирование элементов управления и захват этих ключевых событий, - это создать подкласс управления элементом управления и переопределить метод 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);
        }
    }
}

Затем можно использовать свойство HandleKeyEvents в XAML, чтобы отключить их обработку для элемента управления:

<local:MyAutoCompleteBox HandleKeyEvents="False"/>

Этот тип препятствует тому, чтобы базовый AutoCompleteBox когда-либо отмечал e.Handled = true, и позволял бы событию пузыриться, чтобы ваш высокоуровневый элемент управления мог с ним что-то делать. Можно было бы более точно указать, с какими ключами обрабатывается, если вы хотите предотвратить прерывание других событий KeyDown (кроме Enter).

2 голосов
/ 18 августа 2010

Ошибка школьника - я был так сосредоточен на KeyDown, что забыл, что могу вместо этого использовать KeyUp ... :) Он все еще не отвечает на мой оригинальный вопрос, но, по крайней мере, я могу двигаться дальше!

0 голосов
/ 11 ноября 2011

Я основал это решение на основе 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);
        }
    }
}
0 голосов
/ 18 августа 2010

Я не знаю о блоке автозаполнения, но я знаю, что некоторые элементы управления WPF (и, возможно, некоторые элементы управления Silverlight) обрабатывают некоторые ключи самостоятельно и помечают их как Обработанные.Поэтому обычно вы не увидите эти события.

Самое простое решение - перехватить PreviewKeyDown.Это в значительной степени то, что он там.

...