From ef6414e5aa25f1c210c0dad182e660017f2b0e82 Mon Sep 17 00:00:00 2001 From: Andrei Date: Fri, 26 Oct 2018 00:23:11 +0300 Subject: [PATCH] [Enhancement] Possibility to change IsPassword for MacOS (#4175) fixes #2223 * https://github.com/xamarin/Xamarin.Forms/issues/2223 added possibility to change IsPassword for mac * added test case --- .../Issue2223.cs | 49 ++++++++++ ...rin.Forms.Controls.Issues.Shared.projitems | 1 + .../Renderers/EntryRenderer.cs | 92 +++++++++++-------- 3 files changed, 104 insertions(+), 38 deletions(-) create mode 100644 Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2223.cs diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2223.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2223.cs new file mode 100644 index 00000000000..c190d7272d2 --- /dev/null +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue2223.cs @@ -0,0 +1,49 @@ +using System; +using Xamarin.Forms; +using Xamarin.Forms.CustomAttributes; +using Xamarin.Forms.Internals; + +#if UITEST +using NUnit.Framework; +using Xamarin.UITest; +#endif + +namespace Xamarin.Forms.Controls.Issues +{ + [Preserve (AllMembers = true)] + [Issue (IssueTracker.Github, 2223, "Possibility to change IsPassword", PlatformAffected.macOS)] + public class Issue2223 : TestContentPage + { + protected override void Init () + { + var checkEntry = new Entry + { + HeightRequest = 100, + FontSize = 50, + Placeholder = "I can be both secure and non-secure" + }; + Content = new StackLayout + { + Padding = new Thickness(100), + Children = { + checkEntry, + new Button + { + HeightRequest = 80, + FontSize = 40, + BackgroundColor = Color.LightBlue, + TextColor = Color.Black, + Text = "Click me to change IsPassword of the entry", + Command = new Command(() => checkEntry.IsPassword = !checkEntry.IsPassword) + } + } + }; + } + +#if UITEST +#endif + + } +} + + diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems index e30ff2e06e4..4b019242710 100644 --- a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems @@ -829,6 +829,7 @@ Issue4040.xaml + diff --git a/Xamarin.Forms.Platform.MacOS/Renderers/EntryRenderer.cs b/Xamarin.Forms.Platform.MacOS/Renderers/EntryRenderer.cs index 72edb58c41c..0b3ab908e1f 100644 --- a/Xamarin.Forms.Platform.MacOS/Renderers/EntryRenderer.cs +++ b/Xamarin.Forms.Platform.MacOS/Renderers/EntryRenderer.cs @@ -95,33 +95,12 @@ protected override void OnElementChanged(ElementChangedEventArgs e) if (Control == null) { - NSTextField textField; - if (e.NewElement.IsPassword) - textField = new NSSecureTextField(); - else - { - textField = new FormsNSTextField(); - (textField as FormsNSTextField).FocusChanged += TextFieldFocusChanged; - (textField as FormsNSTextField).Completed += OnCompleted; - } - - SetNativeControl(textField); - - _defaultTextColor = textField.TextColor; - - textField.Changed += OnChanged; - textField.EditingBegan += OnEditingBegan; - textField.EditingEnded += OnEditingEnded; + CreateControl(); } if (e.NewElement != null) { - UpdatePlaceholder(); - UpdateText(); - UpdateColor(); - UpdateFont(); - UpdateAlignment(); - UpdateMaxLength(); + UpdateControl(); } } @@ -171,22 +150,59 @@ protected override void Dispose(bool disposing) if (disposing && !_disposed) { _disposed = true; - if (Control != null) + ClearControl(); + } + + base.Dispose(disposing); + } + + void CreateControl() + { + NSTextField textField; + if (Element.IsPassword) + textField = new NSSecureTextField(); + else + { + textField = new FormsNSTextField(); + (textField as FormsNSTextField).FocusChanged += TextFieldFocusChanged; + (textField as FormsNSTextField).Completed += OnCompleted; + } + + SetNativeControl(textField); + + _defaultTextColor = textField.TextColor; + + textField.Changed += OnChanged; + textField.EditingBegan += OnEditingBegan; + textField.EditingEnded += OnEditingEnded; + } + + void ClearControl() + { + if (Control != null) + { + Control.EditingBegan -= OnEditingBegan; + Control.Changed -= OnChanged; + Control.EditingEnded -= OnEditingEnded; + var formsNSTextField = (Control as FormsNSTextField); + if (formsNSTextField != null) { - Control.EditingBegan -= OnEditingBegan; - Control.Changed -= OnChanged; - Control.EditingEnded -= OnEditingEnded; - var formsNSTextField = (Control as FormsNSTextField); - if (formsNSTextField != null) - { - formsNSTextField.FocusChanged -= TextFieldFocusChanged; - formsNSTextField.Completed -= OnCompleted; - } + formsNSTextField.FocusChanged -= TextFieldFocusChanged; + formsNSTextField.Completed -= OnCompleted; } } + } - base.Dispose(disposing); + void UpdateControl() + { + UpdatePlaceholder(); + UpdateText(); + UpdateColor(); + UpdateFont(); + UpdateAlignment(); + UpdateMaxLength(); } + void TextFieldFocusChanged(object sender, BoolEventArgs e) { ElementController.SetValueFromRenderer(VisualElement.IsFocusedPropertyKey, e.Value); @@ -231,10 +247,10 @@ void UpdateColor() void UpdatePassword() { - if (Element.IsPassword && (Control is NSSecureTextField)) - return; - if (!Element.IsPassword && !(Control is NSSecureTextField)) - return; + ClearControl(); + CreateControl(); + UpdateControl(); + Layout(); } void UpdateFont()