我已将该KeyDown事件附加到ListView我的 Win 10 UWP 应用程序中。我想要产生VirtualKey.Enter特殊效果,但该事件不会针对该特定键触发。空格、向上或向下箭头也没有。我猜这是因为列表视图已经为这些键定义了特殊行为。
不过,我想覆盖其中一些键,或者至少触发其他操作。即使使用修饰符(例如 Shift+ArrowDown)将事件附加到这些键也不起作用,因为事件仍然没有触发。
我读到,对于 WPF,有一个PreviewKeyDown可以附加的事件。但我找不到 UWP 的该事件。还有其他选择吗?
斯蒂芬妮的答案很好,并且适用于一般情况。然而,正如 Nilzor 观察到的那样,它在 ListView 的 Enter 键的情况下不起作用。由于某种原因,ListView 会在按下 Enter 时处理 KeyDown 事件。
正如问题所要求的,在处理 ListView 时处理关键事件的更好方法是这样。
private void ListView_Loaded(object sender, RoutedEventArgs e)
{
(sender as ListView).AddHandler(UIElement.KeyDownEvent, new KeyEventHandler(ListView_KeyDown), true);
}
private void ListView_KeyDown(object sender, KeyRoutedEventArgs args)
{
if (args.Key == Windows.System.VirtualKey.Enter)
{
}
}
Run Code Online (Sandbox Code Playgroud)
请注意 AddHandler 函数中的最后一个参数。这指定我们是否要处理已经由可视化树中的前一个元素处理的事件。当然,不要忘记在适当的时候取消订阅活动
这是一种方法:订阅全局 Window.Current.CoreWindow.KeyDown 事件。然后保存列表视图的焦点状态并做出相应的反应。
这是代码:
public sealed partial class MainPage : Page
{
bool hasFocus = false;
public MainPage()
{
this.InitializeComponent();
Window.Current.CoreWindow.KeyDown += CoreWindow_KeyDown;
}
private void CoreWindow_KeyDown(Windows.UI.Core.CoreWindow sender, Windows.UI.Core.KeyEventArgs args)
{
if(hasFocus)
{
Debug.Write("Key down on list");
}
}
private void myList_GotFocus(object sender, RoutedEventArgs e)
{
hasFocus = true;
}
private void myList_LostFocus(object sender, RoutedEventArgs e)
{
hasFocus = false;
}
Run Code Online (Sandbox Code Playgroud)
您还需要为您的 ListView 订阅 xaml 中的焦点事件:
<ListView .... GotFocus="myList_GotFocus" LostFocus="myList_LostFocus"/>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2063 次 |
| 最近记录: |