【问题标题】:Preventing default behaviour of Return(Enter), Up and Down Arrow keys for a ListView in XAML/C# (Windows 10)防止 XAML/C# (Windows 10) 中 ListView 的 Return(Enter)、向上和向下箭头键的默认行为
【发布时间】:2015-09-17 18:35:32
【问题描述】:

当列表视图有焦点时,回车键的默认行为是选择列表视图的第一个元素,向上和向下箭头键滚动列表视图。我试图阻止这种默认行为并连接我的自定义逻辑。

我可以使用 KeyDown 为列表视图实现访问键,如下所示:

代码隐藏方法:

CoreWindow.GetForCurrentThread().KeyDown += KeyDownHandler;

MVVM 方法:

<ListView SelectedIndex="{Binding IsSelected, Mode=TwoWay}"/>

触发 Keydown 属性:

<core:EventTriggerBehavior EventName="KeyDown">
        <core:InvokeCommandAction Command="{x:Bind VMDataContext.KeyDownCommand}" />
    </core:EventTriggerBehavior>

并使用行为将列表视图的滚动条滚动到选定的索引:

<corebehaviors:ListViewScrollBehaviour SelectedIndex="{x:Bind IsSelected, Mode=OneWay}"/>

当列表视图没有焦点时,会触发上述处理程序。当列表视图具有焦点时,将触发向上、向下和 Enter 键的默认行为,而不是我的附加行为。有没有办法防止默认行为?

【问题讨论】:

    标签: c# visual-studio xaml windows-10 uwp


    【解决方案1】:

    考虑扩展ListView 控件并覆盖OnKeyDown 处理程序。

    public class ExtendedListView : ListView
    {
        protected override void OnKeyDown(KeyRoutedEventArgs e)
        {
            if (e.Key == VirtualKey.Enter || e.Key == VirtualKey.Up || e.Key == VirtualKey.Down)
            {
                return;
            }
    
            base.OnKeyDown(e);
        }
    }
    

    【讨论】:

    • 谢谢贾斯汀!它适用于 Enter Key 而不是 Up 和 Down。这很奇怪,因为断点没有被上下箭头键击中。我还尝试覆盖 OnKeyUp 函数并观察到相同的行为。
    • 顺便说一句,在某些情况下您可能想调用e.Handled = true; 而不是return
    【解决方案2】:

    试试这个

    CoreWindow.GetForCurrentThread().KeyDown += new KeyEventHandler(ListView_KeyDown);
    
    private void ListView_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Enter)
            //do ur stuff
    }
    

    使用PreviewKeyDown 事件而不是KeyDown 会是一种更好的方法

    【讨论】:

    • ListView_KeyDown(CoreWindow sender, KeyEventArgs args) 只能接受CoreWindow和KeyEventArgs的参数。我也无法使用 PreviewKeyDown。不确定这是否适用于 WinRT 应用程序。
    【解决方案3】:

    Enter 键是所谓的VirtualKey(单击链接查看 MSDN 文档)。这应该可以完成:

            private void UIElement_OnKeyDown(object sender, KeyRoutedEventArgs e)
            {
                if (e.Key == VirtualKey.Enter)
                {
    
                }
            }
    

    希望这会有所帮助。

    【讨论】:

    • 如前所述,当按下 Enter 键时,ListView 不会触发 Enter 的这个 keydown 事件。相反,它正在打开 ListView 的第一项
    • 是否可以覆盖 ListView 的默认行为以按 Enter 键?
    • 我猜你的意思是选择第一个项目“打开第一个项目......如果你在 ListView 本身上执行此操作,它应该可以导航到另一个页面。但是,你必须考虑考虑到如果没有预先选择任何项目(例如使用箭头键),它将始终进入第一个项目。如果选择了另一个项目,它应该使用这个项目。
    • 有没有办法防止 Enter 键的“默认打开”行为发生?就像即使我按 Enter 键,也不应该发生任何事情。然后我可以将我的自定义逻辑附加到它。
    • 通常情况下,只需添加您的代码就可以了。如果没有,更详细的 ListView XAML 视图将有助于确定此行为的原因。
    猜你喜欢
    • 2011-09-07
    • 2010-11-08
    • 2010-09-21
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    • 2018-09-16
    相关资源
    最近更新 更多