Browse Source

Fix context menu keyboard selection. (#16354)

When opening a context menu and pressing the "arrow down" key, the first menu item was not selected. This issue was introduced by #11287. The fix is to make the `ContextMenu` focusable.

Added an integration test to try to prevent regressions.

Co-authored-by: Max Katz <maxkatz6@outlook.com>
release/11.0.13
Steven Kirk 2 years ago
parent
commit
c407354b58
  1. 13
      samples/IntegrationTestApp/MainWindow.axaml
  2. 1
      src/Avalonia.Themes.Fluent/Controls/ContextMenu.xaml
  3. 1
      src/Avalonia.Themes.Simple/Controls/ContextMenu.xaml
  4. 36
      tests/Avalonia.IntegrationTests.Appium/ContextMenuTests.cs
  5. 3
      tests/Avalonia.IntegrationTests.Appium/ElementExtensions.cs

13
samples/IntegrationTestApp/MainWindow.axaml

@ -94,6 +94,19 @@
</StackPanel> </StackPanel>
</TabItem> </TabItem>
<TabItem Header="ContextMenu">
<StackPanel>
<Button Name="ShowContextMenu" Content="Right-click to show context menu.">
<Button.ContextMenu>
<ContextMenu>
<MenuItem Name="ContextMenuItem1" Header="Item 1"/>
<MenuItem Name="ContextMenuItem2" Header="Item 2"/>
</ContextMenu>
</Button.ContextMenu>
</Button>
</StackPanel>
</TabItem>
<TabItem Header="Gestures"> <TabItem Header="Gestures">
<DockPanel> <DockPanel>
<DockPanel DockPanel.Dock="Top"> <DockPanel DockPanel.Dock="Top">

1
src/Avalonia.Themes.Fluent/Controls/ContextMenu.xaml

@ -38,6 +38,7 @@
<Setter Property="BorderBrush" Value="{DynamicResource MenuFlyoutPresenterBorderBrush}" /> <Setter Property="BorderBrush" Value="{DynamicResource MenuFlyoutPresenterBorderBrush}" />
<Setter Property="BorderThickness" Value="{DynamicResource MenuFlyoutPresenterBorderThemeThickness}" /> <Setter Property="BorderThickness" Value="{DynamicResource MenuFlyoutPresenterBorderThemeThickness}" />
<Setter Property="CornerRadius" Value="{DynamicResource OverlayCornerRadius}" /> <Setter Property="CornerRadius" Value="{DynamicResource OverlayCornerRadius}" />
<Setter Property="Focusable" Value="True" />
<Setter Property="MaxWidth" Value="{DynamicResource FlyoutThemeMaxWidth}" /> <Setter Property="MaxWidth" Value="{DynamicResource FlyoutThemeMaxWidth}" />
<Setter Property="MinHeight" Value="{DynamicResource MenuFlyoutThemeMinHeight}" /> <Setter Property="MinHeight" Value="{DynamicResource MenuFlyoutThemeMinHeight}" />
<Setter Property="Padding" Value="{DynamicResource MenuFlyoutPresenterThemePadding}" /> <Setter Property="Padding" Value="{DynamicResource MenuFlyoutPresenterThemePadding}" />

1
src/Avalonia.Themes.Simple/Controls/ContextMenu.xaml

@ -6,6 +6,7 @@
<Setter Property="Background" Value="{DynamicResource ThemeBackgroundBrush}" /> <Setter Property="Background" Value="{DynamicResource ThemeBackgroundBrush}" />
<Setter Property="BorderBrush" Value="{DynamicResource ThemeBorderMidBrush}" /> <Setter Property="BorderBrush" Value="{DynamicResource ThemeBorderMidBrush}" />
<Setter Property="BorderThickness" Value="1" /> <Setter Property="BorderThickness" Value="1" />
<Setter Property="Focusable" Value="True" />
<Setter Property="Padding" Value="4,2" /> <Setter Property="Padding" Value="4,2" />
<Setter Property="TextBlock.FontSize" Value="{DynamicResource FontSizeNormal}" /> <Setter Property="TextBlock.FontSize" Value="{DynamicResource FontSizeNormal}" />
<Setter Property="TextBlock.FontWeight" Value="Normal" /> <Setter Property="TextBlock.FontWeight" Value="Normal" />

36
tests/Avalonia.IntegrationTests.Appium/ContextMenuTests.cs

@ -0,0 +1,36 @@
using OpenQA.Selenium;
using OpenQA.Selenium.Appium;
using OpenQA.Selenium.Interactions;
using Xunit;
namespace Avalonia.IntegrationTests.Appium
{
[Collection("Default")]
public class ContextMenuTests
{
private readonly AppiumDriver<AppiumWebElement> _session;
public ContextMenuTests(DefaultAppFixture fixture)
{
_session = fixture.Session;
var tabs = _session.FindElementByAccessibilityId("MainTabs");
var tab = tabs.FindElementByName("ContextMenu");
tab.Click();
}
[PlatformFact(TestPlatforms.Windows)]
public void Select_First_Item_With_Down_Arrow_Key()
{
var control = _session.FindElementByAccessibilityId("ShowContextMenu");
new Actions(_session)
.ContextClick(control)
.SendKeys(Keys.ArrowDown)
.Perform();
var clickedMenuItem = _session.FindElementByAccessibilityId("ContextMenuItem1");
Assert.True(clickedMenuItem.GetIsFocused());
}
}
}

3
tests/Avalonia.IntegrationTests.Appium/ElementExtensions.cs

@ -58,8 +58,7 @@ namespace Avalonia.IntegrationTests.Appium
{ {
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{ {
var active = element.WrappedDriver.SwitchTo().ActiveElement() as AppiumWebElement; return element.GetAttribute("HasKeyboardFocus") == "True";
return element.Id == active?.Id;
} }
else else
{ {

Loading…
Cancel
Save