浏览代码

Fix tests

Tom Edwards 2 年之前
父节点
当前提交
2a5a5d229f

+ 29 - 12
src/Avalonia.Controls/Presenters/ScrollContentPresenter.cs

@@ -98,6 +98,7 @@ namespace Avalonia.Controls.Presenters
         private double _verticalSnapPointOffset;
         private double _horizontalSnapPointOffset;
         private CompositeDisposable? _ownerSubscriptions;
+        private ScrollViewer? _owner;
 
         /// <summary>
         /// Initializes static members of the <see cref="ScrollContentPresenter"/> class.
@@ -305,7 +306,7 @@ namespace Avalonia.Controls.Presenters
         {
             _ownerSubscriptions?.Dispose();
 
-            var owner = this.FindAncestorOfType<ScrollViewer>();
+            var owner = _owner = this.FindAncestorOfType<ScrollViewer>();
 
             if (owner == null)
             {
@@ -314,17 +315,11 @@ namespace Avalonia.Controls.Presenters
 
             var subscriptionDisposables = new IDisposable?[]
             {
-                IfUnset(CanHorizontallyScrollProperty, p => Bind(p, owner.GetObservable(ScrollViewer.HorizontalScrollBarVisibilityProperty).Select(NotDisabled), Data.BindingPriority.Template)),
-                IfUnset(CanVerticallyScrollProperty, p => Bind(p, owner.GetObservable(ScrollViewer.VerticalScrollBarVisibilityProperty).Select(NotDisabled), Data.BindingPriority.Template)),
-                IfUnset(OffsetProperty, p => new CompositeDisposable(
-                    Bind(p, owner.GetBindingObservable(ScrollViewer.OffsetProperty), Data.BindingPriority.Template),
-                    this.GetObservable(OffsetProperty).Subscribe(v => owner.SetCurrentValue(OffsetProperty, v)))),
+                IfUnset(CanHorizontallyScrollProperty, p => Bind(p, owner.GetObservable(ScrollViewer.HorizontalScrollBarVisibilityProperty, NotDisabled), Data.BindingPriority.Template)),
+                IfUnset(CanVerticallyScrollProperty, p => Bind(p, owner.GetObservable(ScrollViewer.VerticalScrollBarVisibilityProperty, NotDisabled), Data.BindingPriority.Template)),
+                IfUnset(OffsetProperty, p => Bind(p, owner.GetBindingObservable(ScrollViewer.OffsetProperty), Data.BindingPriority.Template)),
                 IfUnset(IsScrollChainingEnabledProperty, p => Bind(p, owner.GetBindingObservable(ScrollViewer.IsScrollChainingEnabledProperty), Data.BindingPriority.Template)),
                 IfUnset(ContentProperty, p => Bind(p, owner.GetBindingObservable(ContentProperty), Data.BindingPriority.Template)),
-
-                // read-only properties on ScrollViewer with internal setters:
-                this.GetObservable(ExtentProperty).Subscribe(v => owner.Extent = v),
-                this.GetObservable(ViewportProperty).Subscribe(v => owner.Viewport = v)
             }.Where(d => d != null).Cast<IDisposable>().ToArray();
 
             _ownerSubscriptions = new CompositeDisposable(subscriptionDisposables);
@@ -338,6 +333,7 @@ namespace Avalonia.Controls.Presenters
         protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e)
         {
             _ownerSubscriptions?.Dispose();
+            _owner = null;
             base.OnDetachedFromVisualTree(e);
         }
 
@@ -670,9 +666,14 @@ namespace Avalonia.Controls.Presenters
 
         protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change)
         {
-            if (change.Property == OffsetProperty && !_arranging)
+            if (change.Property == OffsetProperty)
             {
-                InvalidateArrange();
+                if (!_arranging)
+                {
+                    InvalidateArrange();
+                }
+
+                _owner?.SetCurrentValue(OffsetProperty, change.GetNewValue<Vector>());
             }
             else if (change.Property == ContentProperty)
             {
@@ -699,6 +700,22 @@ namespace Avalonia.Controls.Presenters
             {
                 UpdateSnapPoints();
             }
+            else if (change.Property == ExtentProperty)
+            {
+                if (_owner != null)
+                {
+                    _owner.Extent = change.GetNewValue<Size>();
+                }
+                CoerceValue(OffsetProperty);
+            }
+            else if (change.Property == ViewportProperty && _owner != null)
+            {
+                if (_owner != null)
+                {
+                    _owner.Viewport = change.GetNewValue<Size>();
+                }
+                CoerceValue(OffsetProperty);
+            }
 
             base.OnPropertyChanged(change);
         }

+ 11 - 7
src/Avalonia.Controls/Primitives/ScrollBar.cs

@@ -84,6 +84,7 @@ namespace Avalonia.Controls.Primitives
         private DispatcherTimer? _timer;
         private bool _isExpanded;
         private CompositeDisposable? _ownerSubscriptions;
+        private ScrollViewer? _owner;
 
         /// <summary>
         /// Initializes static members of the <see cref="ScrollBar"/> class. 
@@ -203,7 +204,7 @@ namespace Avalonia.Controls.Primitives
         {
             _ownerSubscriptions?.Dispose();
 
-            var owner = this.FindAncestorOfType<ScrollViewer>();
+            var owner = _owner = this.FindAncestorOfType<ScrollViewer>();
 
             if (owner == null)
             {
@@ -214,11 +215,9 @@ namespace Avalonia.Controls.Primitives
 
             var subscriptionDisposables = new IDisposable?[]
             {
-                IfUnset(MaximumProperty, p => Bind(p, owner.GetObservable(ScrollViewer.ScrollBarMaximumProperty).Select(ExtractOrdinate), BindingPriority.Template)),
-                IfUnset(ValueProperty, p => new CompositeDisposable(
-                        Bind(p, owner.GetObservable(ScrollViewer.OffsetProperty).Select(ExtractOrdinate), BindingPriority.Template),
-                        this.GetObservable(ValueProperty).Subscribe(v => SetScrollViewerOffset(owner, v)))),
-                IfUnset(ViewportSizeProperty, p => Bind(p, owner.GetObservable(ScrollViewer.ViewportProperty).Select(ExtractOrdinate), BindingPriority.Template)),
+                IfUnset(MaximumProperty, p => Bind(p, owner.GetObservable(ScrollViewer.ScrollBarMaximumProperty, ExtractOrdinate), BindingPriority.Template)),
+                IfUnset(ValueProperty, p => Bind(p, owner.GetObservable(ScrollViewer.OffsetProperty, ExtractOrdinate), BindingPriority.Template)),
+                IfUnset(ViewportSizeProperty, p => Bind(p, owner.GetObservable(ScrollViewer.ViewportProperty, ExtractOrdinate), BindingPriority.Template)),
                 IfUnset(VisibilityProperty, p => Bind(p, owner.GetObservable(visibilitySource), BindingPriority.Template)),
                 IfUnset(AllowAutoHideProperty, p => Bind(p, owner.GetObservable(ScrollViewer.AllowAutoHideProperty), BindingPriority.Template)),
                 IfUnset(LargeChangeProperty, p => Bind(p, owner.GetObservable(ScrollViewer.LargeChangeProperty).Select(ExtractOrdinate), BindingPriority.Template)),
@@ -232,11 +231,11 @@ namespace Avalonia.Controls.Primitives
 
         private double ExtractOrdinate(Vector v) => Orientation == Orientation.Horizontal ? v.X : v.Y;
         private double ExtractOrdinate(Size v) => Orientation == Orientation.Horizontal ? v.Width : v.Height;
-        private void SetScrollViewerOffset(ScrollViewer viewer, double value) => viewer.SetCurrentValue(ScrollViewer.OffsetProperty, Orientation == Orientation.Horizontal ? viewer.Offset.WithX(value) : viewer.Offset.WithY(value));
 
         protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e)
         {
             _ownerSubscriptions?.Dispose();
+            _owner = null;
             base.OnDetachedFromVisualTree(e);
         }
 
@@ -267,6 +266,11 @@ namespace Avalonia.Controls.Primitives
             {
                 UpdateIsExpandedState();
             }
+            else if (change.Property == ValueProperty)
+            {
+                var value = change.GetNewValue<double>();
+                _owner?.SetCurrentValue(ScrollViewer.OffsetProperty, Orientation == Orientation.Horizontal ? _owner.Offset.WithX(value) : _owner.Offset.WithY(value));
+            }
             else
             {
                 if (change.Property == MinimumProperty ||

+ 8 - 0
src/Avalonia.Controls/ScrollViewer.cs

@@ -683,6 +683,14 @@ namespace Avalonia.Controls
             {
                 CalculatedPropertiesChanged();
             }
+            else if (change.Property == ExtentProperty)
+            {
+                CoerceValue(OffsetProperty);
+            }
+            else if (change.Property == ViewportProperty)
+            {
+                CoerceValue(OffsetProperty);
+            }
         }
 
         protected override void OnKeyDown(KeyEventArgs e)

+ 3 - 3
tests/Avalonia.Controls.UnitTests/ScrollViewerTests.cs

@@ -225,8 +225,8 @@ namespace Avalonia.Controls.UnitTests
             var root = new TestRoot(target);
             var raised = 0;
 
-            target.SetValue(ScrollViewer.ExtentProperty, new Size(100, 100));
-            target.SetValue(ScrollViewer.ViewportProperty, new Size(50, 50));
+            target.Extent = new (100, 100);
+            target.Viewport = new(50, 50);
             target.Offset = new Vector(50, 50);
 
             root.LayoutManager.ExecuteInitialLayoutPass();
@@ -239,7 +239,7 @@ namespace Avalonia.Controls.UnitTests
                 ++raised;
             };
 
-            target.SetValue(ScrollViewer.ExtentProperty, new Size(70, 70));
+            target.Extent = new(70, 70);
 
             Assert.Equal(0, raised);