Browse Source

Merge branch 'master' into fixes/10110-binding-unset-unsubscribe

pull/10189/head
Max Katz 4 years ago
committed by GitHub
parent
commit
979135e922
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      Avalonia.Desktop.slnf
  2. 10
      samples/ControlCatalog/Pages/CustomDrawingExampleControl.cs
  3. 1
      samples/IntegrationTestApp/MainWindow.axaml
  4. 11
      samples/interop/WindowsInteropTest/Program.cs
  5. 7
      samples/interop/WindowsInteropTest/WindowsInteropTest.csproj
  6. 5
      src/Avalonia.Base/Rendering/DefaultRenderTimer.cs
  7. 5
      src/Avalonia.Base/Rendering/IRenderLoop.cs
  8. 1
      src/Avalonia.Base/Rendering/RenderLoop.cs
  9. 9
      src/Avalonia.Base/Rendering/UiThreadRenderTimer.cs
  10. 2
      src/Avalonia.Controls/Border.cs
  11. 55
      src/Avalonia.Controls/ComboBox.cs
  12. 2
      src/Avalonia.Controls/ExperimentalAcrylicBorder.cs
  13. 2
      src/Avalonia.Controls/Grid.cs
  14. 2
      src/Avalonia.Controls/Image.cs
  15. 2
      src/Avalonia.Controls/Panel.cs
  16. 2
      src/Avalonia.Controls/Presenters/ContentPresenter.cs
  17. 2
      src/Avalonia.Controls/Presenters/TextPresenter.cs
  18. 5
      src/Avalonia.Controls/Primitives/AccessText.cs
  19. 2
      src/Avalonia.Controls/Remote/RemoteWidget.cs
  20. 16
      src/Avalonia.Controls/ScrollViewer.cs
  21. 2
      src/Avalonia.Controls/Shapes/Shape.cs
  22. 8
      src/Avalonia.Controls/TextBlock.cs
  23. 2
      src/Avalonia.Controls/TickBar.cs
  24. 2
      src/Avalonia.Themes.Fluent/Controls/ListBox.xaml
  25. 9
      src/Windows/Avalonia.Win32.Interop/Wpf/WpfTopLevelImpl.cs
  26. 14
      src/Windows/Avalonia.Win32/TrayIconImpl.cs
  27. 24
      src/Windows/Avalonia.Win32/Win32Platform.cs
  28. 61
      tests/Avalonia.IntegrationTests.Appium/ComboBoxTests.cs

1
Avalonia.Desktop.slnf

@ -45,6 +45,7 @@
"tests\\Avalonia.Base.UnitTests\\Avalonia.Base.UnitTests.csproj",
"tests\\Avalonia.Benchmarks\\Avalonia.Benchmarks.csproj",
"tests\\Avalonia.Controls.DataGrid.UnitTests\\Avalonia.Controls.DataGrid.UnitTests.csproj",
"tests\\Avalonia.Controls.ItemsRepeater.UnitTests\\Avalonia.Controls.ItemsRepeater.UnitTests.csproj",
"tests\\Avalonia.Controls.UnitTests\\Avalonia.Controls.UnitTests.csproj",
"tests\\Avalonia.DesignerSupport.TestApp\\Avalonia.DesignerSupport.TestApp.csproj",
"tests\\Avalonia.DesignerSupport.Tests\\Avalonia.DesignerSupport.Tests.csproj",

10
samples/ControlCatalog/Pages/CustomDrawingExampleControl.cs

@ -59,10 +59,12 @@ namespace ControlCatalog.Pages
};
StreamGeometry sg = new StreamGeometry();
var cntx = sg.Open();
cntx.BeginFigure(new Point(-25.0d, -10.0d), false);
cntx.ArcTo(new Point(25.0d, -10.0d), new Size(10.0d, 10.0d), 0.0d, false, SweepDirection.Clockwise);
cntx.EndFigure(true);
using (var cntx = sg.Open())
{
cntx.BeginFigure(new Point(-25.0d, -10.0d), false);
cntx.ArcTo(new Point(25.0d, -10.0d), new Size(10.0d, 10.0d), 0.0d, false, SweepDirection.Clockwise);
cntx.EndFigure(true);
}
_smileGeometry = sg.Clone();
}

1
samples/IntegrationTestApp/MainWindow.axaml

@ -70,6 +70,7 @@
<ComboBoxItem>Item 0</ComboBoxItem>
<ComboBoxItem>Item 1</ComboBoxItem>
</ComboBox>
<CheckBox Name="ComboBoxWrapSelection" IsChecked="{Binding #BasicComboBox.WrapSelection}">Wrap Selection</CheckBox>
<Button Name="ComboBoxSelectionClear">Clear Selection</Button>
<Button Name="ComboBoxSelectFirst">Select First</Button>
</StackPanel>

11
samples/interop/WindowsInteropTest/Program.cs

@ -1,5 +1,4 @@
using System;
using Avalonia.Controls;
using ControlCatalog;
using Avalonia;
@ -15,7 +14,15 @@ namespace WindowsInteropTest
{
System.Windows.Forms.Application.EnableVisualStyles();
System.Windows.Forms.Application.SetCompatibleTextRenderingDefault(false);
AppBuilder.Configure<App>().UseWin32().UseDirect2D1().SetupWithoutStarting();
AppBuilder.Configure<App>()
.UseWin32()
.UseDirect2D1()
.With(new Win32PlatformOptions
{
UseWindowsUIComposition = false,
ShouldRenderOnUIThread = true // necessary for WPF
})
.SetupWithoutStarting();
System.Windows.Forms.Application.Run(new SelectorForm());
}
}

7
samples/interop/WindowsInteropTest/WindowsInteropTest.csproj

@ -2,7 +2,7 @@
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net461</TargetFramework>
<PlatformTarget>x64</PlatformTarget>
<UseWPF>true</UseWPF>
<UseWindowsForms>true</UseWindowsForms>
</PropertyGroup>
@ -10,9 +10,6 @@
<ItemGroup>
<ProjectReference Include="..\..\..\src\Avalonia.Diagnostics\Avalonia.Diagnostics.csproj" />
<ProjectReference Include="..\..\..\src\Windows\Avalonia.Win32.Interop\Avalonia.Win32.Interop.csproj" />
<ProjectReference Include="..\..\ControlCatalog\ControlCatalog.csproj">
<Project>{d0a739b9-3c68-4ba6-a328-41606954b6bd}</Project>
<Name>ControlCatalog</Name>
</ProjectReference>
<ProjectReference Include="..\..\ControlCatalog\ControlCatalog.csproj" />
</ItemGroup>
</Project>

5
src/Avalonia.Base/Rendering/DefaultRenderTimer.cs

@ -1,6 +1,4 @@
using System;
using System.Diagnostics;
using System.Threading.Tasks;
using Avalonia.Platform;
namespace Avalonia.Rendering
@ -59,7 +57,8 @@ namespace Avalonia.Rendering
}
}
public bool RunsInBackground => true;
/// <inheritdoc />
public virtual bool RunsInBackground => true;
/// <summary>
/// Starts the timer.

5
src/Avalonia.Base/Rendering/IRenderLoop.cs

@ -27,7 +27,10 @@ namespace Avalonia.Rendering
/// </summary>
/// <param name="i">The update task.</param>
void Remove(IRenderLoopTask i);
/// <summary>
/// Indicates if the rendering is done on a non-UI thread.
/// </summary>
bool RunsInBackground { get; }
}
}

1
src/Avalonia.Base/Rendering/RenderLoop.cs

@ -87,6 +87,7 @@ namespace Avalonia.Rendering
}
}
/// <inheritdoc />
public bool RunsInBackground => Timer.RunsInBackground;
private void TimerTick(TimeSpan time)

9
src/Avalonia.Base/Rendering/UiThreadRenderTimer.cs

@ -8,13 +8,20 @@ namespace Avalonia.Rendering
/// <summary>
/// Render timer that ticks on UI thread. Useful for debugging or bootstrapping on new platforms
/// </summary>
public class UiThreadRenderTimer : DefaultRenderTimer
{
/// <summary>
/// Initializes a new instance of the <see cref="UiThreadRenderTimer"/> class.
/// </summary>
/// <param name="framesPerSecond">The number of frames per second at which the loop should run.</param>
public UiThreadRenderTimer(int framesPerSecond) : base(framesPerSecond)
{
}
/// <inheritdoc />
public override bool RunsInBackground => false;
/// <inheritdoc />
protected override IDisposable StartCore(Action<TimeSpan> tick)
{
bool cancelled = false;

2
src/Avalonia.Controls/Border.cs

@ -225,7 +225,7 @@ namespace Avalonia.Controls
/// Renders the control.
/// </summary>
/// <param name="context">The drawing context.</param>
public override void Render(DrawingContext context)
public sealed override void Render(DrawingContext context)
{
_borderRenderHelper.Render(context, Bounds.Size, LayoutThickness, CornerRadius, Background, BorderBrush,
BoxShadow, BorderDashOffset, BorderLineCap, BorderLineJoin, BorderDashArray);

55
src/Avalonia.Controls/ComboBox.cs

@ -1,19 +1,19 @@
using System;
using System.Diagnostics;
using System.Linq;
using Avalonia.Automation.Peers;
using Avalonia.Reactive;
using Avalonia.Controls.Generators;
using Avalonia.Controls.Mixins;
using Avalonia.Controls.Presenters;
using Avalonia.Controls.Metadata;
using Avalonia.Controls.Primitives;
using Avalonia.Controls.Selection;
using Avalonia.Controls.Shapes;
using Avalonia.Controls.Templates;
using Avalonia.Controls.Utils;
using Avalonia.Input;
using Avalonia.Interactivity;
using Avalonia.Layout;
using Avalonia.Media;
using Avalonia.Reactive;
using Avalonia.VisualTree;
using Avalonia.Controls.Metadata;
namespace Avalonia.Controls
{
@ -219,7 +219,7 @@ namespace Avalonia.Controls
}
else if (e.Key == Key.Up)
{
SelectPrev();
SelectPrevious();
e.Handled = true;
}
}
@ -250,7 +250,7 @@ namespace Avalonia.Controls
if (e.Delta.Y < 0)
SelectNext();
else
SelectPrev();
SelectPrevious();
e.Handled = true;
}
@ -478,19 +478,40 @@ namespace Avalonia.Controls
}
}
private void SelectNext()
{
if (ItemCount >= 1)
{
MoveSelection(NavigationDirection.Next, WrapSelection);
}
}
private void SelectNext() => MoveSelection(SelectedIndex, 1, WrapSelection);
private void SelectPrevious() => MoveSelection(SelectedIndex, -1, WrapSelection);
private void SelectPrev()
private void MoveSelection(int startIndex, int step, bool wrap)
{
if (ItemCount >= 1)
static bool IsSelectable(object? o) => (o as AvaloniaObject)?.GetValue(IsEnabledProperty) ?? true;
var count = ItemCount;
for (int i = startIndex + step; i != startIndex; i += step)
{
MoveSelection(NavigationDirection.Previous, WrapSelection);
if (i < 0 || i >= count)
{
if (wrap)
{
if (i < 0)
i += count;
else if (i >= count)
i %= count;
}
else
{
return;
}
}
var item = ItemsView[i];
var container = ContainerFromIndex(i);
if (IsSelectable(item) && IsSelectable(container))
{
SelectedIndex = i;
break;
}
}
}
}

2
src/Avalonia.Controls/ExperimentalAcrylicBorder.cs

@ -80,7 +80,7 @@ namespace Avalonia.Controls
_subscription?.Dispose();
}
public override void Render(DrawingContext context)
public sealed override void Render(DrawingContext context)
{
if (context.PlatformImpl is IDrawingContextWithAcrylicLikeSupport idc)
{

2
src/Avalonia.Controls/Grid.cs

@ -3256,7 +3256,7 @@ namespace Avalonia.Controls
/// <summary>
/// UpdateRenderBounds.
/// </summary>
public override void Render(DrawingContext drawingContext)
public sealed override void Render(DrawingContext drawingContext)
{
var grid = this.GetVisualParent<Grid>();

2
src/Avalonia.Controls/Image.cs

@ -73,7 +73,7 @@ namespace Avalonia.Controls
/// Renders the control.
/// </summary>
/// <param name="context">The drawing context.</param>
public override void Render(DrawingContext context)
public sealed override void Render(DrawingContext context)
{
var source = Source;

2
src/Avalonia.Controls/Panel.cs

@ -68,7 +68,7 @@ namespace Avalonia.Controls
/// Renders the visual to a <see cref="DrawingContext"/>.
/// </summary>
/// <param name="context">The drawing context.</param>
public override void Render(DrawingContext context)
public sealed override void Render(DrawingContext context)
{
var background = Background;
if (background != null)

2
src/Avalonia.Controls/Presenters/ContentPresenter.cs

@ -534,7 +534,7 @@ namespace Avalonia.Controls.Presenters
}
/// <inheritdoc/>
public override void Render(DrawingContext context)
public sealed override void Render(DrawingContext context)
{
_borderRenderer.Render(context, Bounds.Size, LayoutThickness, CornerRadius, Background, BorderBrush,
BoxShadow);

2
src/Avalonia.Controls/Presenters/TextPresenter.cs

@ -388,7 +388,7 @@ namespace Avalonia.Controls.Presenters
TextLayout.Draw(context, new Point(left, top));
}
public override void Render(DrawingContext context)
public sealed override void Render(DrawingContext context)
{
var selectionStart = SelectionStart;
var selectionEnd = SelectionEnd;

5
src/Avalonia.Controls/Primitives/AccessText.cs

@ -60,10 +60,9 @@ namespace Avalonia.Controls.Primitives
/// Renders the <see cref="AccessText"/> to a drawing context.
/// </summary>
/// <param name="context">The drawing context.</param>
public override void Render(DrawingContext context)
protected internal override void RenderCore(DrawingContext context)
{
base.Render(context);
base.RenderCore(context);
int underscore = Text?.IndexOf('_') ?? -1;
if (underscore != -1 && ShowAccessKey)

2
src/Avalonia.Controls/Remote/RemoteWidget.cs

@ -69,7 +69,7 @@ namespace Avalonia.Controls.Remote
base.ArrangeCore(finalRect);
}
public override void Render(DrawingContext context)
public sealed override void Render(DrawingContext context)
{
if (_lastFrame != null && _lastFrame.Width != 0 && _lastFrame.Height != 0)
{

16
src/Avalonia.Controls/ScrollViewer.cs

@ -775,6 +775,22 @@ namespace Avalonia.Controls
control.SetValue(VerticalScrollBarVisibilityProperty, value);
}
/// <summary>
/// Gets whether scroll gestures should include inertia in their behavior and value.
/// </summary>
public static bool GetIsScrollInertiaEnabled(Control control)
{
return control.GetValue(IsScrollInertiaEnabledProperty);
}
/// <summary>
/// Sets whether scroll gestures should include inertia in their behavior and value.
/// </summary>
public static void SetIsScrollInertiaEnabled(Control control, bool value)
{
control.SetValue(IsScrollInertiaEnabledProperty, value);
}
/// <inheritdoc/>
public void RegisterAnchorCandidate(Control element)
{

2
src/Avalonia.Controls/Shapes/Shape.cs

@ -193,7 +193,7 @@ namespace Avalonia.Controls.Shapes
set { SetValue(StrokeJoinProperty, value); }
}
public override void Render(DrawingContext context)
public sealed override void Render(DrawingContext context)
{
var geometry = RenderedGeometry;

8
src/Avalonia.Controls/TextBlock.cs

@ -549,7 +549,13 @@ namespace Avalonia.Controls
/// Renders the <see cref="TextBlock"/> to a drawing context.
/// </summary>
/// <param name="context">The drawing context.</param>
public override void Render(DrawingContext context)
public sealed override void Render(DrawingContext context)
{
RenderCore(context);
}
// Workaround to seal Render method, we need to make so because AccessText was overriding Render method which is sealed now.
internal protected virtual void RenderCore(DrawingContext context)
{
var background = Background;

2
src/Avalonia.Controls/TickBar.cs

@ -213,7 +213,7 @@ namespace Avalonia.Controls
///
/// Brush that use to fill ticks is specified by Fill property.
/// </summary>
public override void Render(DrawingContext dc)
public sealed override void Render(DrawingContext dc)
{
var size = new Size(Bounds.Width, Bounds.Height);
var range = Maximum - Minimum;

2
src/Avalonia.Themes.Fluent/Controls/ListBox.xaml

@ -19,6 +19,7 @@
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled" />
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto" />
<Setter Property="ScrollViewer.IsScrollChainingEnabled" Value="True" />
<Setter Property="ScrollViewer.IsScrollInertiaEnabled" Value="True" />
<Setter Property="FontSize" Value="{DynamicResource ControlContentThemeFontSize}" />
<Setter Property="Template">
<ControlTemplate>
@ -34,6 +35,7 @@
HorizontalScrollBarVisibility="{TemplateBinding (ScrollViewer.HorizontalScrollBarVisibility)}"
VerticalScrollBarVisibility="{TemplateBinding (ScrollViewer.VerticalScrollBarVisibility)}"
IsScrollChainingEnabled="{TemplateBinding (ScrollViewer.IsScrollChainingEnabled)}"
IsScrollInertiaEnabled="{TemplateBinding (ScrollViewer.IsScrollInertiaEnabled)}"
AllowAutoHide="{TemplateBinding (ScrollViewer.AllowAutoHide)}">
<ItemsPresenter Name="PART_ItemsPresenter"
AreVerticalSnapPointsRegular="{TemplateBinding AreVerticalSnapPointsRegular}"

9
src/Windows/Avalonia.Win32.Interop/Wpf/WpfTopLevelImpl.cs

@ -45,13 +45,6 @@ namespace Avalonia.Win32.Interop.Wpf
((FrameworkElement)PlatformImpl)?.InvalidateMeasure();
}
protected override void HandleResized(Size clientSize, PlatformResizeReason reason)
{
ClientSize = clientSize;
LayoutManager.ExecuteLayoutPass();
Renderer?.Resized(clientSize);
}
public Size AllocatedSize => ClientSize;
}
@ -223,7 +216,7 @@ namespace Avalonia.Win32.Interop.Wpf
(Key)e.Key,
GetModifiers(null)));
protected override void OnTextInput(TextCompositionEventArgs e)
protected override void OnTextInput(TextCompositionEventArgs e)
=> _ttl.Input?.Invoke(new RawTextInputEventArgs(_keyboard, (uint) e.Timestamp, _inputRoot, e.Text));
void ITopLevelImpl.SetCursor(ICursorImpl cursor)

14
src/Windows/Avalonia.Win32/TrayIconImpl.cs

@ -81,19 +81,18 @@ namespace Avalonia.Win32
private void UpdateIcon(bool remove = false)
{
var iconData = new NOTIFYICONDATA()
var iconData = new NOTIFYICONDATA
{
hWnd = Win32Platform.Instance.Handle,
uID = _uniqueId,
uFlags = NIF.TIP | NIF.MESSAGE,
uCallbackMessage = (int)CustomWindowsMessage.WM_TRAYMOUSE,
hIcon = _icon?.HIcon ?? s_emptyIcon,
szTip = _tooltipText ?? ""
uID = _uniqueId
};
if (!remove)
{
iconData.uFlags |= NIF.ICON;
iconData.uFlags = NIF.TIP | NIF.MESSAGE | NIF.ICON;
iconData.uCallbackMessage = (int)CustomWindowsMessage.WM_TRAYMOUSE;
iconData.hIcon = _icon?.HIcon ?? s_emptyIcon;
iconData.szTip = _tooltipText ?? "";
if (!_iconAdded)
{
@ -107,6 +106,7 @@ namespace Avalonia.Win32
}
else
{
iconData.uFlags = 0;
Shell_NotifyIcon(NIM.DELETE, iconData);
_iconAdded = false;
}

24
src/Windows/Avalonia.Win32/Win32Platform.cs

@ -6,12 +6,10 @@ using System.IO;
using Avalonia.Reactive;
using System.Runtime.InteropServices;
using System.Threading;
using Avalonia.Controls;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Controls.Platform;
using Avalonia.Input;
using Avalonia.Input.Platform;
using Avalonia.Media;
using Avalonia.OpenGL;
using Avalonia.Platform;
using Avalonia.Rendering;
@ -20,7 +18,6 @@ using Avalonia.Threading;
using Avalonia.Utilities;
using Avalonia.Win32.Input;
using Avalonia.Win32.Interop;
using Avalonia.Win32.WinRT;
using static Avalonia.Win32.Interop.UnmanagedMethods;
namespace Avalonia
@ -68,6 +65,7 @@ namespace Avalonia
/// <summary>
/// Render Avalonia to a Texture inside the Windows.UI.Composition tree.
/// This setting is true by default.
/// </summary>
/// <remarks>
/// Supported on Windows 10 build 16299 and above. Ignored on other versions.
@ -88,9 +86,19 @@ namespace Avalonia
/// This is only recommended if low input latency is desirable, and there is no need for the transparency
/// and stylings / blurrings offered by <see cref="UseWindowsUIComposition"/><br/>
/// This is mutually exclusive with
/// <see cref="UseWindowsUIComposition"/> which if active will override this setting.
/// <see cref="UseWindowsUIComposition"/> which if active will override this setting.
/// This setting is false by default.
/// </summary>
public bool UseLowLatencyDxgiSwapChain { get; set; } = false;
public bool UseLowLatencyDxgiSwapChain { get; set; }
/// <summary>
/// Render directly on the UI thread instead of using a dedicated render thread.
/// Only applicable if both <see cref="UseWindowsUIComposition"/> and <see cref="UseLowLatencyDxgiSwapChain"/>
/// are false.
/// This setting is only recommended for interop with systems that must render on the UI thread, such as WPF.
/// This setting is false by default.
/// </summary>
public bool ShouldRenderOnUIThread { get; set; }
/// <summary>
/// Provides a way to use a custom-implemented graphics context such as a custom ISkiaGpu
@ -128,7 +136,7 @@ namespace Avalonia.Win32
internal static bool UseOverlayPopups => Options.OverlayPopups;
public static Win32PlatformOptions Options { get; private set; }
internal static Compositor Compositor { get; private set; }
public static void Initialize()
@ -139,6 +147,8 @@ namespace Avalonia.Win32
public static void Initialize(Win32PlatformOptions options)
{
Options = options;
var renderTimer = options.ShouldRenderOnUIThread ? new UiThreadRenderTimer(60) : new DefaultRenderTimer(60);
AvaloniaLocator.CurrentMutable
.Bind<IClipboard>().ToSingleton<ClipboardImpl>()
.Bind<ICursorFactory>().ToConstant(CursorFactory.Instance)
@ -146,7 +156,7 @@ namespace Avalonia.Win32
.Bind<IPlatformSettings>().ToSingleton<Win32PlatformSettings>()
.Bind<IPlatformThreadingInterface>().ToConstant(s_instance)
.Bind<IRenderLoop>().ToConstant(new RenderLoop())
.Bind<IRenderTimer>().ToConstant(new DefaultRenderTimer(60))
.Bind<IRenderTimer>().ToConstant(renderTimer)
.Bind<IWindowingPlatform>().ToConstant(s_instance)
.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration(KeyModifiers.Control)
{

61
tests/Avalonia.IntegrationTests.Appium/ComboBoxTests.cs

@ -47,7 +47,64 @@ namespace Avalonia.IntegrationTests.Appium
}
[PlatformFact(TestPlatforms.Windows)]
public void Can_Change_Selection_With_Keyboard()
public void Can_Change_Selection_With_Keyboard_When_Closed()
{
var comboBox = _session.FindElementByAccessibilityId("BasicComboBox");
var wrap = _session.FindElementByAccessibilityId("ComboBoxWrapSelection");
if (wrap.GetIsChecked() != false)
wrap.Click();
_session.FindElementByAccessibilityId("ComboBoxSelectionClear").Click();
comboBox.SendKeys(Keys.ArrowDown);
Assert.Equal("Item 0", comboBox.GetComboBoxValue());
comboBox.SendKeys(Keys.ArrowDown);
Assert.Equal("Item 1", comboBox.GetComboBoxValue());
comboBox.SendKeys(Keys.ArrowDown);
Assert.Equal("Item 1", comboBox.GetComboBoxValue());
comboBox.SendKeys(Keys.ArrowUp);
Assert.Equal("Item 0", comboBox.GetComboBoxValue());
comboBox.SendKeys(Keys.ArrowUp);
Assert.Equal("Item 0", comboBox.GetComboBoxValue());
}
[PlatformFact(TestPlatforms.Windows)]
public void Can_Change_Wrapping_Selection_With_Keyboard_When_Closed()
{
var comboBox = _session.FindElementByAccessibilityId("BasicComboBox");
var wrap = _session.FindElementByAccessibilityId("ComboBoxWrapSelection");
if (wrap.GetIsChecked() != true)
wrap.Click();
_session.FindElementByAccessibilityId("ComboBoxSelectionClear").Click();
comboBox.SendKeys(Keys.ArrowDown);
Assert.Equal("Item 0", comboBox.GetComboBoxValue());
comboBox.SendKeys(Keys.ArrowDown);
Assert.Equal("Item 1", comboBox.GetComboBoxValue());
comboBox.SendKeys(Keys.ArrowDown);
Assert.Equal("Item 0", comboBox.GetComboBoxValue());
comboBox.SendKeys(Keys.ArrowDown);
Assert.Equal("Item 1", comboBox.GetComboBoxValue());
comboBox.SendKeys(Keys.ArrowUp);
Assert.Equal("Item 0", comboBox.GetComboBoxValue());
comboBox.SendKeys(Keys.ArrowUp);
Assert.Equal("Item 1", comboBox.GetComboBoxValue());
}
[PlatformFact(TestPlatforms.Windows)]
public void Can_Change_Selection_When_Open_With_Keyboard()
{
var comboBox = _session.FindElementByAccessibilityId("BasicComboBox");
@ -64,7 +121,7 @@ namespace Avalonia.IntegrationTests.Appium
}
[PlatformFact(TestPlatforms.Windows)]
public void Can_Change_Selection_With_Keyboard_From_Unselected()
public void Can_Change_Selection_When_Open_With_Keyboard_From_Unselected()
{
var comboBox = _session.FindElementByAccessibilityId("BasicComboBox");

Loading…
Cancel
Save