Browse Source

Inherit ResourceInclude from the MergeResourceInclude

pull/9577/head
Max Katz 4 years ago
parent
commit
19b9cd2ee6
  1. 63
      src/Markup/Avalonia.Markup.Xaml/Styling/MergeResourceInclude.cs

63
src/Markup/Avalonia.Markup.Xaml/Styling/MergeResourceInclude.cs

@ -2,6 +2,8 @@
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using Avalonia.Controls; using Avalonia.Controls;
#nullable enable
namespace Avalonia.Markup.Xaml.Styling; namespace Avalonia.Markup.Xaml.Styling;
/// <summary> /// <summary>
@ -12,68 +14,13 @@ namespace Avalonia.Markup.Xaml.Styling;
/// When used in runtime, this type behaves like <see cref="ResourceInclude"/>. /// When used in runtime, this type behaves like <see cref="ResourceInclude"/>.
/// </remarks> /// </remarks>
[RequiresUnreferencedCode(TrimmingMessages.StyleResourceIncludeRequiresUnreferenceCodeMessage)] [RequiresUnreferencedCode(TrimmingMessages.StyleResourceIncludeRequiresUnreferenceCodeMessage)]
public class MergeResourceInclude : IResourceProvider public class MergeResourceInclude : ResourceInclude
{ {
private readonly IServiceProvider _serviceProvider; public MergeResourceInclude(Uri? baseUri) : base(baseUri)
private readonly Uri? _baseUri;
private IResourceDictionary? _loaded;
private bool _isLoading;
/// <summary>
/// Initializes a new instance of the <see cref="ResourceInclude"/> class.
/// </summary>
/// <param name="serviceProvider">The XAML service provider.</param>
public MergeResourceInclude(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
_baseUri = serviceProvider.GetContextBaseUri();
}
/// <summary>
/// Gets the loaded resource dictionary.
/// </summary>
public IResourceDictionary Loaded
{
get
{
if (_loaded == null)
{
_isLoading = true;
var source = Source ?? throw new InvalidOperationException("MergeResourceInclude.Source must be set.");
_loaded = (IResourceDictionary)AvaloniaXamlLoader.Load(_serviceProvider, source, _baseUri);
_isLoading = false;
}
return _loaded;
}
}
public IResourceHost? Owner => Loaded.Owner;
/// <summary>
/// Gets or sets the source URL.
/// </summary>
public Uri? Source { get; set; }
bool IResourceNode.HasResources => Loaded.HasResources;
public event EventHandler? OwnerChanged
{ {
add => Loaded.OwnerChanged += value;
remove => Loaded.OwnerChanged -= value;
} }
bool IResourceNode.TryGetResource(object key, out object? value) public MergeResourceInclude(IServiceProvider serviceProvider) : base(serviceProvider)
{ {
if (!_isLoading)
{
return Loaded.TryGetResource(key, out value);
}
value = null;
return false;
} }
void IResourceProvider.AddOwner(IResourceHost owner) => Loaded.AddOwner(owner);
void IResourceProvider.RemoveOwner(IResourceHost owner) => Loaded.RemoveOwner(owner);
} }

Loading…
Cancel
Save