Вопрос

Мне интересно, знает ли кто -нибудь, почему DatePicker будет передавать стандартные ключи для маршрутизированного события любого родителя, но не клавиша возврата?

Вот XAML, который я написал:

    <WrapPanel Name="_wpParameters" 
               Grid.Row="0" Grid.Column="0" 
               Orientation="Horizontal" 
               Grid.IsSharedSizeScope="True"
               Keyboard.KeyDown="_wpParameters_KeyDown" >
        <!-- this is where the dynamic parameter controls will be added -->
    </WrapPanel>

Вот код, который я использовал, чтобы проверить на ключ возврата:

private void _wpParameters_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Return)
    {
        RaiseEvent(new RoutedEventArgs(LoadLiveResultsEvent, this));
    }
}

Я использовал Key Down Applying (предназначен для использования клавиши), но мне показалось интересным, что стандартные числовые и / символы стреляли логикой, но не клавиша возврата. Есть идеи, почему клавиша возврата не включена в качестве ключа вниз?

Это было полезно?

Решение

Событие Keydown-это событие текста более низкого уровня, которое может не вести себя, как и ожидалось, при определенных элементах управления. Это связано с тем, что некоторые элементы управления имеют управление композитированием или обработкой класса, которая обеспечивает более высокую версию обработки ввода текста и связанных событий.

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

Другие советы

Кроме того, пришлось упомянуть мое решение. У меня был родительский представление, которое обрабатывает событие Keydown от всех детских просмотров. Я объявил о поведении для специальных элементов управления, таких как DatePicker, MaskedTextbox и т. Д., Которые Catch PreviewKeydown Tunneling Event и Sake Bubdown Bubbing Event:

public class EnterPressedBehavior : Behavior<UIElement>
{
    public ICommand EnterPressedCommand { get; private set; }

    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.PreviewKeyDown += EnterPressed;
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();
        AssociatedObject.PreviewKeyDown -= EnterPressed;
    }

    private void EnterPressed(object sender, KeyEventArgs keyEventArgs)
    {
        if (Keyboard.PrimaryDevice != null && Keyboard.PrimaryDevice.ActiveSource != null)
        {
            var eventArgs = new KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, 0, keyEventArgs.Key) { RoutedEvent = UIElement.KeyDownEvent };

            AssociatedObject.RaiseEvent(eventArgs);
        }
    }
}

это поведение назначено на дату:

<DatePicker x:Name="BirthDateDatePicker" Grid.Column="1"
                    Grid.Row="6" Margin="3" HorizontalAlignment="Stretch"                                              
                    IsEnabled="{Binding PersonFieldsEditDenied}"
                    Validation.ErrorTemplate="{StaticResource DefaultValidationTemplate}"
                    AutomationProperties.AutomationId="BirthDateDatePicker">
            <i:Interaction.Behaviors>
                <viewModels:EnterPressedBehavior />
            </i:Interaction.Behaviors>
</DatePicker>

который слушается по родительскому представлению:

<Window
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       Title=""
       KeyDown="OnKeyDownHandler">

Код позади:

private void OnKeyDownHandler(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Enter)
        {
            // your code
        }
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top