Browse Source

Use custom rx for ResourceObservable.

pull/1690/head
Steven Kirk 8 years ago
parent
commit
a8d5dc1da4
  1. 39
      src/Avalonia.Styling/Controls/ResourceProviderExtensions.cs

39
src/Avalonia.Styling/Controls/ResourceProviderExtensions.cs

@ -1,6 +1,7 @@
using System;
using System.Reactive;
using System.Reactive.Linq;
using Avalonia.Reactive;
namespace Avalonia.Controls
{
@ -55,11 +56,39 @@ namespace Avalonia.Controls
public static IObservable<object> GetResourceObservable(this IResourceNode target, string key)
{
return Observable.FromEventPattern<ResourcesChangedEventArgs>(
x => target.ResourcesChanged += x,
x => target.ResourcesChanged -= x)
.StartWith((EventPattern<ResourcesChangedEventArgs>)null)
.Select(x => target.FindResource(key));
return new ResourceObservable(target, key);
}
private class ResourceObservable : LightweightObservableBase<object>
{
private readonly IResourceNode _target;
private readonly string _key;
public ResourceObservable(IResourceNode target, string key)
{
_target = target;
_key = key;
}
protected override void Initialize()
{
_target.ResourcesChanged += ResourcesChanged;
}
protected override void Deinitialize()
{
_target.ResourcesChanged -= ResourcesChanged;
}
protected override void Subscribed(IObserver<object> observer, bool first)
{
observer.OnNext(_target.FindResource(_key));
}
private void ResourcesChanged(object sender, ResourcesChangedEventArgs e)
{
PublishNext(_target.FindResource(_key));
}
}
}
}

Loading…
Cancel
Save