Browse Source

Use Loaded event in ReactiveUI

pull/8738/head
Max Katz 4 years ago
parent
commit
65c559e6c9
  1. 28
      src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs

28
src/Avalonia.ReactiveUI/AvaloniaActivationForViewFetcher.cs

@ -2,6 +2,7 @@ using System;
using System.Reactive.Linq;
using Avalonia.VisualTree;
using Avalonia.Controls;
using Avalonia.Interactivity;
using ReactiveUI;
namespace Avalonia.ReactiveUI
@ -25,27 +26,28 @@ namespace Avalonia.ReactiveUI
public IObservable<bool> GetActivationForView(IActivatableView view)
{
if (!(view is IVisual visual)) return Observable.Return(false);
if (view is WindowBase window) return GetActivationForWindowBase(window);
if (view is Control control) return GetActivationForControl(control);
return GetActivationForVisual(visual);
}
/// <summary>
/// Listens to Opened and Closed events for Avalonia windows.
/// Listens to Loaded and Unloaded
/// events for Avalonia Control.
/// </summary>
private IObservable<bool> GetActivationForWindowBase(WindowBase window)
private IObservable<bool> GetActivationForControl(Control control)
{
var windowLoaded = Observable
.FromEventPattern(
x => window.Opened += x,
x => window.Opened -= x)
var controlLoaded = Observable
.FromEventPattern<RoutedEventArgs>(
x => control.Loaded += x,
x => control.Loaded -= x)
.Select(args => true);
var windowUnloaded = Observable
.FromEventPattern(
x => window.Closed += x,
x => window.Closed -= x)
var controlUnloaded = Observable
.FromEventPattern<RoutedEventArgs>(
x => control.Unloaded += x,
x => control.Unloaded -= x)
.Select(args => false);
return windowLoaded
.Merge(windowUnloaded)
return controlLoaded
.Merge(controlUnloaded)
.DistinctUntilChanged();
}

Loading…
Cancel
Save