csharpc-sharpdotnetxamlavaloniauicross-platformcross-platform-xamlavaloniaguimulti-platformuser-interfacedotnetcore
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
1.9 KiB
72 lines
1.9 KiB
using System;
|
|
using System.ComponentModel;
|
|
using Avalonia.Controls;
|
|
|
|
#nullable enable
|
|
|
|
namespace Avalonia.Markup.Xaml.MarkupExtensions
|
|
{
|
|
/// <summary>
|
|
/// Loads a resource dictionary from a specified URL.
|
|
/// </summary>
|
|
public class ResourceInclude : IResourceProvider
|
|
{
|
|
private Uri? _baseUri;
|
|
private IResourceDictionary? _loaded;
|
|
private bool _isLoading;
|
|
|
|
/// <summary>
|
|
/// Gets the loaded resource dictionary.
|
|
/// </summary>
|
|
public IResourceDictionary Loaded
|
|
{
|
|
get
|
|
{
|
|
if (_loaded == null)
|
|
{
|
|
_isLoading = true;
|
|
_loaded = (IResourceDictionary)AvaloniaXamlLoader.Load(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)
|
|
{
|
|
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);
|
|
|
|
public ResourceInclude ProvideValue(IServiceProvider serviceProvider)
|
|
{
|
|
var tdc = (ITypeDescriptorContext)serviceProvider;
|
|
_baseUri = tdc?.GetContextBaseUri();
|
|
return this;
|
|
}
|
|
}
|
|
}
|
|
|