почему средство выбора даты wpftoolkit использует событие возврата ключа вниз? - PullRequest
2 голосов
/ 30 декабря 2010

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

вот 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));
    }
}

Я использовал ключ вниз при аварии (предполагалось использовать ключ вверх), но мне было интересно, что стандартные числовые и /символы запускали логику, но не клавишу возврата.Любая идея, почему клавиша возврата не включена как клавиша «вниз»?

Ответы [ 2 ]

3 голосов
/ 30 декабря 2010

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

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

0 голосов
/ 27 ноября 2014

Кроме того, пришлось упомянуть мое решение. У меня было родительское представление, которое обрабатывает событие keyDown от всех дочерних моделей представления. Я объявил поведение для специальных элементов управления, таких как DatePicker, MaskedTextBox и т. Д., Которые отлавливают событие туннелирования previewKeyDown и вызывают событие барботирования KeyDown:

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:

<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
        }
    }
...