diff --git a/src/Avalonia.Controls/Automation/Peers/SliderAutomationPeer.cs b/src/Avalonia.Controls/Automation/Peers/SliderAutomationPeer.cs
new file mode 100644
index 0000000000..42b15eec96
--- /dev/null
+++ b/src/Avalonia.Controls/Automation/Peers/SliderAutomationPeer.cs
@@ -0,0 +1,22 @@
+using Avalonia.Automation.Peers;
+
+namespace Avalonia.Controls.Automation.Peers
+{
+ public class SliderAutomationPeer : RangeBaseAutomationPeer
+ {
+ public SliderAutomationPeer(Slider owner) : base(owner)
+ {
+ }
+
+ override protected string GetClassNameCore()
+ {
+ return "Slider";
+ }
+
+ override protected AutomationControlType GetAutomationControlTypeCore()
+ {
+ return AutomationControlType.Slider;
+ }
+
+ }
+}
diff --git a/src/Avalonia.Controls/Slider.cs b/src/Avalonia.Controls/Slider.cs
index 828bf2a1fb..7de726a932 100644
--- a/src/Avalonia.Controls/Slider.cs
+++ b/src/Avalonia.Controls/Slider.cs
@@ -10,6 +10,7 @@ using Avalonia.Interactivity;
using Avalonia.Layout;
using Avalonia.Utilities;
using Avalonia.Automation;
+using Avalonia.Controls.Automation.Peers;
namespace Avalonia.Controls
{
@@ -380,6 +381,11 @@ namespace Avalonia.Controls
}
}
+ protected override AutomationPeer OnCreateAutomationPeer()
+ {
+ return new SliderAutomationPeer(this);
+ }
+
///
protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change)
{
diff --git a/src/Windows/Avalonia.Win32/Automation/AutomationNode.cs b/src/Windows/Avalonia.Win32/Automation/AutomationNode.cs
index 29ab2cea3a..d35443b339 100644
--- a/src/Windows/Avalonia.Win32/Automation/AutomationNode.cs
+++ b/src/Windows/Avalonia.Win32/Automation/AutomationNode.cs
@@ -22,7 +22,6 @@ namespace Avalonia.Win32.Automation
IRawElementProviderSimple,
IRawElementProviderSimple2,
IRawElementProviderFragment,
- IRawElementProviderAdviseEvents,
IInvokeProvider
{
private static Dictionary s_propertyMap = new Dictionary()
@@ -50,14 +49,31 @@ namespace Avalonia.Win32.Automation
new ConditionalWeakTable();
private readonly int[] _runtimeId;
- private int _raiseFocusChanged;
- private int _raisePropertyChanged;
public AutomationNode(AutomationPeer peer)
{
_runtimeId = new int[] { 3, GetHashCode() };
Peer = peer;
s_nodes.Add(peer, this);
+ peer.ChildrenChanged += Peer_ChildrenChanged;
+ peer.PropertyChanged += Peer_PropertyChanged;
+ }
+
+ private void Peer_ChildrenChanged(object sender, EventArgs e)
+ {
+ ChildrenChanged();
+ }
+
+ private void Peer_PropertyChanged(object sender, AutomationPropertyChangedEventArgs e)
+ {
+ if (s_propertyMap.TryGetValue(e.Property, out var id))
+ {
+ UiaCoreProviderApi.UiaRaiseAutomationPropertyChangedEvent(
+ this,
+ (int)id,
+ e.OldValue as IConvertible,
+ e.NewValue as IConvertible);
+ }
}
public AutomationPeer Peer { get; protected set; }
@@ -89,14 +105,6 @@ namespace Avalonia.Win32.Automation
0);
}
- public void PropertyChanged(AutomationProperty property, object? oldValue, object? newValue)
- {
- if (_raisePropertyChanged > 0 && s_propertyMap.TryGetValue(property, out var id))
- {
- UiaCoreProviderApi.UiaRaiseAutomationPropertyChangedEvent(this, (int)id, oldValue, newValue);
- }
- }
-
[return: MarshalAs(UnmanagedType.IUnknown)]
public virtual object? GetPatternProvider(int patternId)
{
@@ -190,32 +198,6 @@ namespace Avalonia.Win32.Automation
void IRawElementProviderSimple2.ShowContextMenu() => InvokeSync(() => Peer.ShowContextMenu());
void IInvokeProvider.Invoke() => InvokeSync((AAP.IInvokeProvider x) => x.Invoke());
- void IRawElementProviderAdviseEvents.AdviseEventAdded(int eventId, int[] properties)
- {
- switch ((UiaEventId)eventId)
- {
- case UiaEventId.AutomationPropertyChanged:
- ++_raisePropertyChanged;
- break;
- case UiaEventId.AutomationFocusChanged:
- ++_raiseFocusChanged;
- break;
- }
- }
-
- void IRawElementProviderAdviseEvents.AdviseEventRemoved(int eventId, int[] properties)
- {
- switch ((UiaEventId)eventId)
- {
- case UiaEventId.AutomationPropertyChanged:
- --_raisePropertyChanged;
- break;
- case UiaEventId.AutomationFocusChanged:
- --_raiseFocusChanged;
- break;
- }
- }
-
protected void InvokeSync(Action action)
{
if (Dispatcher.UIThread.CheckAccess())
@@ -268,15 +250,6 @@ namespace Avalonia.Win32.Automation
throw new NotSupportedException();
}
- protected void RaiseFocusChanged(AutomationNode? focused)
- {
- if (_raiseFocusChanged > 0)
- {
- UiaCoreProviderApi.UiaRaiseAutomationEvent(
- focused,
- (int)UiaEventId.AutomationFocusChanged);
- }
- }
private AutomationNode? GetRoot()
{
diff --git a/src/Windows/Avalonia.Win32/Automation/RootAutomationNode.cs b/src/Windows/Avalonia.Win32/Automation/RootAutomationNode.cs
index b732c4169f..1c6784798e 100644
--- a/src/Windows/Avalonia.Win32/Automation/RootAutomationNode.cs
+++ b/src/Windows/Avalonia.Win32/Automation/RootAutomationNode.cs
@@ -12,8 +12,11 @@ namespace Avalonia.Win32.Automation
{
[RequiresUnreferencedCode("Requires .NET COM interop")]
internal class RootAutomationNode : AutomationNode,
- IRawElementProviderFragmentRoot
+ IRawElementProviderFragmentRoot,
+ IRawElementProviderAdviseEvents
{
+ private int _raiseFocusChanged;
+
public RootAutomationNode(AutomationPeer peer)
: base(peer)
{
@@ -44,6 +47,36 @@ namespace Avalonia.Win32.Automation
return GetOrCreate(focus);
}
+ void IRawElementProviderAdviseEvents.AdviseEventAdded(int eventId, int[] properties)
+ {
+ switch ((UiaEventId)eventId)
+ {
+ case UiaEventId.AutomationFocusChanged:
+ ++_raiseFocusChanged;
+ break;
+ }
+ }
+
+ void IRawElementProviderAdviseEvents.AdviseEventRemoved(int eventId, int[] properties)
+ {
+ switch ((UiaEventId)eventId)
+ {
+ case UiaEventId.AutomationFocusChanged:
+ --_raiseFocusChanged;
+ break;
+ }
+ }
+
+ protected void RaiseFocusChanged(AutomationNode? focused)
+ {
+ if (_raiseFocusChanged > 0)
+ {
+ UiaCoreProviderApi.UiaRaiseAutomationEvent(
+ focused,
+ (int)UiaEventId.AutomationFocusChanged);
+ }
+ }
+
public void FocusChanged(object? sender, EventArgs e)
{
RaiseFocusChanged(GetOrCreate(Peer.GetFocus()));