|
|
@@ -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)
|