diff options
author | E.Z. Hart <hartez@users.noreply.github.com> | 2016-04-19 01:01:58 -0600 |
---|---|---|
committer | Jason Smith <jason.smith@xamarin.com> | 2016-04-19 00:01:58 -0700 |
commit | a98f3fb2aae3c5b6a3fa5140e51f51ec67843a49 (patch) | |
tree | 654fa47cbd3cc889061466939630dcd5133cc837 | |
parent | 89a50d4bc1f4aaf83d5f92a28c2a7a96282cc0d3 (diff) | |
download | xamarin-forms-a98f3fb2aae3c5b6a3fa5140e51f51ec67843a49.tar.gz xamarin-forms-a98f3fb2aae3c5b6a3fa5140e51f51ec67843a49.tar.bz2 xamarin-forms-a98f3fb2aae3c5b6a3fa5140e51f51ec67843a49.zip |
Add TextColor Property to Picker, TimePicker, DatePicker (#84)
* Add TextColor property to TimePicker
Add TextColor page to TimePicker gallery
Add TimePicker color toggling to color toggle test page
Split color toggle tests up among tabs
* Implement TimePicker.TextColor in iOS
* Implement TimePicker.TextColor for WinRT tablet
* Add IsEnabled=false tests to DefaultColorToggleTest Button and TimePicker
Consolidate ColorStates array
Fix IsEnabled changing color bug on iOS
* Implement TimePicker.TextColor for WP8
* Add TextColor property to DatePicker
Add DatePicker section to DefaultColorToggleTest
Impement DatePicker.TextColor for WP8
* Implement DatePicker.TextColor for WinRT/UWP/Windows Phone 8.1
* Implement DatePicker.TextColor for iOS
* Add TextColor to DatePicker Gallery Page
* Implement DatePicker.TextColor for Android
* Add Picker Gallery page for TextColor
Implement Picker.TextColor on Android
Consolidate TextColor management for Button, Picker, DatePicker, TimePicker
Implement
* Add untracked TextColorSwitcher
Implement Picker.TextColor in iOS
* Implement Picker.TextColor in WinRT/UWP/Windows Phone 8.1
Remove Pioker Loaded handlers in Dispose
* Implement Picker.TextColor in WP8
* Removed unused field
Update ignored warnings
* Update docs
* Use nameof() for BindableProperties
* Cleanup
* Fix custom renderer crashes for classes using TextColorSwitcher
* Correct property name references
* Fix typo and 'if' formatting
* Add missing else
30 files changed, 917 insertions, 219 deletions
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/DefaultColorToggleTest.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/DefaultColorToggleTest.cs index 6f6cec09..9bd8c146 100644 --- a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/DefaultColorToggleTest.cs +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/DefaultColorToggleTest.cs @@ -1,146 +1,477 @@ -using Xamarin.Forms.CustomAttributes; +using System; +using System.Collections.Generic; +using Xamarin.Forms.CustomAttributes; namespace Xamarin.Forms.Controls { [Preserve (AllMembers=true)] [Issue (IssueTracker.None, 0, "Default colors toggle test", PlatformAffected.All)] - public class DefaultColorToggleTest : ContentPage + public class DefaultColorToggleTest : TabbedPage { - Button _buttonColorDefaultToggle; - Button _buttonColorInitted; - Label _labelColorDefaultToggle; - Label _labelColorInitted; + public DefaultColorToggleTest() + { + Title = "Test Color Toggle Page"; + + Children.Add(PickerPage()); + Children.Add(DatePickerPage()); + Children.Add(TimePickerPage()); + Children.Add(ButtonPage()); + Children.Add(LabelPage()); + Children.Add(EntryPage()); + Children.Add(PasswordPage()); + Children.Add(SearchBarPage()); + } + + static ContentPage PasswordPage() + { + var passwordColorDefaultToggle = new Entry() { IsPassword = true, Text = "Default Password Color" }; + var passwordColorInit = new Entry() { IsPassword = true, Text = "Should Be Red", TextColor = Color.Red }; + var passwordToggleButton = new Button() { Text = "Toggle Password Box (Default)" }; + passwordToggleButton.Clicked += (sender, args) => { + if (passwordColorDefaultToggle.TextColor.IsDefault) + { + passwordColorDefaultToggle.TextColor = Color.Red; + passwordToggleButton.Text = "Toggle Password Box (Red)"; + } + else + { + passwordColorDefaultToggle.TextColor = Color.Default; + passwordToggleButton.Text = "Toggle Password Box (Default)"; + } + }; + + return new ContentPage { + Title = "Password", + Content = new StackLayout { + VerticalOptions = LayoutOptions.Fill, + HorizontalOptions = LayoutOptions.Fill, + Children = + { + passwordColorDefaultToggle, + passwordToggleButton, + passwordColorInit + } + } + }; + } + + static ContentPage SearchBarPage() + { + var searchbarTextColorDefaultToggle = new Entry() { Text = "Default SearchBar Text Color" }; + var searchbarTextColorToggleButton = new Button() { Text = "Toggle SearchBar Color" }; + searchbarTextColorToggleButton.Clicked += (sender, args) => { + if (searchbarTextColorDefaultToggle.TextColor.IsDefault) + { + searchbarTextColorDefaultToggle.TextColor = Color.Fuchsia; + searchbarTextColorDefaultToggle.Text = "Should Be Fuchsia"; + } + else + { + searchbarTextColorDefaultToggle.TextColor = Color.Default; + searchbarTextColorDefaultToggle.Text = "Default SearchBar Text Color"; + } + }; + + var searchbarPlaceholderColorDefaultToggle = new Entry() { Placeholder = "Default Placeholder Color" }; + var searchbarPlaceholderToggleButton = new Button() { Text = "Toggle Placeholder Color" }; + searchbarPlaceholderToggleButton.Clicked += (sender, args) => { + if (searchbarPlaceholderColorDefaultToggle.PlaceholderColor.IsDefault) + { + searchbarPlaceholderColorDefaultToggle.PlaceholderColor = Color.Lime; + searchbarPlaceholderColorDefaultToggle.Placeholder = "Should Be Lime"; + } + else + { + searchbarPlaceholderColorDefaultToggle.PlaceholderColor = Color.Default; + searchbarPlaceholderColorDefaultToggle.Placeholder = "Default Placeholder Color"; + } + }; + + return new ContentPage { + Title = "SearchBar", + Content = new StackLayout { + VerticalOptions = LayoutOptions.Fill, + HorizontalOptions = LayoutOptions.Fill, + Children = + { + searchbarTextColorDefaultToggle, + searchbarTextColorToggleButton, + searchbarPlaceholderColorDefaultToggle, + searchbarPlaceholderToggleButton + } + } + }; + } - public DefaultColorToggleTest () + static ContentPage ButtonPage() { - _buttonColorDefaultToggle = new Button { - Text = "Default Button Color" + const string defaultLabel = "Default Color (Click To Toggle)"; + + var buttonColorDefaultToggle = new Button { + Text = defaultLabel }; - _buttonColorInitted = new Button { - Text = "I should be red", + var buttonColorInitted = new Button { + Text = "This Should Always Be Red", TextColor = Color.Red }; - _labelColorDefaultToggle = new Label { - Text = "Default Label Color" + const string disabledText = "Button is Disabled; Should have default disabled color."; + var buttonColorDisabled = new Button + { + Text = disabledText, + TextColor = Color.Green, + IsEnabled = false }; - _labelColorInitted = new Label { - Text = "I should be blue", - TextColor = Color.Blue + var buttonDisableOtherButton = new Button() + { + Text = "Toggle IsEnabled" }; - _buttonColorDefaultToggle.Clicked += (s, e) => { - if (_buttonColorDefaultToggle.TextColor == Color.Default) { - _buttonColorDefaultToggle.TextColor = Color.Red; - _buttonColorDefaultToggle.Text = "Custom Button Color"; - } else { - _buttonColorDefaultToggle.TextColor = Color.Default; - _buttonColorDefaultToggle.Text = "Default Button Color"; + buttonDisableOtherButton.Clicked += (sender, args) => + { + buttonColorDisabled.IsEnabled = !buttonColorDisabled.IsEnabled; + if (!buttonColorDisabled.IsEnabled) + { + buttonColorDisabled.Text = disabledText; + } + else + { + buttonColorDisabled.Text = "Button is Enabled; Should Be Green"; } - }; - _labelColorDefaultToggle.GestureRecognizers.Add (new TapGestureRecognizer{Command = new Command (o=>{ - if (_labelColorDefaultToggle.TextColor == Color.Default) { - _labelColorDefaultToggle.TextColor = Color.Green; - _labelColorDefaultToggle.Text = "Custom Label Color"; - } else { - _labelColorDefaultToggle.TextColor = Color.Default; - _labelColorDefaultToggle.Text = "Default Label Color"; + buttonColorDefaultToggle.Clicked += (s, e) => { + if (buttonColorDefaultToggle.TextColor == Color.Default) + { + buttonColorDefaultToggle.TextColor = Color.Red; + buttonColorDefaultToggle.Text = "Custom Color (Click To Toggle)"; } - })}); + else + { + buttonColorDefaultToggle.TextColor = Color.Default; + buttonColorDefaultToggle.Text = defaultLabel; + } + + }; + + return new ContentPage { + Title = "Button", + Content = new StackLayout + { + VerticalOptions = LayoutOptions.Fill, + HorizontalOptions = LayoutOptions.Fill, + Children = + { + buttonColorDefaultToggle, + buttonColorInitted, + buttonColorDisabled, + buttonDisableOtherButton + } + } + }; + } - var entryTextColorDefaultToggle = new Entry () { Text = "Default Entry Text Color" }; - var entryTextColorInit = new Entry () { Text = "Should Be Red", TextColor = Color.Red }; - var entryToggleButton = new Button () { Text = "Toggle Entry Color" }; - entryToggleButton.Clicked += (sender, args) => { - if (entryTextColorDefaultToggle.TextColor.IsDefault) { + static ContentPage LabelPage() + { + const string defaultText = "Default Label Color (Tap To Toggle)"; + + var labelColorDefaultToggle = new Label { + Text = defaultText + }; + + var labelColorInitted = new Label { + Text = "Should Always Be Blue", + TextColor = Color.Blue + }; + + labelColorDefaultToggle.GestureRecognizers.Add(new TapGestureRecognizer { + Command = new Command(o => { + if (labelColorDefaultToggle.TextColor == Color.Default) + { + labelColorDefaultToggle.TextColor = Color.Green; + labelColorDefaultToggle.Text = "Custom Label Color (Tap To Toggle)"; + } + else + { + labelColorDefaultToggle.TextColor = Color.Default; + labelColorDefaultToggle.Text = defaultText; + } + }) + }); + + return new ContentPage { + Title = "Label", + Content = new StackLayout { + VerticalOptions = LayoutOptions.Fill, + HorizontalOptions = LayoutOptions.Fill, + Children = + { + labelColorDefaultToggle, + labelColorInitted + } + } + }; + } + + static ContentPage EntryPage() + { + var entryTextColorInit = new Entry { Text = "Should Always Be Red", TextColor = Color.Red }; + var entryPlaceholderColorInit = new Entry { Placeholder = "Should Always Be Lime", PlaceholderColor = Color.Lime }; + + const string defaultEntryColor = "Default Entry Text Color"; + var entryTextColorDefaultToggle = new Entry { Text = defaultEntryColor }; + + var entryToggleButton = new Button { Text = "Toggle Entry Color" }; + entryToggleButton.Clicked += (sender, args) => + { + if (entryTextColorDefaultToggle.TextColor.IsDefault) + { entryTextColorDefaultToggle.TextColor = Color.Fuchsia; entryTextColorDefaultToggle.Text = "Should Be Fuchsia"; - } else { + } + else + { entryTextColorDefaultToggle.TextColor = Color.Default; - entryTextColorDefaultToggle.Text = "Default Entry Text Color"; + entryTextColorDefaultToggle.Text = defaultEntryColor; } }; - var entryPlaceholderColorDefaultToggle = new Entry () { Placeholder = "Default Placeholder Color" }; - var entryPlaceholderColorInit = new Entry () { Placeholder = "Should Be Lime", PlaceholderColor = Color.Lime }; - var entryPlaceholderToggleButton = new Button () { Text = "Toggle Placeholder Color" }; - entryPlaceholderToggleButton.Clicked += (sender, args) => { - if (entryPlaceholderColorDefaultToggle.PlaceholderColor.IsDefault) { + const string defaultPlaceholderColorText = "Default Placeholder Color"; + var entryPlaceholderColorDefaultToggle = new Entry { Placeholder = defaultPlaceholderColorText }; + + var entryPlaceholderToggleButton = new Button { Text = "Toggle Placeholder Color" }; + entryPlaceholderToggleButton.Clicked += (sender, args) => + { + if (entryPlaceholderColorDefaultToggle.PlaceholderColor.IsDefault) + { entryPlaceholderColorDefaultToggle.PlaceholderColor = Color.Lime; entryPlaceholderColorDefaultToggle.Placeholder = "Should Be Lime"; - } else { + } + else + { entryPlaceholderColorDefaultToggle.PlaceholderColor = Color.Default; - entryPlaceholderColorDefaultToggle.Placeholder = "Default Placeholder Color"; + entryPlaceholderColorDefaultToggle.Placeholder = defaultPlaceholderColorText; } }; - var passwordColorDefaultToggle = new Entry () { IsPassword = true, Text = "Default Password Color" }; - var passwordColorInit = new Entry () { IsPassword = true, Text = "Should Be Red", TextColor = Color.Red }; - var passwordToggleButton = new Button () { Text = "Toggle Password Box (Default)" }; - passwordToggleButton.Clicked += (sender, args) => { - if (passwordColorDefaultToggle.TextColor.IsDefault) { - passwordColorDefaultToggle.TextColor = Color.Red; - passwordToggleButton.Text = "Toggle Password Box (Red)"; - } else { - passwordColorDefaultToggle.TextColor = Color.Default; - passwordToggleButton.Text = "Toggle Password Box (Default)"; + return new ContentPage + { + Title = "Entry", + Content = new StackLayout + { + VerticalOptions = LayoutOptions.Fill, + HorizontalOptions = LayoutOptions.Fill, + Children = + { + entryTextColorDefaultToggle, + entryToggleButton, + entryTextColorInit, + entryPlaceholderColorDefaultToggle, + entryPlaceholderToggleButton, + entryPlaceholderColorInit + } } }; + } - var searchbarTextColorDefaultToggle = new Entry () { Text = "Default SearchBar Text Color" }; - var searchbarTextColorToggleButton = new Button () { Text = "Toggle SearchBar Color" }; - searchbarTextColorToggleButton.Clicked += (sender, args) => { - if (searchbarTextColorDefaultToggle.TextColor.IsDefault) { - searchbarTextColorDefaultToggle.TextColor = Color.Fuchsia; - searchbarTextColorDefaultToggle.Text = "Should Be Fuchsia"; - } else { - searchbarTextColorDefaultToggle.TextColor = Color.Default; - searchbarTextColorDefaultToggle.Text = "Default SearchBar Text Color"; + static ContentPage TimePickerPage() + { + var timePickerInit = new TimePicker { Time = new TimeSpan(11, 34, 00), TextColor = Color.Red }; + var timePickerColorDefaultToggle = new TimePicker { Time = new TimeSpan(11, 34, 00) }; + + var defaultText = "Should have default color text"; + var timePickerColorLabel = new Label() {Text = defaultText }; + + var toggleButton = new Button { Text = "Toggle TimePicker Text Color" }; + toggleButton.Clicked += (sender, args) => { + if (timePickerColorDefaultToggle.TextColor.IsDefault) + { + timePickerColorDefaultToggle.TextColor = Color.Fuchsia; + timePickerColorLabel.Text = "Should have fuchsia text"; + } + else + { + timePickerColorDefaultToggle.TextColor = Color.Default; + timePickerColorLabel.Text = defaultText; } }; - var searchbarPlaceholderColorDefaultToggle = new Entry () { Placeholder = "Default Placeholder Color" }; - var searchbarPlaceholderToggleButton = new Button () { Text = "Toggle Placeholder Color" }; - searchbarPlaceholderToggleButton .Clicked += (sender, args) => { - if (searchbarPlaceholderColorDefaultToggle.PlaceholderColor.IsDefault) { - searchbarPlaceholderColorDefaultToggle.PlaceholderColor = Color.Lime; - searchbarPlaceholderColorDefaultToggle.Placeholder = "Should Be Lime"; - } else { - searchbarPlaceholderColorDefaultToggle.PlaceholderColor = Color.Default; - searchbarPlaceholderColorDefaultToggle.Placeholder = "Default Placeholder Color"; + const string disabledText = "TimePicker is Disabled; Should have default disabled color."; + var timePickerDisabledlabel = new Label { Text = disabledText}; + var timePickerColorDisabled = new TimePicker { + IsEnabled = false, + TextColor = Color.Green + }; + + var buttonToggleEnabled = new Button() { + Text = "Toggle IsEnabled" + }; + + buttonToggleEnabled.Clicked += (sender, args) => { + timePickerColorDisabled.IsEnabled = !timePickerColorDisabled.IsEnabled; + if (!timePickerColorDisabled.IsEnabled) + { + timePickerDisabledlabel.Text = disabledText; + } + else + { + timePickerDisabledlabel.Text = "TimePicker is Enabled; Should Be Green"; } }; - Title = "Test Color Toggle Page"; + return new ContentPage { + Title = "TimePicker", + Padding = new Thickness(0, Device.OnPlatform(20, 0, 0), 0, Device.OnPlatform(00, 0, 0)), + Content = new StackLayout { + VerticalOptions = LayoutOptions.Fill, + HorizontalOptions = LayoutOptions.Fill, + Children = + { + timePickerColorLabel, + timePickerColorDefaultToggle, + toggleButton, + timePickerInit, + timePickerDisabledlabel, + timePickerColorDisabled, + buttonToggleEnabled + } + } + }; + } + + static ContentPage DatePickerPage() + { + var pickerInit = new DatePicker { Date = new DateTime(1978, 12, 24), TextColor = Color.Red }; + var pickerColorDefaultToggle = new DatePicker { Date = new DateTime(1978, 12, 24) }; + + var defaultText = "Should have default color text"; + var pickerColorLabel = new Label { Text = defaultText }; - Content = new ScrollView () { + var toggleButton = new Button { Text = "Toggle DatePicker Text Color" }; + toggleButton.Clicked += (sender, args) => { + if (pickerColorDefaultToggle.TextColor.IsDefault) + { + pickerColorDefaultToggle.TextColor = Color.Fuchsia; + pickerColorLabel.Text = "Should have fuchsia text"; + } + else + { + pickerColorDefaultToggle.TextColor = Color.Default; + pickerColorLabel.Text = defaultText; + } + }; + + const string disabledText = "DatePicker is Disabled; Should have default disabled color."; + var pickerDisabledlabel = new Label { Text = disabledText }; + var pickerColorDisabled = new DatePicker { + IsEnabled = false, + TextColor = Color.Green + }; + + var buttonToggleEnabled = new Button() { + Text = "Toggle IsEnabled" + }; + + buttonToggleEnabled.Clicked += (sender, args) => { + pickerColorDisabled.IsEnabled = !pickerColorDisabled.IsEnabled; + if (!pickerColorDisabled.IsEnabled) + { + pickerDisabledlabel.Text = disabledText; + } + else + { + pickerDisabledlabel.Text = "DatePicker is Enabled; Should Be Green"; + } + }; + + return new ContentPage { + Title = "DatePicker", + Padding = new Thickness(0, Device.OnPlatform(20, 0, 0), 0, Device.OnPlatform(00, 0, 0)), Content = new StackLayout { - Children = { - _buttonColorDefaultToggle, - _buttonColorInitted, - _labelColorDefaultToggle, - _labelColorInitted, - entryTextColorDefaultToggle, - entryToggleButton, - entryTextColorInit, - entryPlaceholderColorDefaultToggle, - entryPlaceholderToggleButton, - entryPlaceholderColorInit, - passwordColorDefaultToggle, - passwordToggleButton, - passwordColorInit, - searchbarTextColorDefaultToggle, - searchbarTextColorToggleButton, - searchbarPlaceholderColorDefaultToggle, - searchbarPlaceholderToggleButton + VerticalOptions = LayoutOptions.Fill, + HorizontalOptions = LayoutOptions.Fill, + Children = + { + pickerColorLabel, + pickerColorDefaultToggle, + toggleButton, + pickerInit, + pickerDisabledlabel, + pickerColorDisabled, + buttonToggleEnabled } } }; } + static ContentPage PickerPage() + { + var pickerInit = new Picker { TextColor = Color.Red, Items = { "Item 1", "Item 2", "Item 3" }, SelectedIndex = 1 }; + + var pickerColorDefaultToggle = new Picker { Items = { "Item 1", "Item 2", "Item 3" } , SelectedIndex = 1 }; + + var defaultText = "Should have default color text"; + var pickerColorLabel = new Label { Text = defaultText }; + + var toggleButton = new Button { Text = "Toggle Picker Text Color" }; + toggleButton.Clicked += (sender, args) => { + if (pickerColorDefaultToggle.TextColor.IsDefault) + { + pickerColorDefaultToggle.TextColor = Color.Fuchsia; + pickerColorLabel.Text = "Should have fuchsia text"; + } + else + { + pickerColorDefaultToggle.TextColor = Color.Default; + pickerColorLabel.Text = defaultText; + } + }; + + const string disabledText = "Picker is Disabled; Should have default disabled color."; + var pickerDisabledlabel = new Label { Text = disabledText }; + var pickerColorDisabled = new Picker { + IsEnabled = false, + TextColor = Color.Green, + Items = { "Item 1", "Item 2", "Item 3" }, + SelectedIndex = 1 + }; + + var buttonToggleEnabled = new Button() { + Text = "Toggle IsEnabled" + }; + + buttonToggleEnabled.Clicked += (sender, args) => { + pickerColorDisabled.IsEnabled = !pickerColorDisabled.IsEnabled; + if (!pickerColorDisabled.IsEnabled) + { + pickerDisabledlabel.Text = disabledText; + } + else + { + pickerDisabledlabel.Text = "Picker is Enabled; Should Be Green"; + } + }; + + return new ContentPage { + Title = "Picker", + Padding = new Thickness(0, Device.OnPlatform(20, 0, 0), 0, Device.OnPlatform(00, 0, 0)), + Content = new StackLayout { + VerticalOptions = LayoutOptions.Fill, + HorizontalOptions = LayoutOptions.Fill, + Children = + { + pickerColorLabel, + pickerColorDefaultToggle, + toggleButton, + pickerInit, + pickerDisabledlabel, + pickerColorDisabled, + buttonToggleEnabled + } + } + }; + } } } diff --git a/Xamarin.Forms.Controls/CoreGalleryPages/DatePickerCoreGalleryPage.cs b/Xamarin.Forms.Controls/CoreGalleryPages/DatePickerCoreGalleryPage.cs index 1dbb9bb2..7cd0f11b 100644 --- a/Xamarin.Forms.Controls/CoreGalleryPages/DatePickerCoreGalleryPage.cs +++ b/Xamarin.Forms.Controls/CoreGalleryPages/DatePickerCoreGalleryPage.cs @@ -1,34 +1,36 @@ using System; - using Xamarin.Forms.CustomAttributes; namespace Xamarin.Forms.Controls { internal class DatePickerCoreGalleryPage : CoreGalleryPage<DatePicker> { - protected override bool SupportsTapGestureRecognizer - { - get { return false; } - } + protected override bool SupportsTapGestureRecognizer => false; - protected override void Build (StackLayout stackLayout) + protected override void Build(StackLayout stackLayout) { - base.Build (stackLayout); + base.Build(stackLayout); + + var dateContainer = new ViewContainer<DatePicker>(Test.DatePicker.Date, + new DatePicker { Date = new DateTime(1987, 9, 13) }); - var dateContainer = new ViewContainer<DatePicker> (Test.DatePicker.Date, new DatePicker { Date = new DateTime (1987, 9, 13) }); + var dateSelectedContainer = new EventViewContainer<DatePicker>(Test.DatePicker.DateSelected, new DatePicker()); + dateSelectedContainer.View.DateSelected += (sender, args) => dateSelectedContainer.EventFired(); - var dateSelectedContainer = new EventViewContainer<DatePicker> (Test.DatePicker.DateSelected, new DatePicker ()); - dateSelectedContainer.View.DateSelected += (sender, args) => dateSelectedContainer.EventFired (); + var formatDateContainer = new ViewContainer<DatePicker>(Test.DatePicker.Format, new DatePicker { Format = "ddd" }); + var minimumDateContainer = new ViewContainer<DatePicker>(Test.DatePicker.MinimumDate, + new DatePicker { MinimumDate = new DateTime(1987, 9, 13) }); + var maximumDateContainer = new ViewContainer<DatePicker>(Test.DatePicker.MaximumDate, + new DatePicker { MaximumDate = new DateTime(2087, 9, 13) }); + var textColorContainer = new ViewContainer<DatePicker>(Test.DatePicker.TextColor, + new DatePicker { Date = new DateTime(1978, 12, 24), TextColor = Color.Lime }); - var formatDateContainer = new ViewContainer<DatePicker> (Test.DatePicker.Format, new DatePicker { Format = "ddd" }); - var minimumDateContainer = new ViewContainer<DatePicker> (Test.DatePicker.MinimumDate, new DatePicker { MinimumDate = new DateTime (1987, 9, 13) }); - var maximumDateContainer = new ViewContainer<DatePicker> (Test.DatePicker.MaximumDate, new DatePicker { MaximumDate = new DateTime (2087, 9, 13) }); - - Add (dateContainer); - Add (dateSelectedContainer); - Add (formatDateContainer); - Add (minimumDateContainer); - Add (maximumDateContainer); + Add(dateContainer); + Add(dateSelectedContainer); + Add(formatDateContainer); + Add(minimumDateContainer); + Add(maximumDateContainer); + Add(textColorContainer); } } }
\ No newline at end of file diff --git a/Xamarin.Forms.Controls/CoreGalleryPages/PickerCoreGalleryPage.cs b/Xamarin.Forms.Controls/CoreGalleryPages/PickerCoreGalleryPage.cs index cea755d4..323b6076 100644 --- a/Xamarin.Forms.Controls/CoreGalleryPages/PickerCoreGalleryPage.cs +++ b/Xamarin.Forms.Controls/CoreGalleryPages/PickerCoreGalleryPage.cs @@ -4,32 +4,34 @@ namespace Xamarin.Forms.Controls { internal class PickerCoreGalleryPage : CoreGalleryPage<Picker> { - // TODO - protected override bool SupportsTapGestureRecognizer - { - get { return false; } - } + protected override bool SupportsTapGestureRecognizer => false; - protected override void Build (StackLayout stackLayout) + protected override void Build(StackLayout stackLayout) { - base.Build (stackLayout); - var itemsContainer = new ViewContainer<Picker> (Test.Picker.Items, new Picker ()); - itemsContainer.View.Items.Add ("Item 1"); - itemsContainer.View.Items.Add ("Item 2"); - itemsContainer.View.Items.Add ("Item 3"); + base.Build(stackLayout); + var itemsContainer = new ViewContainer<Picker>(Test.Picker.Items, new Picker()); + itemsContainer.View.Items.Add("Item 1"); + itemsContainer.View.Items.Add("Item 2"); + itemsContainer.View.Items.Add("Item 3"); - var selectedIndexContainer = new ViewContainer<Picker> (Test.Picker.SelectedIndex, new Picker ()); - selectedIndexContainer.View.Items.Add ("Item 1"); - selectedIndexContainer.View.Items.Add ("Item 2"); - selectedIndexContainer.View.Items.Add ("Item 3"); + var selectedIndexContainer = new ViewContainer<Picker>(Test.Picker.SelectedIndex, new Picker()); + selectedIndexContainer.View.Items.Add("Item 1"); + selectedIndexContainer.View.Items.Add("Item 2"); + selectedIndexContainer.View.Items.Add("Item 3"); selectedIndexContainer.View.SelectedIndex = 2; - var titleContainer = new ViewContainer<Picker> (Test.Picker.Title, new Picker ()); + var titleContainer = new ViewContainer<Picker>(Test.Picker.Title, new Picker()); titleContainer.View.Title = "Title"; - Add (itemsContainer); - Add (selectedIndexContainer); - Add (titleContainer); + var textColorContainer = new ViewContainer<Picker>(Test.Picker.TextColor, new Picker()); + textColorContainer.View.Items.Add("Item 1"); + textColorContainer.View.Items.Add("Item 2"); + textColorContainer.View.Items.Add("Item 3"); + + Add(itemsContainer); + Add(selectedIndexContainer); + Add(titleContainer); + Add(textColorContainer); } } }
\ No newline at end of file diff --git a/Xamarin.Forms.Controls/CoreGalleryPages/TimePickerCoreGalleryPage.cs b/Xamarin.Forms.Controls/CoreGalleryPages/TimePickerCoreGalleryPage.cs index bf8b9c98..a6a94eb2 100644 --- a/Xamarin.Forms.Controls/CoreGalleryPages/TimePickerCoreGalleryPage.cs +++ b/Xamarin.Forms.Controls/CoreGalleryPages/TimePickerCoreGalleryPage.cs @@ -1,24 +1,24 @@ using System; - using Xamarin.Forms.CustomAttributes; namespace Xamarin.Forms.Controls { internal class TimePickerCoreGalleryPage : CoreGalleryPage<TimePicker> { - protected override bool SupportsTapGestureRecognizer - { - get { return false; } - } + protected override bool SupportsTapGestureRecognizer => false; - protected override void Build (StackLayout stackLayout) + protected override void Build(StackLayout stackLayout) { - base.Build (stackLayout); - var formatContainer = new ViewContainer<TimePicker> (Test.TimePicker.Format, new TimePicker { Format = "HH-mm-ss" }); - var timeContainer = new ViewContainer<TimePicker> (Test.TimePicker.Time, new TimePicker { Time = new TimeSpan (14, 45, 50) }); + base.Build(stackLayout); + var formatContainer = new ViewContainer<TimePicker>(Test.TimePicker.Format, new TimePicker { Format = "HH-mm-ss" }); + var timeContainer = new ViewContainer<TimePicker>(Test.TimePicker.Time, + new TimePicker { Time = new TimeSpan(14, 45, 50) }); + var textColorContainer = new ViewContainer<TimePicker>(Test.TimePicker.TextColor, + new TimePicker { Time = new TimeSpan(14, 45, 50), TextColor = Color.Lime }); - Add (formatContainer); - Add (timeContainer); + Add(formatContainer); + Add(timeContainer); + Add(textColorContainer); } } }
\ No newline at end of file diff --git a/Xamarin.Forms.Core/DatePicker.cs b/Xamarin.Forms.Core/DatePicker.cs index 15f1c198..20eecae4 100644 --- a/Xamarin.Forms.Core/DatePicker.cs +++ b/Xamarin.Forms.Core/DatePicker.cs @@ -6,17 +6,19 @@ namespace Xamarin.Forms [RenderWith(typeof(_DatePickerRenderer))] public class DatePicker : View { - public static readonly BindableProperty FormatProperty = BindableProperty.Create("Format", typeof(string), typeof(DatePicker), "d"); + public static readonly BindableProperty FormatProperty = BindableProperty.Create(nameof(Format), typeof(string), typeof(DatePicker), "d"); - public static readonly BindableProperty DateProperty = BindableProperty.Create("Date", typeof(DateTime), typeof(DatePicker), DateTime.Today, BindingMode.TwoWay, coerceValue: CoerceDate, + public static readonly BindableProperty DateProperty = BindableProperty.Create(nameof(Date), typeof(DateTime), typeof(DatePicker), DateTime.Today, BindingMode.TwoWay, coerceValue: CoerceDate, propertyChanged: DatePropertyChanged); - public static readonly BindableProperty MinimumDateProperty = BindableProperty.Create("MinimumDate", typeof(DateTime), typeof(DatePicker), new DateTime(1900, 1, 1), + public static readonly BindableProperty MinimumDateProperty = BindableProperty.Create(nameof(MinimumDate), typeof(DateTime), typeof(DatePicker), new DateTime(1900, 1, 1), validateValue: ValidateMinimumDate, coerceValue: CoerceMinimumDate); - public static readonly BindableProperty MaximumDateProperty = BindableProperty.Create("MaximumDate", typeof(DateTime), typeof(DatePicker), new DateTime(2100, 12, 31), + public static readonly BindableProperty MaximumDateProperty = BindableProperty.Create(nameof(MaximumDate), typeof(DateTime), typeof(DatePicker), new DateTime(2100, 12, 31), validateValue: ValidateMaximumDate, coerceValue: CoerceMaximumDate); + public static readonly BindableProperty TextColorProperty = BindableProperty.Create(nameof(TextColor), typeof(Color), typeof(DatePicker), Color.Default); + public DateTime Date { get { return (DateTime)GetValue(DateProperty); } @@ -41,6 +43,12 @@ namespace Xamarin.Forms set { SetValue(MinimumDateProperty, value); } } + public Color TextColor + { + get { return (Color)GetValue(TextColorProperty); } + set { SetValue(TextColorProperty, value); } + } + public event EventHandler<DateChangedEventArgs> DateSelected; static object CoerceDate(BindableObject bindable, object value) diff --git a/Xamarin.Forms.Core/Picker.cs b/Xamarin.Forms.Core/Picker.cs index 733f2079..5c2fb72b 100644 --- a/Xamarin.Forms.Core/Picker.cs +++ b/Xamarin.Forms.Core/Picker.cs @@ -8,9 +8,11 @@ namespace Xamarin.Forms [RenderWith(typeof(_PickerRenderer))] public class Picker : View { - public static readonly BindableProperty TitleProperty = BindableProperty.Create("Title", typeof(string), typeof(Picker), default(string)); + public static readonly BindableProperty TextColorProperty = BindableProperty.Create(nameof(TextColor), typeof(Color), typeof(Picker), Color.Default); - public static readonly BindableProperty SelectedIndexProperty = BindableProperty.Create("SelectedIndex", typeof(int), typeof(Picker), -1, BindingMode.TwoWay, + public static readonly BindableProperty TitleProperty = BindableProperty.Create(nameof(Title), typeof(string), typeof(Picker), default(string)); + + public static readonly BindableProperty SelectedIndexProperty = BindableProperty.Create(nameof(SelectedIndex), typeof(int), typeof(Picker), -1, BindingMode.TwoWay, propertyChanged: (bindable, oldvalue, newvalue) => { EventHandler eh = ((Picker)bindable).SelectedIndexChanged; @@ -32,6 +34,12 @@ namespace Xamarin.Forms set { SetValue(SelectedIndexProperty, value); } } + public Color TextColor + { + get { return (Color)GetValue(TextColorProperty); } + set { SetValue(TextColorProperty, value); } + } + public string Title { get { return (string)GetValue(TitleProperty); } diff --git a/Xamarin.Forms.Core/TimePicker.cs b/Xamarin.Forms.Core/TimePicker.cs index a9cf2e19..0a33c2e3 100644 --- a/Xamarin.Forms.Core/TimePicker.cs +++ b/Xamarin.Forms.Core/TimePicker.cs @@ -6,9 +6,11 @@ namespace Xamarin.Forms [RenderWith(typeof(_TimePickerRenderer))] public class TimePicker : View { - public static readonly BindableProperty FormatProperty = BindableProperty.Create("Format", typeof(string), typeof(TimePicker), "t"); + public static readonly BindableProperty FormatProperty = BindableProperty.Create(nameof(Format), typeof(string), typeof(TimePicker), "t"); - public static readonly BindableProperty TimeProperty = BindableProperty.Create("Time", typeof(TimeSpan), typeof(TimePicker), new TimeSpan(0), BindingMode.TwoWay, (bindable, value) => + public static readonly BindableProperty TextColorProperty = BindableProperty.Create(nameof(TextColor), typeof(Color), typeof(TimePicker), Color.Default); + + public static readonly BindableProperty TimeProperty = BindableProperty.Create(nameof(Time), typeof(TimeSpan), typeof(TimePicker), new TimeSpan(0), BindingMode.TwoWay, (bindable, value) => { var time = (TimeSpan)value; return time.TotalHours < 24 && time.TotalMilliseconds >= 0; @@ -20,6 +22,12 @@ namespace Xamarin.Forms set { SetValue(FormatProperty, value); } } + public Color TextColor + { + get { return (Color)GetValue(TextColorProperty); } + set { SetValue(TextColorProperty, value); } + } + public TimeSpan Time { get { return (TimeSpan)GetValue(TimeProperty); } diff --git a/Xamarin.Forms.CustomAttributes/TestAttributes.cs b/Xamarin.Forms.CustomAttributes/TestAttributes.cs index 7aa9fb04..3ac2e6f2 100644 --- a/Xamarin.Forms.CustomAttributes/TestAttributes.cs +++ b/Xamarin.Forms.CustomAttributes/TestAttributes.cs @@ -464,7 +464,8 @@ namespace Xamarin.Forms.CustomAttributes MinimumDate, MaximumDate, Focus, - IsVisible + IsVisible, + TextColor } public enum InputView @@ -652,7 +653,8 @@ namespace Xamarin.Forms.CustomAttributes public enum TimePicker { Format, Time, - Focus + Focus, + TextColor } public enum WebView { @@ -690,7 +692,8 @@ namespace Xamarin.Forms.CustomAttributes Title, Items, SelectedIndex, - Focus + Focus, + TextColor } public enum FileImageSource { diff --git a/Xamarin.Forms.Platform.Android/AppCompat/ButtonRenderer.cs b/Xamarin.Forms.Platform.Android/AppCompat/ButtonRenderer.cs index 3260dbf1..8f4ef35e 100644 --- a/Xamarin.Forms.Platform.Android/AppCompat/ButtonRenderer.cs +++ b/Xamarin.Forms.Platform.Android/AppCompat/ButtonRenderer.cs @@ -14,10 +14,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat { public class ButtonRenderer : ViewRenderer<Button, AppCompatButton>, global::Android.Views.View.IOnAttachStateChangeListener { - static readonly int[][] States = { new[] { GlobalResource.Attribute.StateEnabled }, new[] { -GlobalResource.Attribute.StateEnabled } }; - - ColorStateList _buttonDefaulTextColors; - Color _currentTextColor; + TextColorSwitcher _textColorSwitcher; float _defaultFontSize; Typeface _defaultTypeface; bool _isDisposed; @@ -79,7 +76,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat button.SetOnClickListener(ButtonClickListener.Instance.Value); button.Tag = this; - _buttonDefaulTextColors = button.TextColors; + _textColorSwitcher = new TextColorSwitcher(button.TextColors); SetNativeControl(button); button.AddOnAttachStateChangeListener(this); @@ -128,14 +125,16 @@ namespace Xamarin.Forms.Platform.Android.AppCompat { Resources.Theme theme = context.Theme; if (theme != null && theme.ResolveAttribute(id, value, true)) - Control.SupportBackgroundTintList = ContextCompat.GetColorStateList(context, value.Data); +#pragma warning disable 618 + Control.SupportBackgroundTintList = Resources.GetColorStateList(value.Data); +#pragma warning restore 618 else - Control.SupportBackgroundTintList = new ColorStateList(States, new[] { (int)0xffd7d6d6, 0x7fd7d6d6 }); + Control.SupportBackgroundTintList = new ColorStateList(ColorExtensions.States, new[] { (int)0xffd7d6d6, 0x7fd7d6d6 }); } catch (Exception ex) { Log.Warning("Xamarin.Forms.Platform.Android.ButtonRenderer", "Could not retrieve button background resource: {0}", ex); - Control.SupportBackgroundTintList = new ColorStateList(States, new[] { (int)0xffd7d6d6, 0x7fd7d6d6 }); + Control.SupportBackgroundTintList = new ColorStateList(ColorExtensions.States, new[] { (int)0xffd7d6d6, 0x7fd7d6d6 }); } } } @@ -145,7 +144,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat { int intColor = backgroundColor.ToAndroid().ToArgb(); int disableColor = backgroundColor.MultiplyAlpha(0.5).ToAndroid().ToArgb(); - Control.SupportBackgroundTintList = new ColorStateList(States, new[] { intColor, disableColor }); + Control.SupportBackgroundTintList = new ColorStateList(ColorExtensions.States, new[] { intColor, disableColor }); } } @@ -245,21 +244,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat void UpdateTextColor() { - Color color = Element.TextColor; - if (color == _currentTextColor) - return; - - _currentTextColor = color; - - if (color.IsDefault) - NativeButton.SetTextColor(_buttonDefaulTextColors); - else - { - // Set the new enabled state color, preserving the default disabled state color - int defaultDisabledColor = _buttonDefaulTextColors.GetColorForState(States[1], color.ToAndroid()); - - NativeButton.SetTextColor(new ColorStateList(States, new[] { color.ToAndroid().ToArgb(), defaultDisabledColor })); - } + _textColorSwitcher?.UpdateTextColor(Control, Element.TextColor); } class ButtonClickListener : Object, IOnClickListener diff --git a/Xamarin.Forms.Platform.Android/AppCompat/PickerRenderer.cs b/Xamarin.Forms.Platform.Android/AppCompat/PickerRenderer.cs index dd7fb85c..492b553b 100644 --- a/Xamarin.Forms.Platform.Android/AppCompat/PickerRenderer.cs +++ b/Xamarin.Forms.Platform.Android/AppCompat/PickerRenderer.cs @@ -2,6 +2,7 @@ using System; using System.ComponentModel; using System.Linq; using Android.App; +using Android.Content.Res; using Android.Text; using Android.Widget; using Object = Java.Lang.Object; @@ -12,6 +13,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat { AlertDialog _dialog; bool _disposed; + TextColorSwitcher _textColorSwitcher; public PickerRenderer() { @@ -51,9 +53,11 @@ namespace Xamarin.Forms.Platform.Android.AppCompat textField.Tag = this; textField.InputType = InputTypes.Null; textField.SetOnClickListener(PickerListener.Instance); + _textColorSwitcher = new TextColorSwitcher(textField.TextColors); SetNativeControl(textField); } UpdatePicker(); + UpdateTextColor(); } base.OnElementChanged(e); @@ -67,6 +71,8 @@ namespace Xamarin.Forms.Platform.Android.AppCompat UpdatePicker(); if (e.PropertyName == Picker.SelectedIndexProperty.PropertyName) UpdatePicker(); + if (e.PropertyName == Picker.TextColorProperty.PropertyName) + UpdateTextColor(); } internal override void OnFocusChangeRequested(object sender, VisualElement.FocusRequestArgs e) @@ -123,6 +129,11 @@ namespace Xamarin.Forms.Platform.Android.AppCompat Control.Text = Element.Items[Element.SelectedIndex]; } + void UpdateTextColor() + { + _textColorSwitcher?.UpdateTextColor(Control, Element.TextColor); + } + class PickerListener : Object, IOnClickListener { #region Statics diff --git a/Xamarin.Forms.Platform.Android/ColorExtensions.cs b/Xamarin.Forms.Platform.Android/ColorExtensions.cs index 2fee25a2..db190b4a 100644 --- a/Xamarin.Forms.Platform.Android/ColorExtensions.cs +++ b/Xamarin.Forms.Platform.Android/ColorExtensions.cs @@ -6,7 +6,7 @@ namespace Xamarin.Forms.Platform.Android { public static class ColorExtensions { - static readonly int[][] ColorStates = { new[] { global::Android.Resource.Attribute.StateEnabled }, new[] { -global::Android.Resource.Attribute.StateEnabled } }; + public static readonly int[][] States = { new[] { global::Android.Resource.Attribute.StateEnabled }, new[] { -global::Android.Resource.Attribute.StateEnabled } }; public static AColor ToAndroid(this Color self) { @@ -33,8 +33,8 @@ namespace Xamarin.Forms.Platform.Android public static ColorStateList ToAndroidPreserveDisabled(this Color color, ColorStateList defaults) { - int disabled = defaults.GetColorForState(ColorStates[1], color.ToAndroid()); - return new ColorStateList(ColorStates, new[] { color.ToAndroid().ToArgb(), disabled }); + int disabled = defaults.GetColorForState(States[1], color.ToAndroid()); + return new ColorStateList(States, new[] { color.ToAndroid().ToArgb(), disabled }); } } }
\ No newline at end of file diff --git a/Xamarin.Forms.Platform.Android/Renderers/ButtonRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/ButtonRenderer.cs index 43f042b1..7247361a 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/ButtonRenderer.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/ButtonRenderer.cs @@ -13,7 +13,7 @@ namespace Xamarin.Forms.Platform.Android public class ButtonRenderer : ViewRenderer<Button, AButton>, AView.IOnAttachStateChangeListener { ButtonDrawable _backgroundDrawable; - ColorStateList _buttonDefaulTextColors; + TextColorSwitcher _textColorSwitcher; Drawable _defaultDrawable; float _defaultFontSize; Typeface _defaultTypeface; @@ -78,7 +78,7 @@ namespace Xamarin.Forms.Platform.Android button.SetOnClickListener(ButtonClickListener.Instance.Value); button.Tag = this; SetNativeControl(button); - + _textColorSwitcher = new TextColorSwitcher(button.TextColors); button.AddOnAttachStateChangeListener(this); } } @@ -255,22 +255,7 @@ namespace Xamarin.Forms.Platform.Android void UpdateTextColor() { - Color color = Element.TextColor; - - if (color.IsDefault) - { - if (_buttonDefaulTextColors == null) - return; - - NativeButton.SetTextColor(_buttonDefaulTextColors); - } - else - { - _buttonDefaulTextColors = _buttonDefaulTextColors ?? Control.TextColors; - - // Set the new enabled state color, preserving the default disabled state color - NativeButton.SetTextColor(color.ToAndroidPreserveDisabled(_buttonDefaulTextColors)); - } + _textColorSwitcher?.UpdateTextColor(Control, Element.TextColor); } class ButtonClickListener : Object, IOnClickListener diff --git a/Xamarin.Forms.Platform.Android/Renderers/DatePickerRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/DatePickerRenderer.cs index 11d9a0d0..5b0e0994 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/DatePickerRenderer.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/DatePickerRenderer.cs @@ -1,6 +1,7 @@ using System; using System.ComponentModel; using Android.App; +using Android.Content.Res; using Android.Widget; using AView = Android.Views.View; using Object = Java.Lang.Object; @@ -11,6 +12,7 @@ namespace Xamarin.Forms.Platform.Android { DatePickerDialog _dialog; bool _disposed; + TextColorSwitcher _textColorSwitcher; public DatePickerRenderer() { @@ -47,24 +49,28 @@ namespace Xamarin.Forms.Platform.Android textField.SetOnClickListener(TextFieldClickHandler.Instance); SetNativeControl(textField); + _textColorSwitcher = new TextColorSwitcher(textField.TextColors); } SetDate(Element.Date); UpdateMinimumDate(); UpdateMaximumDate(); + UpdateTextColor(); } protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) { base.OnElementPropertyChanged(sender, e); - if (e.PropertyName == "Date" || e.PropertyName == DatePicker.FormatProperty.PropertyName) + if (e.PropertyName == DatePicker.DateProperty.PropertyName || e.PropertyName == DatePicker.FormatProperty.PropertyName) SetDate(Element.Date); - else if (e.PropertyName == "MinimumDate") + else if (e.PropertyName == DatePicker.MinimumDateProperty.PropertyName) UpdateMinimumDate(); - else if (e.PropertyName == "MaximumDate") + else if (e.PropertyName == DatePicker.MaximumDateProperty.PropertyName) UpdateMaximumDate(); + if (e.PropertyName == DatePicker.TextColorProperty.PropertyName) + UpdateTextColor(); } internal override void OnFocusChangeRequested(object sender, VisualElement.FocusRequestArgs e) @@ -141,6 +147,11 @@ namespace Xamarin.Forms.Platform.Android } } + void UpdateTextColor() + { + _textColorSwitcher?.UpdateTextColor(Control, Element.TextColor); + } + class TextFieldClickHandler : Object, IOnClickListener { public static readonly TextFieldClickHandler Instance = new TextFieldClickHandler(); diff --git a/Xamarin.Forms.Platform.Android/Renderers/PickerRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/PickerRenderer.cs index b9114d22..e9cc3942 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/PickerRenderer.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/PickerRenderer.cs @@ -2,19 +2,21 @@ using System; using System.ComponentModel; using System.Linq; using Android.App; +using Android.Content.Res; using Android.Views; using Android.Widget; using ADatePicker = Android.Widget.DatePicker; using ATimePicker = Android.Widget.TimePicker; using Object = Java.Lang.Object; +using Orientation = Android.Widget.Orientation; namespace Xamarin.Forms.Platform.Android { public class PickerRenderer : ViewRenderer<Picker, EditText> { AlertDialog _dialog; - bool _isDisposed; + TextColorSwitcher _textColorSwitcher; public PickerRenderer() { @@ -44,9 +46,11 @@ namespace Xamarin.Forms.Platform.Android { var textField = new EditText(Context) { Focusable = false, Clickable = true, Tag = this }; textField.SetOnClickListener(PickerListener.Instance); + _textColorSwitcher = new TextColorSwitcher(textField.TextColors); SetNativeControl(textField); } UpdatePicker(); + UpdateTextColor(); } base.OnElementChanged(e); @@ -60,6 +64,8 @@ namespace Xamarin.Forms.Platform.Android UpdatePicker(); if (e.PropertyName == Picker.SelectedIndexProperty.PropertyName) UpdatePicker(); + if (e.PropertyName == Picker.TextColorProperty.PropertyName) + UpdateTextColor(); } internal override void OnFocusChangeRequested(object sender, VisualElement.FocusRequestArgs e) @@ -148,6 +154,11 @@ namespace Xamarin.Forms.Platform.Android ((IVisualElementController)Element).NativeSizeChanged(); } + void UpdateTextColor() + { + _textColorSwitcher?.UpdateTextColor(Control, Element.TextColor); + } + class PickerListener : Object, IOnClickListener { public static readonly PickerListener Instance = new PickerListener(); diff --git a/Xamarin.Forms.Platform.Android/Renderers/TimePickerRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/TimePickerRenderer.cs index cfa676d0..010eda72 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/TimePickerRenderer.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/TimePickerRenderer.cs @@ -1,6 +1,7 @@ using System; using System.ComponentModel; using Android.App; +using Android.Content.Res; using Android.Widget; using ADatePicker = Android.Widget.DatePicker; using ATimePicker = Android.Widget.TimePicker; @@ -11,6 +12,7 @@ namespace Xamarin.Forms.Platform.Android public class TimePickerRenderer : ViewRenderer<TimePicker, EditText>, TimePickerDialog.IOnTimeSetListener { AlertDialog _dialog; + TextColorSwitcher _textColorSwitcher; public TimePickerRenderer() { @@ -36,17 +38,23 @@ namespace Xamarin.Forms.Platform.Android textField.SetOnClickListener(TimePickerListener.Instance); SetNativeControl(textField); + _textColorSwitcher = new TextColorSwitcher(textField.TextColors); } SetTime(e.NewElement.Time); + UpdateTextColor(); } protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) { base.OnElementPropertyChanged(sender, e); - if (e.PropertyName == TimePicker.TimeProperty.PropertyName || e.PropertyName == TimePicker.FormatProperty.PropertyName) + if (e.PropertyName == TimePicker.TimeProperty.PropertyName || + e.PropertyName == TimePicker.FormatProperty.PropertyName) SetTime(Element.Time); + + if (e.PropertyName == TimePicker.TextColorProperty.PropertyName) + UpdateTextColor(); } internal override void OnFocusChangeRequested(object sender, VisualElement.FocusRequestArgs e) @@ -78,6 +86,11 @@ namespace Xamarin.Forms.Platform.Android Control.Text = DateTime.Today.Add(time).ToString(Element.Format); } + void UpdateTextColor() + { + _textColorSwitcher?.UpdateTextColor(Control, Element.TextColor); + } + class TimePickerListener : Object, IOnClickListener { public static readonly TimePickerListener Instance = new TimePickerListener(); diff --git a/Xamarin.Forms.Platform.Android/TextColorSwitcher.cs b/Xamarin.Forms.Platform.Android/TextColorSwitcher.cs new file mode 100644 index 00000000..6beafd56 --- /dev/null +++ b/Xamarin.Forms.Platform.Android/TextColorSwitcher.cs @@ -0,0 +1,40 @@ +using Android.Content.Res; +using Android.Widget; + +namespace Xamarin.Forms.Platform.Android +{ + /// <summary> + /// Handles color state management for the TextColor property + /// for Button, Picker, TimePicker, and DatePicker + /// </summary> + internal class TextColorSwitcher + { + static readonly int[][] s_colorStates = { new[] { global::Android.Resource.Attribute.StateEnabled }, new[] { -global::Android.Resource.Attribute.StateEnabled } }; + + readonly ColorStateList _defaultTextColors; + Color _currentTextColor; + + public TextColorSwitcher(ColorStateList textColors) + { + _defaultTextColors = textColors; + } + + public void UpdateTextColor(TextView control, Color color) + { + if (color == _currentTextColor) + return; + + _currentTextColor = color; + + if (color.IsDefault) + control.SetTextColor(_defaultTextColors); + else + { + // Set the new enabled state color, preserving the default disabled state color + int defaultDisabledColor = _defaultTextColors.GetColorForState(s_colorStates[1], color.ToAndroid()); + control.SetTextColor(new ColorStateList(s_colorStates, new[] { color.ToAndroid().ToArgb(), defaultDisabledColor })); + } + } + + } +}
\ No newline at end of file diff --git a/Xamarin.Forms.Platform.Android/Xamarin.Forms.Platform.Android.csproj b/Xamarin.Forms.Platform.Android/Xamarin.Forms.Platform.Android.csproj index a6d4746f..b33427b9 100644 --- a/Xamarin.Forms.Platform.Android/Xamarin.Forms.Platform.Android.csproj +++ b/Xamarin.Forms.Platform.Android/Xamarin.Forms.Platform.Android.csproj @@ -28,7 +28,8 @@ <ErrorReport>prompt</ErrorReport> <WarningLevel>4</WarningLevel> <TreatWarningsAsErrors>true</TreatWarningsAsErrors> - <NoWarn>0642;0114;0108;0672;0168;0169;0184;0649;0414</NoWarn> + <NoWarn> + </NoWarn> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> <DebugType>pdbonly</DebugType> @@ -38,7 +39,8 @@ <ErrorReport>prompt</ErrorReport> <WarningLevel>4</WarningLevel> <TreatWarningsAsErrors>true</TreatWarningsAsErrors> - <NoWarn>0642;0114;0108;0672;0168;0169;0184;0649;0414</NoWarn> + <NoWarn> + </NoWarn> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Turkey|AnyCPU'"> <DebugSymbols>true</DebugSymbols> @@ -168,6 +170,7 @@ <Compile Include="Renderers\ViewGroupExtensions.cs" /> <Compile Include="TapGestureHandler.cs" /> <Compile Include="TextViewExtensions.cs" /> + <Compile Include="TextColorSwitcher.cs" /> <Compile Include="ViewInitializedEventArgs.cs" /> <Compile Include="VisualElementChangedEventArgs.cs" /> <Compile Include="RendererPool.cs" /> diff --git a/Xamarin.Forms.Platform.WP8/DatePickerRenderer.cs b/Xamarin.Forms.Platform.WP8/DatePickerRenderer.cs index 9553171b..5685310d 100644 --- a/Xamarin.Forms.Platform.WP8/DatePickerRenderer.cs +++ b/Xamarin.Forms.Platform.WP8/DatePickerRenderer.cs @@ -1,17 +1,28 @@ using System; using System.ComponentModel; using System.Reflection; +using System.Windows.Media; using Microsoft.Phone.Controls; namespace Xamarin.Forms.Platform.WinPhone { public class DatePickerRenderer : ViewRenderer<DatePicker, Microsoft.Phone.Controls.DatePicker> { + Brush _defaultBrush; + protected override void OnElementChanged(ElementChangedEventArgs<DatePicker> e) { base.OnElementChanged(e); var datePicker = new Microsoft.Phone.Controls.DatePicker { Value = Element.Date }; + + datePicker.Loaded += (sender, args) => { + // The defaults from the control template won't be available + // right away; we have to wait until after the template has been applied + _defaultBrush = datePicker.Foreground; + UpdateTextColor(); + }; + datePicker.ValueChanged += DatePickerOnValueChanged; SetNativeControl(datePicker); @@ -20,11 +31,14 @@ namespace Xamarin.Forms.Platform.WinPhone protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) { - if (e.PropertyName == "Date") + base.OnElementPropertyChanged(sender, e); + + if (e.PropertyName == DatePicker.DateProperty.PropertyName) Control.Value = Element.Date; else if (e.PropertyName == DatePicker.FormatProperty.PropertyName) UpdateFormatString(); - base.OnElementPropertyChanged(sender, e); + else if (e.PropertyName == DatePicker.TextColorProperty.PropertyName) + UpdateTextColor(); } internal override void OnModelFocusChangeRequested(object sender, VisualElement.FocusRequestArgs args) @@ -55,5 +69,11 @@ namespace Xamarin.Forms.Platform.WinPhone { Control.ValueStringFormat = "{0:" + Element.Format + "}"; } + + void UpdateTextColor() + { + Color color = Element.TextColor; + Control.Foreground = color.IsDefault ? (_defaultBrush ?? color.ToBrush()) : color.ToBrush(); + } } }
\ No newline at end of file diff --git a/Xamarin.Forms.Platform.WP8/PickerRenderer.cs b/Xamarin.Forms.Platform.WP8/PickerRenderer.cs index f9cd2d81..d52f7314 100644 --- a/Xamarin.Forms.Platform.WP8/PickerRenderer.cs +++ b/Xamarin.Forms.Platform.WP8/PickerRenderer.cs @@ -4,6 +4,7 @@ using System.ComponentModel; using System.Reflection; using System.Windows; using System.Windows.Controls; +using System.Windows.Media; using Microsoft.Phone.Controls; namespace Xamarin.Forms.Platform.WinPhone @@ -11,8 +12,8 @@ namespace Xamarin.Forms.Platform.WinPhone public class PickerRenderer : ViewRenderer<Picker, FrameworkElement> { bool _isChanging; - FormsListPicker _listPicker; + Brush _defaultBrush; protected override void OnElementChanged(ElementChangedEventArgs<Picker> e) { @@ -34,6 +35,12 @@ namespace Xamarin.Forms.Platform.WinPhone _listPicker.Items.Add(new ItemViewModel(" ") { MaxHeight = 0 }); _listPicker.ListPickerModeChanged += ListPickerModeChanged; + _listPicker.Loaded += (sender, args) => { + // The defaults from the control template won't be available + // right away; we have to wait until after the template has been applied + _defaultBrush = _listPicker.Foreground; + UpdateTextColor(); + }; var grid = new System.Windows.Controls.Grid { Children = { _listPicker }, MaxWidth = Device.Info.PixelScreenSize.Width }; SetNativeControl(grid); @@ -45,20 +52,29 @@ namespace Xamarin.Forms.Platform.WinPhone protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) { base.OnElementPropertyChanged(sender, e); + if (e.PropertyName == Picker.TitleProperty.PropertyName) + { _listPicker.FullModeHeader = Element.Title; - - if (e.PropertyName == VisualElement.IsEnabledProperty.PropertyName) + } + else if (e.PropertyName == VisualElement.IsEnabledProperty.PropertyName) + { UpdateIsEnabled(); - - if (e.PropertyName == Picker.SelectedIndexProperty.PropertyName) + UpdateTextColor(); + } + else if (e.PropertyName == Picker.SelectedIndexProperty.PropertyName) { if (Element.SelectedIndex >= 0 && Element.SelectedIndex < Element.Items.Count) _listPicker.SelectedIndex = Element.SelectedIndex + 1; } - - if (e.PropertyName == View.HorizontalOptionsProperty.PropertyName) + else if (e.PropertyName == View.HorizontalOptionsProperty.PropertyName) + { UpdateAlignment(); + } + else if (e.PropertyName == Picker.TextColorProperty.PropertyName) + { + UpdateTextColor(); + } } protected override void OnGotFocus(object sender, RoutedEventArgs args) @@ -198,6 +214,17 @@ namespace Xamarin.Forms.Platform.WinPhone _listPicker.SelectedIndex = Element.SelectedIndex + 1; } + void UpdateTextColor() + { + if (!_listPicker.IsEnabled) + { + return; + } + + Color color = Element.TextColor; + _listPicker.Foreground = color.IsDefault ? (_defaultBrush ?? color.ToBrush()) : color.ToBrush(); + } + class ItemViewModel : INotifyPropertyChanged { string _data; diff --git a/Xamarin.Forms.Platform.WP8/TimePickerRenderer.cs b/Xamarin.Forms.Platform.WP8/TimePickerRenderer.cs index 70841d7a..542bddfc 100644 --- a/Xamarin.Forms.Platform.WP8/TimePickerRenderer.cs +++ b/Xamarin.Forms.Platform.WP8/TimePickerRenderer.cs @@ -1,17 +1,29 @@ using System; using System.ComponentModel; using System.Reflection; +using System.Windows.Media; using Microsoft.Phone.Controls; namespace Xamarin.Forms.Platform.WinPhone { public class TimePickerRenderer : ViewRenderer<TimePicker, Microsoft.Phone.Controls.TimePicker> { + Brush _defaultBrush; + protected override void OnElementChanged(ElementChangedEventArgs<TimePicker> e) { base.OnElementChanged(e); var timePicker = new Microsoft.Phone.Controls.TimePicker { Value = DateTime.Today.Add(Element.Time) }; + + timePicker.Loaded += (sender, args) => + { + // The defaults from the control template won't be available + // right away; we have to wait until after the template has been applied + _defaultBrush = timePicker.Foreground; + UpdateTextColor(); + }; + timePicker.ValueChanged += TimePickerOnValueChanged; SetNativeControl(timePicker); @@ -22,10 +34,12 @@ namespace Xamarin.Forms.Platform.WinPhone { base.OnElementPropertyChanged(sender, e); - if (e.PropertyName == "Time") + if (e.PropertyName == TimePicker.TimeProperty.PropertyName) Control.Value = DateTime.Today.Add(Element.Time); else if (e.PropertyName == TimePicker.FormatProperty.PropertyName) UpdateFormatString(); + else if (e.PropertyName == TimePicker.TextColorProperty.PropertyName) + UpdateTextColor(); } internal override void OnModelFocusChangeRequested(object sender, VisualElement.FocusRequestArgs args) @@ -56,5 +70,11 @@ namespace Xamarin.Forms.Platform.WinPhone { Control.ValueStringFormat = "{0:" + Element.Format + "}"; } + + void UpdateTextColor() + { + Color color = Element.TextColor; + Control.Foreground = color.IsDefault ? (_defaultBrush ?? color.ToBrush()) : color.ToBrush(); + } } }
\ No newline at end of file diff --git a/Xamarin.Forms.Platform.WinRT/DatePickerRenderer.cs b/Xamarin.Forms.Platform.WinRT/DatePickerRenderer.cs index 23f134f2..88df5cbc 100644 --- a/Xamarin.Forms.Platform.WinRT/DatePickerRenderer.cs +++ b/Xamarin.Forms.Platform.WinRT/DatePickerRenderer.cs @@ -1,6 +1,8 @@ using System; using System.ComponentModel; +using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Media; #if WINDOWS_UWP @@ -12,6 +14,8 @@ namespace Xamarin.Forms.Platform.WinRT { public class DatePickerRenderer : ViewRenderer<DatePicker, FormsDatePicker>, IWrapperAware { + Brush _defaultBrush; + public void NotifyWrapped() { if (Control != null) @@ -26,6 +30,7 @@ namespace Xamarin.Forms.Platform.WinRT { Control.ForceInvalidate -= PickerOnForceInvalidate; Control.DateChanged -= OnControlDateChanged; + Control.Loaded -= ControlOnLoaded; } base.Dispose(disposing); @@ -38,8 +43,9 @@ namespace Xamarin.Forms.Platform.WinRT if (Control == null) { var picker = new FormsDatePicker(); - picker.DateChanged += OnControlDateChanged; SetNativeControl(picker); + Control.Loaded += ControlOnLoaded; + Control.DateChanged += OnControlDateChanged; } UpdateMinimumDate(); @@ -50,6 +56,14 @@ namespace Xamarin.Forms.Platform.WinRT base.OnElementChanged(e); } + void ControlOnLoaded(object sender, RoutedEventArgs routedEventArgs) + { + // The defaults from the control template won't be available + // right away; we have to wait until after the template has been applied + _defaultBrush = Control.Foreground; + UpdateTextColor(); + } + protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) { base.OnElementPropertyChanged(sender, e); @@ -60,6 +74,8 @@ namespace Xamarin.Forms.Platform.WinRT UpdateMaximumDate(); else if (e.PropertyName == DatePicker.MinimumDateProperty.PropertyName) UpdateMinimumDate(); + else if (e.PropertyName == DatePicker.TextColorProperty.PropertyName) + UpdateTextColor(); } void OnControlDateChanged(object sender, DatePickerValueChangedEventArgs e) @@ -93,5 +109,11 @@ namespace Xamarin.Forms.Platform.WinRT DateTime mindate = Element.MinimumDate; Control.MinYear = new DateTimeOffset(mindate); } + + void UpdateTextColor() + { + Color color = Element.TextColor; + Control.Foreground = color.IsDefault ? (_defaultBrush ?? color.ToBrush()) : color.ToBrush(); + } } }
\ No newline at end of file diff --git a/Xamarin.Forms.Platform.WinRT/FormsTimePicker.cs b/Xamarin.Forms.Platform.WinRT/FormsTimePicker.cs index 976c56f4..c135a585 100644 --- a/Xamarin.Forms.Platform.WinRT/FormsTimePicker.cs +++ b/Xamarin.Forms.Platform.WinRT/FormsTimePicker.cs @@ -2,6 +2,7 @@ using System; using Windows.UI.Core; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Media; #if WINDOWS_UWP diff --git a/Xamarin.Forms.Platform.WinRT/PickerRenderer.cs b/Xamarin.Forms.Platform.WinRT/PickerRenderer.cs index a7fcbb41..e37b79a1 100644 --- a/Xamarin.Forms.Platform.WinRT/PickerRenderer.cs +++ b/Xamarin.Forms.Platform.WinRT/PickerRenderer.cs @@ -2,7 +2,9 @@ using System.ComponentModel; using System.Threading.Tasks; using Windows.UI.Core; +using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Media; #if WINDOWS_UWP @@ -15,6 +17,7 @@ namespace Xamarin.Forms.Platform.WinRT public class PickerRenderer : ViewRenderer<Picker, FormsComboBox> { bool _isAnimating; + Brush _defaultBrush; protected override void Dispose(bool disposing) { @@ -27,6 +30,7 @@ namespace Xamarin.Forms.Platform.WinRT Control.DropDownOpened -= OnDropDownOpenStateChanged; Control.DropDownClosed -= OnDropDownOpenStateChanged; Control.OpenAnimationCompleted -= ControlOnOpenAnimationCompleted; + Control.Loaded -= ControlOnLoaded; } } @@ -45,6 +49,7 @@ namespace Xamarin.Forms.Platform.WinRT Control.DropDownClosed += OnDropDownOpenStateChanged; Control.OpenAnimationCompleted += ControlOnOpenAnimationCompleted; Control.ClosedAnimationStarted += ControlOnClosedAnimationStarted; + Control.Loaded += ControlOnLoaded; } Control.ItemsSource = Element.Items; @@ -64,6 +69,16 @@ namespace Xamarin.Forms.Platform.WinRT UpdateSelectedIndex(); else if (e.PropertyName == Picker.TitleProperty.PropertyName) UpdateTitle(); + else if (e.PropertyName == Picker.TextColorProperty.PropertyName) + UpdateTextColor(); + } + + void ControlOnLoaded(object sender, RoutedEventArgs routedEventArgs) + { + // The defaults from the control template won't be available + // right away; we have to wait until after the template has been applied + _defaultBrush = Control.Foreground; + UpdateTextColor(); } void ControlOnClosedAnimationStarted(object sender, EventArgs eventArgs) @@ -139,6 +154,12 @@ namespace Xamarin.Forms.Platform.WinRT Control.SelectedIndex = Element.SelectedIndex; } + void UpdateTextColor() + { + Color color = Element.TextColor; + Control.Foreground = color.IsDefault ? (_defaultBrush ?? color.ToBrush()) : color.ToBrush(); + } + void UpdateTitle() { Control.Header = Element.Title; diff --git a/Xamarin.Forms.Platform.WinRT/TimePickerRenderer.cs b/Xamarin.Forms.Platform.WinRT/TimePickerRenderer.cs index 3aa5fdca..8c878b29 100644 --- a/Xamarin.Forms.Platform.WinRT/TimePickerRenderer.cs +++ b/Xamarin.Forms.Platform.WinRT/TimePickerRenderer.cs @@ -1,6 +1,8 @@ using System; using System.ComponentModel; +using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Media; #if WINDOWS_UWP @@ -12,6 +14,8 @@ namespace Xamarin.Forms.Platform.WinRT { public class TimePickerRenderer : ViewRenderer<TimePicker, FormsTimePicker>, IWrapperAware { + Brush _defaultBrush; + public void NotifyWrapped() { if (Control != null) @@ -26,6 +30,7 @@ namespace Xamarin.Forms.Platform.WinRT { Control.ForceInvalidate -= PickerOnForceInvalidate; Control.TimeChanged -= OnControlTimeChanged; + Control.Loaded -= ControlOnLoaded; } base.Dispose(disposing); @@ -33,19 +38,29 @@ namespace Xamarin.Forms.Platform.WinRT protected override void OnElementChanged(ElementChangedEventArgs<TimePicker> e) { + base.OnElementChanged(e); + if (e.NewElement != null) { if (Control == null) { var picker = new FormsTimePicker(); - picker.TimeChanged += OnControlTimeChanged; SetNativeControl(picker); + + Control.TimeChanged += OnControlTimeChanged; + Control.Loaded += ControlOnLoaded; } UpdateTime(); } + } - base.OnElementChanged(e); + void ControlOnLoaded(object sender, RoutedEventArgs routedEventArgs) + { + // The defaults from the control template won't be available + // right away; we have to wait until after the template has been applied + _defaultBrush = Control.Foreground; + UpdateTextColor(); } protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) @@ -54,6 +69,9 @@ namespace Xamarin.Forms.Platform.WinRT if (e.PropertyName == TimePicker.TimeProperty.PropertyName) UpdateTime(); + + if (e.PropertyName == TimePicker.TextColorProperty.PropertyName) + UpdateTextColor(); } void OnControlTimeChanged(object sender, TimePickerValueChangedEventArgs e) @@ -71,5 +89,11 @@ namespace Xamarin.Forms.Platform.WinRT { Control.Time = Element.Time; } + + void UpdateTextColor() + { + Color color = Element.TextColor; + Control.Foreground = color.IsDefault ? (_defaultBrush ?? color.ToBrush()) : color.ToBrush(); + } } }
\ No newline at end of file diff --git a/Xamarin.Forms.Platform.iOS/Renderers/DatePickerRenderer.cs b/Xamarin.Forms.Platform.iOS/Renderers/DatePickerRenderer.cs index fd2b1549..6d70d7c5 100644 --- a/Xamarin.Forms.Platform.iOS/Renderers/DatePickerRenderer.cs +++ b/Xamarin.Forms.Platform.iOS/Renderers/DatePickerRenderer.cs @@ -36,6 +36,7 @@ namespace Xamarin.Forms.Platform.iOS public class DatePickerRenderer : ViewRenderer<DatePicker, UITextField> { UIDatePicker _picker; + UIColor _defaultTextColor; protected override void OnElementChanged(ElementChangedEventArgs<DatePicker> e) { @@ -62,6 +63,8 @@ namespace Xamarin.Forms.Platform.iOS entry.InputView = _picker; entry.InputAccessoryView = toolbar; + _defaultTextColor = entry.TextColor; + SetNativeControl(entry); } @@ -70,6 +73,7 @@ namespace Xamarin.Forms.Platform.iOS UpdateDateFromModel(false); UpdateMaximumDate(); UpdateMinimumDate(); + UpdateTextColor(); } } @@ -83,6 +87,8 @@ namespace Xamarin.Forms.Platform.iOS UpdateMinimumDate(); else if (e.PropertyName == DatePicker.MaximumDateProperty.PropertyName) UpdateMaximumDate(); + else if (e.PropertyName == DatePicker.TextColorProperty.PropertyName || e.PropertyName == VisualElement.IsEnabledProperty.PropertyName) + UpdateTextColor(); } void HandleValueChanged(object sender, EventArgs e) @@ -118,5 +124,15 @@ namespace Xamarin.Forms.Platform.iOS { _picker.MinimumDate = Element.MinimumDate.ToNSDate(); } + + void UpdateTextColor() + { + var textColor = Element.TextColor; + + if (textColor.IsDefault || !Element.IsEnabled) + Control.TextColor = _defaultTextColor; + else + Control.TextColor = textColor.ToUIColor(); + } } }
\ No newline at end of file diff --git a/Xamarin.Forms.Platform.iOS/Renderers/PickerRenderer.cs b/Xamarin.Forms.Platform.iOS/Renderers/PickerRenderer.cs index e47d2fa4..7b5461e2 100644 --- a/Xamarin.Forms.Platform.iOS/Renderers/PickerRenderer.cs +++ b/Xamarin.Forms.Platform.iOS/Renderers/PickerRenderer.cs @@ -22,6 +22,7 @@ namespace Xamarin.Forms.Platform.iOS public class PickerRenderer : ViewRenderer<Picker, UITextField> { UIPickerView _picker; + UIColor _defaultTextColor; protected override void OnElementChanged(ElementChangedEventArgs<Picker> e) { @@ -56,12 +57,15 @@ namespace Xamarin.Forms.Platform.iOS entry.InputView = _picker; entry.InputAccessoryView = toolbar; + _defaultTextColor = entry.TextColor; + SetNativeControl(entry); } _picker.Model = new PickerSource(this); UpdatePicker(); + UpdateTextColor(); ((ObservableList<string>)e.NewElement.Items).CollectionChanged += RowsCollectionChanged; } @@ -76,6 +80,8 @@ namespace Xamarin.Forms.Platform.iOS UpdatePicker(); if (e.PropertyName == Picker.SelectedIndexProperty.PropertyName) UpdatePicker(); + if (e.PropertyName == Picker.TextColorProperty.PropertyName || e.PropertyName == VisualElement.IsEnabledProperty.PropertyName) + UpdateTextColor(); } void OnEnded(object sender, EventArgs eventArgs) @@ -133,6 +139,16 @@ namespace Xamarin.Forms.Platform.iOS _picker.Select(Math.Max(formsIndex, 0), 0, true); } + void UpdateTextColor() + { + var textColor = Element.TextColor; + + if (textColor.IsDefault || !Element.IsEnabled) + Control.TextColor = _defaultTextColor; + else + Control.TextColor = textColor.ToUIColor(); + } + class PickerSource : UIPickerViewModel { readonly PickerRenderer _renderer; diff --git a/Xamarin.Forms.Platform.iOS/Renderers/TimePickerRenderer.cs b/Xamarin.Forms.Platform.iOS/Renderers/TimePickerRenderer.cs index 85d3ad35..55dbf1c8 100644 --- a/Xamarin.Forms.Platform.iOS/Renderers/TimePickerRenderer.cs +++ b/Xamarin.Forms.Platform.iOS/Renderers/TimePickerRenderer.cs @@ -24,6 +24,7 @@ namespace Xamarin.Forms.Platform.iOS public class TimePickerRenderer : ViewRenderer<TimePicker, UITextField> { UIDatePicker _picker; + UIColor _defaultTextColor; protected override void Dispose(bool disposing) { @@ -61,12 +62,15 @@ namespace Xamarin.Forms.Platform.iOS entry.InputView = _picker; entry.InputAccessoryView = toolbar; + _defaultTextColor = entry.TextColor; + _picker.ValueChanged += OnValueChanged; SetNativeControl(entry); } UpdateTime(); + UpdateTextColor(); } base.OnElementChanged(e); @@ -78,6 +82,9 @@ namespace Xamarin.Forms.Platform.iOS if (e.PropertyName == TimePicker.TimeProperty.PropertyName || e.PropertyName == TimePicker.FormatProperty.PropertyName) UpdateTime(); + + if (e.PropertyName == TimePicker.TextColorProperty.PropertyName || e.PropertyName == VisualElement.IsEnabledProperty.PropertyName) + UpdateTextColor(); } void OnEnded(object sender, EventArgs eventArgs) @@ -95,6 +102,16 @@ namespace Xamarin.Forms.Platform.iOS ((IElementController)Element).SetValueFromRenderer(TimePicker.TimeProperty, _picker.Date.ToDateTime() - new DateTime(1, 1, 1)); } + void UpdateTextColor() + { + var textColor = Element.TextColor; + + if (textColor.IsDefault || !Element.IsEnabled) + Control.TextColor = _defaultTextColor; + else + Control.TextColor = textColor.ToUIColor(); + } + void UpdateTime() { _picker.Date = new DateTime(1, 1, 1).Add(Element.Time).ToNSDate(); diff --git a/docs/Xamarin.Forms.Core/Xamarin.Forms/DatePicker.xml b/docs/Xamarin.Forms.Core/Xamarin.Forms/DatePicker.xml index 913fdd7d..e1eaddb5 100644 --- a/docs/Xamarin.Forms.Core/Xamarin.Forms/DatePicker.xml +++ b/docs/Xamarin.Forms.Core/Xamarin.Forms/DatePicker.xml @@ -315,5 +315,36 @@ DatePicker datePicker = new DatePicker </remarks> </Docs> </Member> + <Member MemberName="TextColor"> + <MemberSignature Language="C#" Value="public Xamarin.Forms.Color TextColor { get; set; }" /> + <MemberSignature Language="ILAsm" Value=".property instance valuetype Xamarin.Forms.Color TextColor" /> + <MemberType>Property</MemberType> + <AssemblyInfo> + <AssemblyVersion>2.0.0.0</AssemblyVersion> + </AssemblyInfo> + <ReturnValue> + <ReturnType>Xamarin.Forms.Color</ReturnType> + </ReturnValue> + <Docs> + <summary>To be added.</summary> + <value>To be added.</value> + <remarks>To be added.</remarks> + </Docs> + </Member> + <Member MemberName="TextColorProperty"> + <MemberSignature Language="C#" Value="public static readonly Xamarin.Forms.BindableProperty TextColorProperty;" /> + <MemberSignature Language="ILAsm" Value=".field public static initonly class Xamarin.Forms.BindableProperty TextColorProperty" /> + <MemberType>Field</MemberType> + <AssemblyInfo> + <AssemblyVersion>2.0.0.0</AssemblyVersion> + </AssemblyInfo> + <ReturnValue> + <ReturnType>Xamarin.Forms.BindableProperty</ReturnType> + </ReturnValue> + <Docs> + <summary>To be added.</summary> + <remarks>To be added.</remarks> + </Docs> + </Member> </Members> </Type> diff --git a/docs/Xamarin.Forms.Core/Xamarin.Forms/Picker.xml b/docs/Xamarin.Forms.Core/Xamarin.Forms/Picker.xml index 87d63758..6daf123a 100644 --- a/docs/Xamarin.Forms.Core/Xamarin.Forms/Picker.xml +++ b/docs/Xamarin.Forms.Core/Xamarin.Forms/Picker.xml @@ -246,6 +246,37 @@ namespace FormsGallery </remarks> </Docs> </Member> + <Member MemberName="TextColor"> + <MemberSignature Language="C#" Value="public Xamarin.Forms.Color TextColor { get; set; }" /> + <MemberSignature Language="ILAsm" Value=".property instance valuetype Xamarin.Forms.Color TextColor" /> + <MemberType>Property</MemberType> + <AssemblyInfo> + <AssemblyVersion>2.0.0.0</AssemblyVersion> + </AssemblyInfo> + <ReturnValue> + <ReturnType>Xamarin.Forms.Color</ReturnType> + </ReturnValue> + <Docs> + <summary>To be added.</summary> + <value>To be added.</value> + <remarks>To be added.</remarks> + </Docs> + </Member> + <Member MemberName="TextColorProperty"> + <MemberSignature Language="C#" Value="public static readonly Xamarin.Forms.BindableProperty TextColorProperty;" /> + <MemberSignature Language="ILAsm" Value=".field public static initonly class Xamarin.Forms.BindableProperty TextColorProperty" /> + <MemberType>Field</MemberType> + <AssemblyInfo> + <AssemblyVersion>2.0.0.0</AssemblyVersion> + </AssemblyInfo> + <ReturnValue> + <ReturnType>Xamarin.Forms.BindableProperty</ReturnType> + </ReturnValue> + <Docs> + <summary>To be added.</summary> + <remarks>To be added.</remarks> + </Docs> + </Member> <Member MemberName="Title"> <MemberSignature Language="C#" Value="public string Title { get; set; }" /> <MemberSignature Language="ILAsm" Value=".property instance string Title" /> diff --git a/docs/Xamarin.Forms.Core/Xamarin.Forms/TimePicker.xml b/docs/Xamarin.Forms.Core/Xamarin.Forms/TimePicker.xml index af19bfd8..1c5119f1 100644 --- a/docs/Xamarin.Forms.Core/Xamarin.Forms/TimePicker.xml +++ b/docs/Xamarin.Forms.Core/Xamarin.Forms/TimePicker.xml @@ -102,6 +102,37 @@ var beeroclock = new TimePicker () { Time = new TimeSpan (17,0,0) }; </remarks> </Docs> </Member> + <Member MemberName="TextColor"> + <MemberSignature Language="C#" Value="public Xamarin.Forms.Color TextColor { get; set; }" /> + <MemberSignature Language="ILAsm" Value=".property instance valuetype Xamarin.Forms.Color TextColor" /> + <MemberType>Property</MemberType> + <AssemblyInfo> + <AssemblyVersion>2.0.0.0</AssemblyVersion> + </AssemblyInfo> + <ReturnValue> + <ReturnType>Xamarin.Forms.Color</ReturnType> + </ReturnValue> + <Docs> + <summary>To be added.</summary> + <value>To be added.</value> + <remarks>To be added.</remarks> + </Docs> + </Member> + <Member MemberName="TextColorProperty"> + <MemberSignature Language="C#" Value="public static readonly Xamarin.Forms.BindableProperty TextColorProperty;" /> + <MemberSignature Language="ILAsm" Value=".field public static initonly class Xamarin.Forms.BindableProperty TextColorProperty" /> + <MemberType>Field</MemberType> + <AssemblyInfo> + <AssemblyVersion>2.0.0.0</AssemblyVersion> + </AssemblyInfo> + <ReturnValue> + <ReturnType>Xamarin.Forms.BindableProperty</ReturnType> + </ReturnValue> + <Docs> + <summary>To be added.</summary> + <remarks>To be added.</remarks> + </Docs> + </Member> <Member MemberName="Time"> <MemberSignature Language="C#" Value="public TimeSpan Time { get; set; }" /> <MemberSignature Language="ILAsm" Value=".property instance valuetype System.TimeSpan Time" /> |