2010-12-30 4 views
2

Мне интересно, знает ли кто-нибудь, почему datepicker передает стандартные ключи любому ключевому управляющему ключу вниз, но не к ключу возврата?Почему дампикер wpftoolkit ест событие возврата?

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

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

ответ

3

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

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

+0

очень интересно ... Я думаю, что это, вероятно, нужно сделать, потому что управление календарями части сборщика данных обрабатывает нажатие значения selectedDate, чтобы поместить текст в текстовое поле. но разве они не захотят позволить событию пузыриться для потенциального использования? –

+0

@ N8 Не обязательно, поскольку это конкретный элемент управления, обеспечивающий заданную функциональность; по сравнению с каркасом, предназначенным для обеспечения/обеспечения расширяемости. –

+0

А как, например, при запуске события все состояние составных элементов управления находится в неустойчивом состоянии. (Привязанные значения AKA могут быть переделаны в два раза или что-то в этом роде , но не хотят ли они обработать событие, получить контроль (в данном случае датпикер) в твердотельное состояние, а затем снова поднять событие? надеюсь, что это имеет смысл. (и еще раз спасибо, я бы дал вам больше голосов, если бы мог!) –

0

Кроме того, пришлось упомянуть о моем решении. У меня родительский вид, который обрабатывает событие 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 
     } 
    }