设置键盘交互焦点为MenuFlyoutItem



UWP应用程序中,我使用MenuFlyoutItem来显示下拉列表。这里是xaml代码

<DropDownButton Style="{StaticResource DropDownButtonStyle1}" Name="MyDropDownButton" 
Content="{Binding SelectedLanguage}" 
RelativePanel.AlignRightWithPanel="True" 
Margin="0,20,20,0" 
FontSize="14">
<DropDownButton.Flyout>
<MenuFlyout x:Name="OptionMenu"
Placement="BottomEdgeAlignedRight">
</MenuFlyout>
</DropDownButton.Flyout>
</DropDownButton>

程序我添加MenuFlyoutItemMenuFlyout

foreach (Option option in _viewModel.Options)
{
MenuFlyoutItem item = new MenuFlyoutItem();
item.Text = option.text;
LanguagesMenu.Items.Add(item);
}

问题:当用户使用带有键盘交互的应用程序时,第一个MenuFlyoutItem是集中的。我想要不同的项目得到关注(可能是用户以前选择的项目应该得到关注)。

例子:

我有3个选项:

当用户通过键盘打开MenuFlyout时,Enter默认聚焦第一项->Left。我想要第二项->Right需要关注。

我怎样才能做到这一点。我已经阅读了这个键盘交互的官方文档,但没有发现任何想法。

您可以直接使用Control.Focus(FocusState)方法使MenuFlyoutItem进入焦点状态。我建议你在飞行中这样做。打开事件。

根据你的代码,我做了一个简单的演示,你可以检查一下。

Xaml:

<DropDownButton.Flyout>
<MenuFlyout x:Name="OptionMenu"  Placement="BottomEdgeAlignedRight" Opened="OptionMenu_Opened">
</MenuFlyout>
</DropDownButton.Flyout>

代码:

private void OptionMenu_Opened(object sender, object e)
{
// let's say we need to set the seconed item as focused
var list = OptionMenu.Items;
MenuFlyoutItem item2 = list[1] as MenuFlyoutItem;
item2.Focus(FocusState.Keyboard);
}

更新:

只在按回车键时使项目聚焦。

public Boolean IsKeyPressed = false;
private void MainPage_Loaded(object sender, RoutedEventArgs e)
{
// same code 
MenuFlyoutItem item = new MenuFlyoutItem();
item.Text = "Left";
MenuFlyoutItem item2 = new MenuFlyoutItem();
item2.Text = "Right";
MenuFlyoutItem item3 = new MenuFlyoutItem();
item3.Text = "Bottom";
OptionMenu.Items.Add(item);
OptionMenu.Items.Add(item2);
OptionMenu.Items.Add(item3);
// handle the button keydown event.
MyDropDownButton.PreviewKeyDown += MyDropDownButton_PreviewKeyDown;
}
private void MyDropDownButton_PreviewKeyDown(object sender, KeyRoutedEventArgs e)
{
//check if it is the Enter key
if (e.Key == VirtualKey.Enter)
{
IsKeyPressed = true;
Debug.WriteLine("Enter");
}
else 
{
return;
}
}
private void OptionMenu_Opened(object sender, object e)
{
Debug.WriteLine("Open");
if (IsKeyPressed) 
{
// let's say we need to set the seconed item as focused
var list = OptionMenu.Items;
MenuFlyoutItem item2 = list[1] as MenuFlyoutItem;
item2.Focus(FocusState.Keyboard);
//reset the flag  
// You could do this in other places if you want.
IsKeyPressed = false;
}

}

相关内容

  • 没有找到相关文章

最新更新