Browse Source

Fix tests

pull/10803/head
Tom Edwards 3 years ago
parent
commit
2a5a5d229f
  1. 41
      src/Avalonia.Controls/Presenters/ScrollContentPresenter.cs
  2. 18
      src/Avalonia.Controls/Primitives/ScrollBar.cs
  3. 8
      src/Avalonia.Controls/ScrollViewer.cs
  4. 6
      tests/Avalonia.Controls.UnitTests/ScrollViewerTests.cs

41
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);
}

18
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
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)

6
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);

Loading…
Cancel
Save