Browse Source

add fix for StackOverflow in resource loading.

pull/4007/head
Dan Walmsley 6 years ago
parent
commit
8f396d0570
  1. 15
      src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/ResourceInclude.cs
  2. 7
      src/Markup/Avalonia.Markup.Xaml/Styling/StyleInclude.cs

15
src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/ResourceInclude.cs

@ -12,7 +12,8 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions
public class ResourceInclude : IResourceProvider
{
private Uri? _baseUri;
private IResourceDictionary? _loaded;
private IResourceDictionary? _loaded;
private bool _isLoading;
/// <summary>
/// Gets the loaded resource dictionary.
@ -22,9 +23,11 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions
get
{
if (_loaded is null)
{
{
_isLoading = true;
var loader = new AvaloniaXamlLoader();
_loaded = (IResourceDictionary)loader.Load(Source, _baseUri);
_isLoading = false;
}
return _loaded;
@ -48,7 +51,13 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions
bool IResourceNode.TryGetResource(object key, out object? value)
{
return Loaded.TryGetResource(key, out value);
if(!_isLoading)
{
return Loaded.TryGetResource(key, out value);
}
value = null;
return false;
}
void IResourceProvider.AddOwner(IResourceHost owner) => Loaded.AddOwner(owner);

7
src/Markup/Avalonia.Markup.Xaml/Styling/StyleInclude.cs

@ -13,7 +13,8 @@ namespace Avalonia.Markup.Xaml.Styling
public class StyleInclude : IStyle, IResourceProvider
{
private readonly Uri _baseUri;
private IStyle[]? _loaded;
private IStyle[]? _loaded;
private bool _isLoading;
/// <summary>
/// Initializes a new instance of the <see cref="StyleInclude"/> class.
@ -49,9 +50,11 @@ namespace Avalonia.Markup.Xaml.Styling
{
if (_loaded is null)
{
_isLoading = true;
var loader = new AvaloniaXamlLoader();
var loaded = (IStyle)loader.Load(Source, _baseUri);
_loaded = new[] { loaded };
_isLoading = false;
}
return _loaded?[0]!;
@ -84,7 +87,7 @@ namespace Avalonia.Markup.Xaml.Styling
public bool TryGetResource(object key, out object? value)
{
if (Loaded is IResourceProvider p)
if (!_isLoading && Loaded is IResourceProvider p)
{
return p.TryGetResource(key, out value);
}

Loading…
Cancel
Save