diff --git a/src/Avalonia.Base/AvaloniaObjectExtensions.cs b/src/Avalonia.Base/AvaloniaObjectExtensions.cs
index 173c5c1a94..ae61f8f642 100644
--- a/src/Avalonia.Base/AvaloniaObjectExtensions.cs
+++ b/src/Avalonia.Base/AvaloniaObjectExtensions.cs
@@ -585,6 +585,30 @@ namespace Avalonia
});
}
+ ///
+ /// Subscribes to a property changed notifications for changes that originate from a
+ /// .
+ ///
+ /// The type of the property change sender.
+ /// /// The type of the property..
+ /// The property changed observable.
+ ///
+ /// The method to call. The parameters are the sender and the event args.
+ ///
+ /// A disposable that can be used to terminate the subscription.
+ public static IDisposable AddClassHandler(
+ this IObservable> observable,
+ Action> action) where TTarget : AvaloniaObject
+ {
+ return observable.Subscribe(e =>
+ {
+ if (e.Sender is TTarget target)
+ {
+ action(target, e);
+ }
+ });
+ }
+
///
/// Subscribes to a property changed notifications for changes that originate from a
/// .
diff --git a/src/Avalonia.Controls/ApiCompatBaseline.txt b/src/Avalonia.Controls/ApiCompatBaseline.txt
index a79b3b4d7b..46c12ebd39 100644
--- a/src/Avalonia.Controls/ApiCompatBaseline.txt
+++ b/src/Avalonia.Controls/ApiCompatBaseline.txt
@@ -4,6 +4,7 @@ InterfacesShouldHaveSameMembers : Interface member 'public System.Boolean Avalon
InterfacesShouldHaveSameMembers : Interface member 'public void Avalonia.Controls.IMenuItem.StaysOpenOnClick.set(System.Boolean)' is present in the implementation but not in the contract.
InterfacesShouldHaveSameMembers : Interface member 'public void Avalonia.Controls.INativeMenuExporterEventsImplBridge.RaiseClosed()' is present in the implementation but not in the contract.
InterfacesShouldHaveSameMembers : Interface member 'public void Avalonia.Controls.INativeMenuExporterEventsImplBridge.RaiseOpening()' is present in the implementation but not in the contract.
+MembersMustExist : Member 'public Avalonia.StyledProperty Avalonia.StyledProperty Avalonia.Controls.ScrollViewer.AllowAutoHideProperty' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'public Avalonia.AvaloniaProperty Avalonia.AvaloniaProperty Avalonia.Controls.Viewbox.StretchProperty' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'public void Avalonia.Controls.Embedding.Offscreen.OffscreenTopLevelImplBase.SetCursor(Avalonia.Platform.IPlatformHandle)' does not exist in the implementation but it does exist in the contract.
MembersMustExist : Member 'public Avalonia.AvaloniaProperty Avalonia.AvaloniaProperty Avalonia.Controls.Notifications.NotificationCard.CloseOnClickProperty' does not exist in the implementation but it does exist in the contract.
@@ -11,4 +12,4 @@ EnumValuesMustMatch : Enum value 'Avalonia.Platform.ExtendClientAreaChromeHints
InterfacesShouldHaveSameMembers : Interface member 'public void Avalonia.Platform.ITopLevelImpl.SetCursor(Avalonia.Platform.ICursorImpl)' is present in the implementation but not in the contract.
InterfacesShouldHaveSameMembers : Interface member 'public void Avalonia.Platform.ITopLevelImpl.SetCursor(Avalonia.Platform.IPlatformHandle)' is present in the contract but not in the implementation.
MembersMustExist : Member 'public void Avalonia.Platform.ITopLevelImpl.SetCursor(Avalonia.Platform.IPlatformHandle)' does not exist in the implementation but it does exist in the contract.
-Total Issues: 12
+Total Issues: 13
diff --git a/src/Avalonia.Controls/ScrollViewer.cs b/src/Avalonia.Controls/ScrollViewer.cs
index 90c4e05943..559edeb204 100644
--- a/src/Avalonia.Controls/ScrollViewer.cs
+++ b/src/Avalonia.Controls/ScrollViewer.cs
@@ -176,8 +176,10 @@ namespace Avalonia.Controls
///
/// Defines the property.
///
- public static readonly StyledProperty AllowAutoHideProperty =
- ScrollBar.AllowAutoHideProperty.AddOwner();
+ public static readonly AttachedProperty AllowAutoHideProperty =
+ AvaloniaProperty.RegisterAttached(
+ nameof(AllowAutoHide),
+ true);
///
/// Defines the event.
@@ -207,8 +209,8 @@ namespace Avalonia.Controls
///
static ScrollViewer()
{
- HorizontalScrollBarVisibilityProperty.Changed.AddClassHandler((x, e) => x.ScrollBarVisibilityChanged(e));
- VerticalScrollBarVisibilityProperty.Changed.AddClassHandler((x, e) => x.ScrollBarVisibilityChanged(e));
+ HorizontalScrollBarVisibilityProperty.Changed.AddClassHandler((x, e) => x.ScrollBarVisibilityChanged(e));
+ VerticalScrollBarVisibilityProperty.Changed.AddClassHandler((x, e) => x.ScrollBarVisibilityChanged(e));
}
///
@@ -526,6 +528,26 @@ namespace Avalonia.Controls
return control.GetValue(VerticalScrollBarVisibilityProperty);
}
+ ///
+ /// Gets the value of the AllowAutoHideProperty attached property.
+ ///
+ /// The control to set the value on.
+ /// The value of the property.
+ public static void SetAllowAutoHide(Control control, bool value)
+ {
+ control.SetValue(AllowAutoHideProperty, value);
+ }
+
+ ///
+ /// Gets the value of the AllowAutoHideProperty attached property.
+ ///
+ /// The control to read the value from.
+ /// The value of the property.
+ public static bool GetAllowAutoHide(Control control)
+ {
+ return control.GetValue(AllowAutoHideProperty);
+ }
+
///
/// Gets the value of the VerticalScrollBarVisibility attached property.
///
@@ -604,10 +626,10 @@ namespace Avalonia.Controls
CalculatedPropertiesChanged();
}
- private void ScrollBarVisibilityChanged(AvaloniaPropertyChangedEventArgs e)
+ private void ScrollBarVisibilityChanged(AvaloniaPropertyChangedEventArgs e)
{
- var wasEnabled = !ScrollBarVisibility.Disabled.Equals(e.OldValue);
- var isEnabled = !ScrollBarVisibility.Disabled.Equals(e.NewValue);
+ var wasEnabled = e.OldValue.GetValueOrDefault() != ScrollBarVisibility.Disabled;
+ var isEnabled = e.NewValue.GetValueOrDefault() != ScrollBarVisibility.Disabled;
if (wasEnabled != isEnabled)
{
diff --git a/src/Avalonia.Themes.Default/ListBox.xaml b/src/Avalonia.Themes.Default/ListBox.xaml
index e91d8a6772..1ad996a1a0 100644
--- a/src/Avalonia.Themes.Default/ListBox.xaml
+++ b/src/Avalonia.Themes.Default/ListBox.xaml
@@ -13,7 +13,8 @@
+ VerticalScrollBarVisibility="{TemplateBinding (ScrollViewer.VerticalScrollBarVisibility)}"
+ AllowAutoHide="{TemplateBinding (ScrollViewer.AllowAutoHide)}">
+ VerticalScrollBarVisibility="{TemplateBinding (ScrollViewer.VerticalScrollBarVisibility)}"
+ AllowAutoHide="{TemplateBinding (ScrollViewer.AllowAutoHide)}">
+ VerticalScrollBarVisibility="{TemplateBinding (ScrollViewer.VerticalScrollBarVisibility)}"
+ AllowAutoHide="{TemplateBinding (ScrollViewer.AllowAutoHide)}">
+ VerticalScrollBarVisibility="{TemplateBinding (ScrollViewer.VerticalScrollBarVisibility)}"
+ AllowAutoHide="{TemplateBinding (ScrollViewer.AllowAutoHide)}">
+ VerticalScrollBarVisibility="{TemplateBinding (ScrollViewer.VerticalScrollBarVisibility)}"
+ AllowAutoHide="{TemplateBinding (ScrollViewer.AllowAutoHide)}">
+ VerticalScrollBarVisibility="{TemplateBinding (ScrollViewer.VerticalScrollBarVisibility)}"
+ AllowAutoHide="{TemplateBinding (ScrollViewer.AllowAutoHide)}">