Browse Source

test workaround for double layout passes.

tmp6
Dan Walmsley 4 years ago
parent
commit
bd5f12c939
  1. 14
      src/Avalonia.Controls/Window.cs
  2. 11
      src/Avalonia.Layout/LayoutManager.cs

14
src/Avalonia.Controls/Window.cs

@ -1012,10 +1012,18 @@ namespace Avalonia.Controls
SizeToContent = sizeToContent;
}
Width = clientSize.Width;
Height = clientSize.Height;
// Setting width and height queues a layout pass.
if (LayoutManager is LayoutManager m)
{
using (m.BlockQueuing())
{
Width = clientSize.Width;
Height = clientSize.Height;
base.HandleResized(clientSize, reason);
// base.HandleResize does a layout pass. but doesnt delete the queued ones.
base.HandleResized(clientSize, reason);
}
}
}
/// <summary>

11
src/Avalonia.Layout/LayoutManager.cs

@ -2,6 +2,7 @@ using System;
using System.Buffers;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reactive.Disposables;
using Avalonia.Logging;
using Avalonia.Threading;
using Avalonia.VisualTree;
@ -315,9 +316,17 @@ namespace Avalonia.Layout
}
}
private bool _blocked;
public IDisposable BlockQueuing()
{
_blocked = true;
return Disposable.Create(() => _blocked = false);
}
private void QueueLayoutPass()
{
if (!_queued && !_running)
if (!_queued && !_running && !_blocked)
{
Dispatcher.UIThread.Post(_executeLayoutPass, DispatcherPriority.Layout);
_queued = true;

Loading…
Cancel
Save