From bc13d3cfeeea62214f0c6f434e5f21f7117e2e1a Mon Sep 17 00:00:00 2001 From: Samantha Houts Date: Fri, 3 Mar 2017 04:41:04 -0800 Subject: [Android] Don't crash if Control is accessed in Effect OnDetached when Page is Disposed. (#773) * Add repro for 51505 * [Android] Don't dispose of EffectControlProvider * Oops --- .../MainPage.xaml.cs | 92 +++++++++++++++------- 1 file changed, 62 insertions(+), 30 deletions(-) (limited to 'Xamarin.Forms.ControlGallery.WindowsUniversal') diff --git a/Xamarin.Forms.ControlGallery.WindowsUniversal/MainPage.xaml.cs b/Xamarin.Forms.ControlGallery.WindowsUniversal/MainPage.xaml.cs index 744e4d19..5f4ea08d 100644 --- a/Xamarin.Forms.ControlGallery.WindowsUniversal/MainPage.xaml.cs +++ b/Xamarin.Forms.ControlGallery.WindowsUniversal/MainPage.xaml.cs @@ -8,34 +8,59 @@ using Windows.UI.ViewManagement; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Media; +using Xamarin.Forms; +using Xamarin.Forms.ControlGallery.WindowsUniversal; using Xamarin.Forms.Controls; using Xamarin.Forms.Platform.UWP; +[assembly: ExportEffect(typeof(BorderEffect), "BorderEffect")] namespace Xamarin.Forms.ControlGallery.WindowsUniversal { + public class BorderEffect : PlatformEffect + { + protected override void OnAttached() + { + var control = Control as Control; + if (control == null) + return; + + control.Background = new SolidColorBrush(Windows.UI.Colors.Aqua); + } + + protected override void OnDetached() + { + var control = Control as Control; + if (control == null) + return; + + control.Background = new SolidColorBrush(Windows.UI.Colors.Beige); + } + } + /// /// An empty page that can be used on its own or navigated to within a Frame. /// public sealed partial class MainPage - { - public MainPage() - { - InitializeComponent(); + { + public MainPage() + { + InitializeComponent(); - var app = new Controls.App (); + var app = new Controls.App(); // When the native control gallery loads up, it'll let us know so we can add the nested native controls MessagingCenter.Subscribe(this, NestedNativeControlGalleryPage.ReadyForNativeControlsMessage, AddNativeControls); - + // When the native binding gallery loads up, it'll let us know so we can set up the native bindings - MessagingCenter.Subscribe(this, NativeBindingGalleryPage.ReadyForNativeBindingsMessage, AddNativeBindings); + MessagingCenter.Subscribe(this, NativeBindingGalleryPage.ReadyForNativeBindingsMessage, AddNativeBindings); - LoadApplication (app); - } + LoadApplication(app); + } - void AddNativeControls (NestedNativeControlGalleryPage page) + void AddNativeControls(NestedNativeControlGalleryPage page) { - if (page.NativeControlsAdded) { + if (page.NativeControlsAdded) + { return; } @@ -43,54 +68,59 @@ namespace Xamarin.Forms.ControlGallery.WindowsUniversal // Create and add a native TextBlock var originalText = "I am a native TextBlock"; - var textBlock = new TextBlock { + var textBlock = new TextBlock + { Text = originalText, FontSize = 14, - FontFamily = new FontFamily ("HelveticaNeue") + FontFamily = new FontFamily("HelveticaNeue") }; - sl?.Children.Add (textBlock); + sl?.Children.Add(textBlock); // Create and add a native Button var button = new Windows.UI.Xaml.Controls.Button { Content = "Toggle Font Size", Height = 80 }; button.Click += (sender, args) => { textBlock.FontSize = textBlock.FontSize == 14 ? 24 : 14; }; - sl?.Children.Add (button.ToView ()); + sl?.Children.Add(button.ToView()); // Create a control which we know doesn't behave correctly with regard to measurement - var difficultControl = new BrokenNativeControl { + var difficultControl = new BrokenNativeControl + { Text = "Not Sized/Arranged Properly" }; - var difficultControl2 = new BrokenNativeControl { + var difficultControl2 = new BrokenNativeControl + { Text = "Fixed" }; // Add the misbehaving controls, one with a custom delegate for ArrangeOverrideDelegate - sl?.Children.Add (difficultControl); - sl?.Children.Add (difficultControl2, - arrangeOverrideDelegate: (renderer, finalSize) => { - if (finalSize.Width <= 0 || double.IsInfinity (finalSize.Width)) { + sl?.Children.Add(difficultControl); + sl?.Children.Add(difficultControl2, + arrangeOverrideDelegate: (renderer, finalSize) => + { + if (finalSize.Width <= 0 || double.IsInfinity(finalSize.Width)) + { return null; } FrameworkElement frameworkElement = renderer.Control; - frameworkElement.Measure (finalSize); + frameworkElement.Measure(finalSize); // The broken control always tries to size itself to the screen width // So figure that out and we'll know how far off it's laying itself out - Rect bounds = ApplicationView.GetForCurrentView ().VisibleBounds; - double scaleFactor = DisplayInformation.GetForCurrentView ().RawPixelsPerViewPixel; - var screenWidth = new Size (bounds.Width * scaleFactor, bounds.Height * scaleFactor); - + Rect bounds = ApplicationView.GetForCurrentView().VisibleBounds; + double scaleFactor = DisplayInformation.GetForCurrentView().RawPixelsPerViewPixel; + var screenWidth = new Size(bounds.Width * scaleFactor, bounds.Height * scaleFactor); + // We can re-center it by offsetting it during the Arrange call double diff = Math.Abs(screenWidth.Width - finalSize.Width) / -2; - frameworkElement.Arrange (new Rect (diff, 0, finalSize.Width - diff, finalSize.Height)); + frameworkElement.Arrange(new Rect(diff, 0, finalSize.Width - diff, finalSize.Height)); // Arranging the control to the left will make it show up past the edge of the stack layout // We can fix that by clipping it manually - var clip = new RectangleGeometry { Rect = new Rect (-diff, 0, finalSize.Width, finalSize.Height) }; + var clip = new RectangleGeometry { Rect = new Rect(-diff, 0, finalSize.Width, finalSize.Height) }; frameworkElement.Clip = clip; return finalSize; @@ -107,12 +137,14 @@ namespace Xamarin.Forms.ControlGallery.WindowsUniversal StackLayout sl = page.Layout; - var txbLabel = new TextBlock { + var txbLabel = new TextBlock + { FontSize = 14, FontFamily = new FontFamily("HelveticaNeue") }; - var txbBox = new TextBox { + var txbBox = new TextBox + { FontSize = 14, FontFamily = new FontFamily("HelveticaNeue") }; -- cgit v1.2.3