Browse Source

Refactor TopLevel and ItemsRepeater handling.

pull/7372/head
Dariusz Komosiński 4 years ago
parent
commit
7beafdc1d8
  1. 21
      src/Avalonia.Controls/Repeater/ItemsRepeater.cs
  2. 13
      src/Avalonia.Controls/TopLevel.cs

21
src/Avalonia.Controls/Repeater/ItemsRepeater.cs

@ -60,6 +60,7 @@ namespace Avalonia.Controls
private readonly ViewManager _viewManager;
private readonly ViewportManager _viewportManager;
private readonly TargetWeakEventSubscriber<ItemsRepeater, EventArgs> _layoutWeakSubscriber;
private IEnumerable? _items;
private VirtualizingLayoutContext? _layoutContext;
private EventHandler<ChildIndexChangedEventArgs>? _childIndexChanged;
@ -68,25 +69,25 @@ namespace Avalonia.Controls
private ItemsRepeaterElementPreparedEventArgs? _elementPreparedArgs;
private ItemsRepeaterElementClearingEventArgs? _elementClearingArgs;
private ItemsRepeaterElementIndexChangedEventArgs? _elementIndexChangedArgs;
private WeakEventSubscriber<EventArgs> _layoutWeakSubscriber = new();
/// <summary>
/// Initializes a new instance of the <see cref="ItemsRepeater"/> class.
/// </summary>
public ItemsRepeater()
{
_layoutWeakSubscriber = new TargetWeakEventSubscriber<ItemsRepeater, EventArgs>(
this, static (target, _, ev, _) =>
{
if (ev == AttachedLayout.ArrangeInvalidatedWeakEvent)
target.InvalidateArrange();
else if (ev == AttachedLayout.MeasureInvalidatedWeakEvent)
target.InvalidateMeasure();
});
_viewManager = new ViewManager(this);
_viewportManager = new ViewportManager(this);
KeyboardNavigation.SetTabNavigation(this, KeyboardNavigationMode.Once);
_layoutWeakSubscriber.Event += (_, ev, e) =>
{
if (ev == AttachedLayout.ArrangeInvalidatedWeakEvent)
InvalidateArrange();
else if (ev == AttachedLayout.MeasureInvalidatedWeakEvent)
InvalidateMeasure();
};
OnLayoutChanged(null, Layout);
}

13
src/Avalonia.Controls/TopLevel.cs

@ -91,7 +91,7 @@ namespace Avalonia.Controls
private WindowTransparencyLevel _actualTransparencyLevel;
private ILayoutManager? _layoutManager;
private Border? _transparencyFallbackBorder;
private WeakEventSubscriber<ResourcesChangedEventArgs>? _resourcesChangesSubscriber;
private TargetWeakEventSubscriber<TopLevel, ResourcesChangedEventArgs>? _resourcesChangesSubscriber;
/// <summary>
/// Initializes static members of the <see cref="TopLevel"/> class.
@ -191,11 +191,12 @@ namespace Avalonia.Controls
if (((IStyleHost)this).StylingParent is IResourceHost applicationResources)
{
_resourcesChangesSubscriber = new();
_resourcesChangesSubscriber.Event += (_, __, e) =>
{
((ILogical)this).NotifyResourcesChanged(e);
};
_resourcesChangesSubscriber = new TargetWeakEventSubscriber<TopLevel, ResourcesChangedEventArgs>(
this, static (target, _, _, e) =>
{
((ILogical)target).NotifyResourcesChanged(e);
});
ResourcesChangedWeakEvent.Subscribe(applicationResources, _resourcesChangesSubscriber);
}

Loading…
Cancel
Save