【问题标题】:why does the wpftoolkit datepicker eat the return key down event?为什么 wpftoolkit datepicker 会吃掉返回键按下事件?
【发布时间】:2010-12-30 16:21:15
【问题描述】:

我想知道是否有人知道为什么日期选择器会将标准键传递给任何父控件的按键向下路由事件,而不是返回键?

这是我写的 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 (意味着使用 key up),但我发现有趣的是标准数字和 / 字符正在触发逻辑,而不是返回键。任何想法为什么不包括返回键作为按键?

【问题讨论】:

    标签: wpf datepicker wpftoolkit routedevent


    【解决方案1】:

    KeyDown 事件是较低级别的 可能不正常的文本输入事件 正如在某些控件上所预期的那样。这 是因为有些控件有控制权 合成或类处理 提供更高级别的版本 文本输入处理及相关 事件。

    正如MSDN 所见...我的假设是控件正在使用该事件,并且可能将文本提交到可绑定源和其他清理,然后将事件标记为已处理。

    【讨论】:

    • 非常有趣...我认为这可能与日期选择器的日历控制部分有关,它正在处理推送 selectedDate 值以将文本放入文本框中。但他们不想让活动冒泡以供潜在用途吗?
    • @N8 不一定,因为它是提供给定功能的特定控件;与旨在提供/允许可扩展性的框架相比。
    • 啊,就像当事件被触发时,整个复合控件状态都处于不稳定状态。 (AKA 绑定值可能是绑定的一半或类似的东西。但他们不想处理事件,让他们的控制(在本例中为日期选择器)进入固态,然后再次引发事件?希望这是有道理的. (再次感谢,如果可以的话,我会给你更多的投票!)
    • @N8 确实有道理,但正如 MSDN 参考所述,这是一个较低级别的事件,因此屏蔽该事件以公开更多相对于控件的其他事件将是一种更适合的方法打包以提供给定的功能。抽象较低级别的数据,以提供更易于控件使用者访问的较高级别数据。
    【解决方案2】:

    另外不得不提一下我的解决方案。 我有一个父视图,它处理来自所有子视图模型的 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
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-04
      • 2014-01-25
      • 1970-01-01
      • 1970-01-01
      • 2012-08-22
      • 1970-01-01
      • 2012-02-01
      相关资源
      最近更新 更多