如何使用鼠标滚轮在 UWP 的 xaml 控件之间导航?
How to Navigate between xaml controls of UWP using mouse wheel?
我正在开发一个 UWP 应用程序,其中有几个 XAML 控件(按钮、文本块、复选框等)。理想情况下,此应用程序的最终用户应该能够仅使用鼠标滚轮在这些控件之间导航(这是一种医疗设备 UI,其中显示器顶部只有鼠标滚轮可用)。现在我的问题是如何强制此应用程序使用鼠标滚轮作为控件之间导航的主要来源?
更多反馈:
1.Right 现在,当我 运行 我在 visual studio 中的应用程序时,我只看到鼠标指针,当然按钮对鼠标点击很敏感,但为了启动一个事件,我必须将鼠标悬停在该元素上并单击。默认情况下,鼠标滚轮无法用于导航和 select 控制。
2.when 我将此 UWP 应用程序旁加载到 raspberry pi 设备上,运行 那里的应用程序,在控件之间导航的唯一方法是使用附加键盘(可以导航和select 控制使用它)。再次连接的鼠标滚轮在这里不起作用。
- 我在代码中使用的控件示例如下:
xaml代码:
<Button x:Name="button1" Grid.Column="0" Grid.Row="0" Content="Button1" Click="button1_click" />
<Button x:Name="button2" Grid.Column="1" Grid.Row="0" Content="Button2" Click="button2_click" />
<Button x:Name="button3" Grid.Column="2" Grid.Row="0" Content="Button3" Click="button3_click" />
c#代码:
private void button1_click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
//do sth
}
private void button2_click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
//do sth
}
private void button3_click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
//do sth
}
在上面的代码中,无法使用鼠标滚轮在三个按钮之间导航(在 visual studio 和 raspberry pi 中)。
只是给你一个想法。
首先,您应该处理表单上所有这些项目的 tabIndex 属性并设置它们的顺序。还有什么被你触发的将在你的情况下用选项卡移动,鼠标滚轮将是 "Focused" 或 "GotFocus" 方法。所以需要像 "GotFocus" 这样的事件。您还需要处理鼠标滚轮的移动(向上或向下)。您可以 google 了解如何根据需要将 TabIndex 属性 从 tab 键覆盖到鼠标滚轮。
AGAIN ATTACHED MOUSE WHEEL IS NOT WORKING HERE.
您是如何在代码中注册 'MOUSE WHEEL' 事件的?它对我来说效果很好。
请看下面的代码示例:
<StackPanel x:Name="root" >
<Button x:Name="button1" Grid.Column="0" Grid.Row="0" Content="Button1" Click="button1_click" />
<Button x:Name="button2" Grid.Column="1" Grid.Row="0" Content="Button2" Click="button2_click" />
<Button x:Name="button3" Grid.Column="2" Grid.Row="0" Content="Button3" Click="button3_click" />
</StackPanel>
public MainPage()
{
this.InitializeComponent();
Window.Current.CoreWindow.PointerWheelChanged += CoreWindow_PointerWheelChanged;
}
private async void CoreWindow_PointerWheelChanged(Windows.UI.Core.CoreWindow sender, Windows.UI.Core.PointerEventArgs args)
{
Debug.WriteLine(args.CurrentPoint.Properties.MouseWheelDelta);
UIElement element;
if (args.CurrentPoint.Properties.MouseWheelDelta > 0)
{
element = FocusManager.FindNextFocusableElement(FocusNavigationDirection.Up);
if (element == null)
{
element = FocusManager.FindLastFocusableElement(root) as UIElement;
}
var result = await FocusManager.TryFocusAsync(element, FocusState.Keyboard);
Debug.WriteLine((element as Button).Content.ToString() + " focused: " + result.Succeeded);
}
else
{
element = FocusManager.FindNextFocusableElement(FocusNavigationDirection.Down);
if (element == null)
{
element = FocusManager.FindFirstFocusableElement(root) as UIElement;
}
var result = await FocusManager.TryFocusAsync(element, FocusState.Keyboard);
Debug.WriteLine((element as Button).Content.ToString() + " focused: " + result.Succeeded);
}
}
我正在开发一个 UWP 应用程序,其中有几个 XAML 控件(按钮、文本块、复选框等)。理想情况下,此应用程序的最终用户应该能够仅使用鼠标滚轮在这些控件之间导航(这是一种医疗设备 UI,其中显示器顶部只有鼠标滚轮可用)。现在我的问题是如何强制此应用程序使用鼠标滚轮作为控件之间导航的主要来源?
更多反馈:
1.Right 现在,当我 运行 我在 visual studio 中的应用程序时,我只看到鼠标指针,当然按钮对鼠标点击很敏感,但为了启动一个事件,我必须将鼠标悬停在该元素上并单击。默认情况下,鼠标滚轮无法用于导航和 select 控制。
2.when 我将此 UWP 应用程序旁加载到 raspberry pi 设备上,运行 那里的应用程序,在控件之间导航的唯一方法是使用附加键盘(可以导航和select 控制使用它)。再次连接的鼠标滚轮在这里不起作用。
- 我在代码中使用的控件示例如下:
xaml代码:
<Button x:Name="button1" Grid.Column="0" Grid.Row="0" Content="Button1" Click="button1_click" />
<Button x:Name="button2" Grid.Column="1" Grid.Row="0" Content="Button2" Click="button2_click" />
<Button x:Name="button3" Grid.Column="2" Grid.Row="0" Content="Button3" Click="button3_click" />
c#代码:
private void button1_click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
//do sth
}
private void button2_click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
//do sth
}
private void button3_click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
//do sth
}
在上面的代码中,无法使用鼠标滚轮在三个按钮之间导航(在 visual studio 和 raspberry pi 中)。
只是给你一个想法。 首先,您应该处理表单上所有这些项目的 tabIndex 属性并设置它们的顺序。还有什么被你触发的将在你的情况下用选项卡移动,鼠标滚轮将是 "Focused" 或 "GotFocus" 方法。所以需要像 "GotFocus" 这样的事件。您还需要处理鼠标滚轮的移动(向上或向下)。您可以 google 了解如何根据需要将 TabIndex 属性 从 tab 键覆盖到鼠标滚轮。
AGAIN ATTACHED MOUSE WHEEL IS NOT WORKING HERE.
您是如何在代码中注册 'MOUSE WHEEL' 事件的?它对我来说效果很好。
请看下面的代码示例:
<StackPanel x:Name="root" >
<Button x:Name="button1" Grid.Column="0" Grid.Row="0" Content="Button1" Click="button1_click" />
<Button x:Name="button2" Grid.Column="1" Grid.Row="0" Content="Button2" Click="button2_click" />
<Button x:Name="button3" Grid.Column="2" Grid.Row="0" Content="Button3" Click="button3_click" />
</StackPanel>
public MainPage()
{
this.InitializeComponent();
Window.Current.CoreWindow.PointerWheelChanged += CoreWindow_PointerWheelChanged;
}
private async void CoreWindow_PointerWheelChanged(Windows.UI.Core.CoreWindow sender, Windows.UI.Core.PointerEventArgs args)
{
Debug.WriteLine(args.CurrentPoint.Properties.MouseWheelDelta);
UIElement element;
if (args.CurrentPoint.Properties.MouseWheelDelta > 0)
{
element = FocusManager.FindNextFocusableElement(FocusNavigationDirection.Up);
if (element == null)
{
element = FocusManager.FindLastFocusableElement(root) as UIElement;
}
var result = await FocusManager.TryFocusAsync(element, FocusState.Keyboard);
Debug.WriteLine((element as Button).Content.ToString() + " focused: " + result.Succeeded);
}
else
{
element = FocusManager.FindNextFocusableElement(FocusNavigationDirection.Down);
if (element == null)
{
element = FocusManager.FindFirstFocusableElement(root) as UIElement;
}
var result = await FocusManager.TryFocusAsync(element, FocusState.Keyboard);
Debug.WriteLine((element as Button).Content.ToString() + " focused: " + result.Succeeded);
}
}