2

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

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

4

2 回答 2

3

KeyDown 事件是一个较低级别的文本输入事件,它在某些控件上的行为可能与预期不同。这是因为某些控件具有控件合成或类处理,可提供更高级别的文本输入处理和相关事件。

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

于 2010-12-30T16:24:30.897 回答
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
        }
    }
于 2014-11-27T08:11:42.703 回答