diff options
author | Samantha Houts <samantha@teamredwall.com> | 2017-03-03 04:41:04 -0800 |
---|---|---|
committer | Rui Marinho <me@ruimarinho.net> | 2017-03-03 12:41:04 +0000 |
commit | bc13d3cfeeea62214f0c6f434e5f21f7117e2e1a (patch) | |
tree | 5d2e471468e8f754e8e445d2588b0b5fc4508a3c /Xamarin.Forms.ControlGallery.WindowsUniversal | |
parent | 8871077f115e7ef4d15efaa418fd718089db42c7 (diff) | |
download | xamarin-forms-bc13d3cfeeea62214f0c6f434e5f21f7117e2e1a.tar.gz xamarin-forms-bc13d3cfeeea62214f0c6f434e5f21f7117e2e1a.tar.bz2 xamarin-forms-bc13d3cfeeea62214f0c6f434e5f21f7117e2e1a.zip |
[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
Diffstat (limited to 'Xamarin.Forms.ControlGallery.WindowsUniversal')
-rw-r--r-- | Xamarin.Forms.ControlGallery.WindowsUniversal/MainPage.xaml.cs | 92 |
1 files changed, 62 insertions, 30 deletions
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); + } + } + /// <summary> /// An empty page that can be used on its own or navigated to within a Frame. /// </summary> 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<NestedNativeControlGalleryPage>(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<NativeBindingGalleryPage >(this, NativeBindingGalleryPage.ReadyForNativeBindingsMessage, AddNativeBindings); + MessagingCenter.Subscribe<NativeBindingGalleryPage>(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") }; |