Browse Source

Merge pull request #5096 from AvaloniaUI/fixes/dynamicresource-in-application

Fix DynamicResource lookup in Application.
pull/5107/head
Dan Walmsley 6 years ago
committed by GitHub
parent
commit
b5184bf415
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 3
      src/Avalonia.Styling/ApiCompatBaseline.txt
  2. 6
      src/Avalonia.Styling/Controls/ResourceNodeExtensions.cs
  3. 18
      src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/DynamicResourceExtension.cs
  4. 17
      tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/DynamicResourceExtensionTests.cs

3
src/Avalonia.Styling/ApiCompatBaseline.txt

@ -0,0 +1,3 @@
Compat issues with assembly Avalonia.Styling:
MembersMustExist : Member 'public System.IObservable<System.Object> Avalonia.Controls.ResourceNodeExtensions.GetResourceObservable(Avalonia.IStyledElement, System.Object, System.Func<System.Object, System.Object>)' does not exist in the implementation but it does exist in the contract.
Total Issues: 1

6
src/Avalonia.Styling/Controls/ResourceNodeExtensions.cs

@ -60,7 +60,7 @@ namespace Avalonia.Controls
} }
public static IObservable<object?> GetResourceObservable( public static IObservable<object?> GetResourceObservable(
this IStyledElement control, this IResourceHost control,
object key, object key,
Func<object?, object?>? converter = null) Func<object?, object?>? converter = null)
{ {
@ -83,11 +83,11 @@ namespace Avalonia.Controls
private class ResourceObservable : LightweightObservableBase<object?> private class ResourceObservable : LightweightObservableBase<object?>
{ {
private readonly IStyledElement _target; private readonly IResourceHost _target;
private readonly object _key; private readonly object _key;
private readonly Func<object?, object?>? _converter; private readonly Func<object?, object?>? _converter;
public ResourceObservable(IStyledElement target, object key, Func<object?, object?>? converter) public ResourceObservable(IResourceHost target, object key, Func<object?, object?>? converter)
{ {
_target = target; _target = target;
_key = key; _key = key;

18
src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/DynamicResourceExtension.cs

@ -10,8 +10,7 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions
{ {
public class DynamicResourceExtension : IBinding public class DynamicResourceExtension : IBinding
{ {
private IStyledElement? _anchor; private object? _anchor;
private IResourceProvider? _resourceProvider;
public DynamicResourceExtension() public DynamicResourceExtension()
{ {
@ -30,12 +29,9 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions
if (!(provideTarget.TargetObject is IStyledElement)) if (!(provideTarget.TargetObject is IStyledElement))
{ {
_anchor = serviceProvider.GetFirstParent<IStyledElement>(); _anchor = serviceProvider.GetFirstParent<IStyledElement>() ??
serviceProvider.GetFirstParent<IResourceProvider>() ??
if (_anchor is null) (object?)serviceProvider.GetFirstParent<IResourceHost>();
{
_resourceProvider = serviceProvider.GetFirstParent<IResourceProvider>();
}
} }
return this; return this;
@ -52,16 +48,16 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions
return null; return null;
} }
var control = target as IStyledElement ?? _anchor as IStyledElement; var control = target as IResourceHost ?? _anchor as IResourceHost;
if (control != null) if (control != null)
{ {
var source = control.GetResourceObservable(ResourceKey, GetConverter(targetProperty)); var source = control.GetResourceObservable(ResourceKey, GetConverter(targetProperty));
return InstancedBinding.OneWay(source); return InstancedBinding.OneWay(source);
} }
else if (_resourceProvider is object) else if (_anchor is IResourceProvider resourceProvider)
{ {
var source = _resourceProvider.GetResourceObservable(ResourceKey, GetConverter(targetProperty)); var source = resourceProvider.GetResourceObservable(ResourceKey, GetConverter(targetProperty));
return InstancedBinding.OneWay(source); return InstancedBinding.OneWay(source);
} }

17
tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/DynamicResourceExtensionTests.cs

@ -345,6 +345,23 @@ namespace Avalonia.Markup.Xaml.UnitTests.MarkupExtensions
Assert.Equal(0xff506070, brush.Color.ToUint32()); Assert.Equal(0xff506070, brush.Color.ToUint32());
} }
[Fact]
public void DynamicResource_Can_Be_Assigned_To_Resource_Property_In_Application()
{
var xaml = @"
<Application xmlns='https://github.com/avaloniaui'
xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>
<Application.Resources>
<Color x:Key='color'>#ff506070</Color>
<SolidColorBrush x:Key='brush' Color='{DynamicResource color}'/>
</Application.Resources>
</Application>";
var application = (Application)AvaloniaRuntimeXamlLoader.Load(xaml);
var brush = (SolidColorBrush)application.Resources["brush"];
Assert.Equal(0xff506070, brush.Color.ToUint32());
}
[Fact] [Fact]
public void DynamicResource_Can_Be_Assigned_To_ItemTemplate_Property() public void DynamicResource_Can_Be_Assigned_To_ItemTemplate_Property()

Loading…
Cancel
Save