|
|
|
@ -1,6 +1,7 @@ |
|
|
|
using System; |
|
|
|
using System.Collections.Generic; |
|
|
|
using System.Reflection; |
|
|
|
using System.Runtime.CompilerServices; |
|
|
|
using Avalonia.Controls; |
|
|
|
using Avalonia.Markup.Data; |
|
|
|
using Avalonia.Markup.Xaml.Converters; |
|
|
|
@ -22,9 +23,14 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions |
|
|
|
|
|
|
|
public object? ResourceKey { get; set; } |
|
|
|
|
|
|
|
public object? ProvideValue(IServiceProvider serviceProvider) |
|
|
|
// Keep instance method ProvideValue as simple as possible, increasing chance to inline it.
|
|
|
|
// With modern runtimes, inlining this method also helps to eliminate extension allocation completely.
|
|
|
|
public object? ProvideValue(IServiceProvider serviceProvider) => ProvideValue(serviceProvider, ResourceKey); |
|
|
|
|
|
|
|
[MethodImpl(MethodImplOptions.NoInlining)] |
|
|
|
private static object? ProvideValue(IServiceProvider serviceProvider, object? resourceKey) |
|
|
|
{ |
|
|
|
if (ResourceKey is not { } resourceKey) |
|
|
|
if (resourceKey is null) |
|
|
|
{ |
|
|
|
throw new ArgumentException("StaticResourceExtension.ResourceKey must be set."); |
|
|
|
} |
|
|
|
@ -87,20 +93,16 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions |
|
|
|
{ |
|
|
|
// This is stored locally to avoid allocating closure in the outer scope.
|
|
|
|
var localTargetType = targetType; |
|
|
|
var localInstance = this; |
|
|
|
var localKeyInstance = resourceKey; |
|
|
|
|
|
|
|
DelayedBinding.Add(target, property, x => localInstance.GetValue(x, localTargetType)); |
|
|
|
DelayedBinding.Add(target, property, x => |
|
|
|
ColorToBrushConverter.Convert(x.FindResource(localKeyInstance), localTargetType)); |
|
|
|
return AvaloniaProperty.UnsetValue; |
|
|
|
} |
|
|
|
|
|
|
|
throw new KeyNotFoundException($"Static resource '{resourceKey}' not found."); |
|
|
|
} |
|
|
|
|
|
|
|
private object? GetValue(StyledElement control, Type? targetType) |
|
|
|
{ |
|
|
|
return ColorToBrushConverter.Convert(control.FindResource(ResourceKey!), targetType); |
|
|
|
} |
|
|
|
|
|
|
|
internal static ThemeVariant? GetDictionaryVariant(IAvaloniaXamlIlParentStackProvider? stack) |
|
|
|
{ |
|
|
|
switch (stack) |
|
|
|
|