diff --git a/src/UniGetUI/Controls/PackageItemContainer.cs b/src/UniGetUI/Controls/PackageItemContainer.cs
index 988d9a59b..485cc662f 100644
--- a/src/UniGetUI/Controls/PackageItemContainer.cs
+++ b/src/UniGetUI/Controls/PackageItemContainer.cs
@@ -1,3 +1,6 @@
+using Microsoft.UI.Xaml.Automation;
+using Microsoft.UI.Xaml.Automation.Peers;
+using Microsoft.UI.Xaml.Automation.Provider;
using Microsoft.UI.Xaml.Controls;
using UniGetUI.PackageEngine.Interfaces;
using UniGetUI.PackageEngine.PackageClasses;
@@ -7,6 +10,78 @@ namespace UniGetUI.Interface.Widgets
public partial class PackageItemContainer : ItemContainer
{
public IPackage? Package { get; set; }
- public PackageWrapper Wrapper { get; set; } = null!;
+
+ private PackageWrapper _wrapper = null!;
+ public PackageWrapper Wrapper
+ {
+ get => _wrapper;
+ set
+ {
+ if (_wrapper != null)
+ {
+ _wrapper.PropertyChanged -= Wrapper_PropertyChanged;
+ }
+ _wrapper = value;
+ if (_wrapper != null)
+ {
+ _wrapper.PropertyChanged += Wrapper_PropertyChanged;
+ }
+ }
+ }
+
+ private void Wrapper_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e)
+ {
+ if (e.PropertyName == nameof(PackageWrapper.IsChecked))
+ {
+ var peer = FrameworkElementAutomationPeer.FromElement(this) as PackageItemContainerAutomationPeer;
+ if (peer != null)
+ {
+ ToggleState oldState = !Wrapper.IsChecked ? ToggleState.On : ToggleState.Off;
+ ToggleState newState = Wrapper.IsChecked ? ToggleState.On : ToggleState.Off;
+ peer.RaiseToggleStatePropertyChanged(oldState, newState);
+ }
+ }
+ }
+
+ protected override AutomationPeer OnCreateAutomationPeer()
+ {
+ return new PackageItemContainerAutomationPeer(this);
+ }
+ }
+
+ public partial class PackageItemContainerAutomationPeer : FrameworkElementAutomationPeer, IToggleProvider
+ {
+ private readonly PackageItemContainer _owner;
+
+ public PackageItemContainerAutomationPeer(PackageItemContainer owner) : base(owner)
+ {
+ _owner = owner;
+ }
+
+ protected override AutomationControlType GetAutomationControlTypeCore()
+ {
+ return AutomationControlType.CheckBox;
+ }
+
+ protected override object GetPatternCore(PatternInterface patternInterface)
+ {
+ if (patternInterface == PatternInterface.Toggle)
+ {
+ return this;
+ }
+ return base.GetPatternCore(patternInterface);
+ }
+
+ public ToggleState ToggleState => (_owner.Wrapper != null && _owner.Wrapper.IsChecked) ? ToggleState.On : ToggleState.Off;
+
+ public void Toggle()
+ {
+ _owner.Wrapper?.IsChecked = !_owner.Wrapper.IsChecked;
+ }
+
+ public void RaiseToggleStatePropertyChanged(ToggleState oldValue, ToggleState newValue)
+ {
+ RaisePropertyChangedEvent(TogglePatternIdentifiers.ToggleStateProperty, oldValue, newValue);
+ }
}
}
diff --git a/src/UniGetUI/Controls/PackageWrapper.cs b/src/UniGetUI/Controls/PackageWrapper.cs
index aefd9c77e..659bb579b 100644
--- a/src/UniGetUI/Controls/PackageWrapper.cs
+++ b/src/UniGetUI/Controls/PackageWrapper.cs
@@ -31,10 +31,13 @@ public bool IsChecked
{
Package.IsChecked = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsChecked)));
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(CheckedStatus)));
_page.UpdatePackageCount();
}
}
+ public string CheckedStatus => IsChecked ? CoreTools.Translate("Checked") : CoreTools.Translate("Unchecked");
+
public bool IconWasLoaded;
public bool AlternateIdIconVisible;
public bool ShowCustomPackageIcon;
diff --git a/src/UniGetUI/MainWindow.xaml b/src/UniGetUI/MainWindow.xaml
index 27052a27a..87af24f38 100644
--- a/src/UniGetUI/MainWindow.xaml
+++ b/src/UniGetUI/MainWindow.xaml
@@ -36,6 +36,7 @@
PaneToggleRequested="TitleBar_PaneToggleRequested"
SizeChanged="TitleBar_SizeChanged"
Visibility="Collapsed"
+ IsTabStop="False"
>
@@ -285,6 +287,8 @@
HorizontalAlignment="Left"
VerticalAlignment="Top"
IsChecked="{x:Bind IsChecked, Mode=TwoWay}"
+ IsTabStop="False"
+ AutomationProperties.AccessibilityView="Raw"
/>