Browse Source

Fix browser issue with dispatcher used before initialization

pull/14225/head
Max Katz 2 years ago
parent
commit
fc43c7e3d5
  1. 5
      src/Browser/Avalonia.Browser/BrowserAppBuilder.cs
  2. 36
      src/Browser/Avalonia.Browser/BrowserSingleViewLifetime.cs

5
src/Browser/Avalonia.Browser/BrowserAppBuilder.cs

@ -58,6 +58,7 @@ public static class BrowserAppBuilder
.AfterSetup(_ =>
{
lifetime.View = new AvaloniaView(mainDivId);
lifetime.CompleteSetup();
})
.SetupWithLifetime(lifetime);
}
@ -77,6 +78,10 @@ public static class BrowserAppBuilder
var lifetime = new BrowserSingleViewLifetime();
builder
.AfterSetup(_ =>
{
lifetime.CompleteSetup();
})
.SetupWithLifetime(lifetime);
}

36
src/Browser/Avalonia.Browser/BrowserSingleViewLifetime.cs

@ -13,26 +13,18 @@ internal class BrowserSingleViewLifetime : ISingleViewApplicationLifetime, IActi
{
public BrowserSingleViewLifetime()
{
bool? initiallyVisible = InputHelper.SubscribeVisibilityChange(visible =>
_initiallyVisible = InputHelper.SubscribeVisibilityChange(visible =>
{
initiallyVisible = null;
(visible ? Activated : Deactivated)?.Invoke(this, new ActivatedEventArgs(ActivationKind.Background));
_initiallyVisible = null;
var eventToTrigger = (visible ? Activated : Deactivated);
Dispatcher.UIThread.Invoke(
() => eventToTrigger?.Invoke(this, new ActivatedEventArgs(ActivationKind.Background)),
DispatcherPriority.Background);
});
// Trigger Activated as an initial state, if web page is visible, and wasn't hidden during initialization.
if (initiallyVisible == true)
{
Dispatcher.UIThread.Invoke(() =>
{
if (initiallyVisible == true)
{
Activated?.Invoke(this, new ActivatedEventArgs(ActivationKind.Background));
}
});
}
}
public AvaloniaView? View;
private bool? _initiallyVisible;
public Control? MainView
{
@ -61,5 +53,17 @@ internal class BrowserSingleViewLifetime : ISingleViewApplicationLifetime, IActi
public event EventHandler<ActivatedEventArgs>? Deactivated;
public bool TryLeaveBackground() => false;
public bool TryEnterBackground() => true;
public bool TryEnterBackground() => false;
internal void CompleteSetup()
{
// Trigger Activated as an initial state, if web page is visible, and wasn't hidden during initialization.
Dispatcher.UIThread.Invoke(() =>
{
if (_initiallyVisible == true)
{
Activated?.Invoke(this, new ActivatedEventArgs(ActivationKind.Background));
}
}, DispatcherPriority.Background);
}
}

Loading…
Cancel
Save