在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>
程序我添加MenuFlyoutItem
到MenuFlyout
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;
}
}