diff options
Diffstat (limited to 'Xamarin.Forms.Platform.WinRT/PageRenderer.cs')
-rw-r--r-- | Xamarin.Forms.Platform.WinRT/PageRenderer.cs | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/Xamarin.Forms.Platform.WinRT/PageRenderer.cs b/Xamarin.Forms.Platform.WinRT/PageRenderer.cs new file mode 100644 index 00000000..d33ff028 --- /dev/null +++ b/Xamarin.Forms.Platform.WinRT/PageRenderer.cs @@ -0,0 +1,80 @@ +using System.Collections.ObjectModel; +using Windows.UI.Xaml; + +#if WINDOWS_UWP + +namespace Xamarin.Forms.Platform.UWP +#else + +namespace Xamarin.Forms.Platform.WinRT +#endif +{ + public class PageRenderer : VisualElementRenderer<Page, FrameworkElement> + { + bool _disposed; + + bool _loaded; + + protected override void Dispose(bool disposing) + { + if (!disposing || _disposed) + return; + + _disposed = true; + + if (Element != null) + { + ReadOnlyCollection<Element> children = Element.LogicalChildren; + for (var i = 0; i < children.Count; i++) + { + var visualChild = children[i] as VisualElement; + visualChild?.Cleanup(); + } + Element?.SendDisappearing(); + } + + base.Dispose(); + } + + protected override void OnElementChanged(ElementChangedEventArgs<Page> e) + { + base.OnElementChanged(e); + + if (e.OldElement != null) + { + e.OldElement.SendDisappearing(); + } + + if (e.NewElement != null) + { + if (e.OldElement == null) + { + Loaded += OnLoaded; + Unloaded += OnUnloaded; + + Tracker = new BackgroundTracker<FrameworkElement>(BackgroundProperty); + } + + if (_loaded) + e.NewElement.SendAppearing(); + } + } + + void OnLoaded(object sender, RoutedEventArgs args) + { + var carouselPage = Element?.Parent as CarouselPage; + if (carouselPage != null && carouselPage.Children[0] != Element) + { + return; + } + _loaded = true; + Element?.SendAppearing(); + } + + void OnUnloaded(object sender, RoutedEventArgs args) + { + _loaded = false; + Element?.SendDisappearing(); + } + } +}
\ No newline at end of file |