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