33 changed files with 305 additions and 163 deletions
@ -0,0 +1,79 @@ |
|||||
|
using System; |
||||
|
using System.Linq; |
||||
|
using System.Reflection; |
||||
|
using Avalonia.LogicalTree; |
||||
|
using Avalonia.Reactive; |
||||
|
|
||||
|
namespace Avalonia.Controls |
||||
|
{ |
||||
|
public class NameScopeLocator |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// Tracks a named control relative to another control.
|
||||
|
/// </summary>
|
||||
|
/// <param name="relativeTo">
|
||||
|
/// The control relative from which the other control should be found.
|
||||
|
/// </param>
|
||||
|
/// <param name="name">The name of the control to find.</param>
|
||||
|
public static IObservable<object> Track(INameScope scope, string name) |
||||
|
{ |
||||
|
return new ScopeTracker(scope, name); |
||||
|
} |
||||
|
|
||||
|
private class ScopeTracker : LightweightObservableBase<object> |
||||
|
{ |
||||
|
private readonly string _name; |
||||
|
INameScope _nameScope; |
||||
|
object _value; |
||||
|
|
||||
|
public ScopeTracker(INameScope nameScope, string name) |
||||
|
{ |
||||
|
_nameScope = nameScope; |
||||
|
_name = name; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
protected override void Initialize() |
||||
|
{ |
||||
|
_nameScope.Registered += Registered; |
||||
|
_nameScope.Unregistered += Unregistered; |
||||
|
_value = _nameScope.Find<ILogical>(_name); |
||||
|
} |
||||
|
|
||||
|
protected override void Deinitialize() |
||||
|
{ |
||||
|
if (_nameScope != null) |
||||
|
{ |
||||
|
_nameScope.Registered -= Registered; |
||||
|
_nameScope.Unregistered -= Unregistered; |
||||
|
} |
||||
|
|
||||
|
_value = null; |
||||
|
} |
||||
|
|
||||
|
protected override void Subscribed(IObserver<object> observer, bool first) |
||||
|
{ |
||||
|
observer.OnNext(_value); |
||||
|
} |
||||
|
|
||||
|
private void Registered(object sender, NameScopeEventArgs e) |
||||
|
{ |
||||
|
if (e.Name == _name) |
||||
|
{ |
||||
|
_value = e.Element; |
||||
|
PublishNext(_value); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private void Unregistered(object sender, NameScopeEventArgs e) |
||||
|
{ |
||||
|
if (e.Name == _name) |
||||
|
{ |
||||
|
_value = null; |
||||
|
PublishNext(null); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -1 +1 @@ |
|||||
Subproject commit fc52295ea6c45f709bf63975026a4a18ce230be9 |
Subproject commit c2ec091f79fb4e1eea629bc823c9c24da7050022 |
||||
Loading…
Reference in new issue