Add TextColor Property to Picker, TimePicker, DatePicker (#84)
authorE.Z. Hart <hartez@users.noreply.github.com>
Tue, 19 Apr 2016 07:01:58 +0000 (01:01 -0600)
committerJason Smith <jason.smith@xamarin.com>
Tue, 19 Apr 2016 07:01:58 +0000 (00:01 -0700)
* 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:
Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/DefaultColorToggleTest.cs
Xamarin.Forms.Controls/CoreGalleryPages/DatePickerCoreGalleryPage.cs
Xamarin.Forms.Controls/CoreGalleryPages/PickerCoreGalleryPage.cs
Xamarin.Forms.Controls/CoreGalleryPages/TimePickerCoreGalleryPage.cs
Xamarin.Forms.Core/DatePicker.cs
Xamarin.Forms.Core/Picker.cs
Xamarin.Forms.Core/TimePicker.cs
Xamarin.Forms.CustomAttributes/TestAttributes.cs
Xamarin.Forms.Platform.Android/AppCompat/ButtonRenderer.cs
Xamarin.Forms.Platform.Android/AppCompat/PickerRenderer.cs
Xamarin.Forms.Platform.Android/ColorExtensions.cs
Xamarin.Forms.Platform.Android/Renderers/ButtonRenderer.cs
Xamarin.Forms.Platform.Android/Renderers/DatePickerRenderer.cs
Xamarin.Forms.Platform.Android/Renderers/PickerRenderer.cs
Xamarin.Forms.Platform.Android/Renderers/TimePickerRenderer.cs
Xamarin.Forms.Platform.Android/TextColorSwitcher.cs [new file with mode: 0644]
Xamarin.Forms.Platform.Android/Xamarin.Forms.Platform.Android.csproj
Xamarin.Forms.Platform.WP8/DatePickerRenderer.cs
Xamarin.Forms.Platform.WP8/PickerRenderer.cs
Xamarin.Forms.Platform.WP8/TimePickerRenderer.cs
Xamarin.Forms.Platform.WinRT/DatePickerRenderer.cs
Xamarin.Forms.Platform.WinRT/FormsTimePicker.cs
Xamarin.Forms.Platform.WinRT/PickerRenderer.cs
Xamarin.Forms.Platform.WinRT/TimePickerRenderer.cs
Xamarin.Forms.Platform.iOS/Renderers/DatePickerRenderer.cs
Xamarin.Forms.Platform.iOS/Renderers/PickerRenderer.cs
Xamarin.Forms.Platform.iOS/Renderers/TimePickerRenderer.cs
docs/Xamarin.Forms.Core/Xamarin.Forms/DatePicker.xml
docs/Xamarin.Forms.Core/Xamarin.Forms/Picker.xml
docs/Xamarin.Forms.Core/Xamarin.Forms/TimePicker.xml

index 6f6cec0..9bd8c14 100644 (file)
-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
+                                       }
+                               }
+                       };
+               }
        }
 }
index 1dbb9bb..7cd0f11 100644 (file)
@@ -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
index cea755d..323b607 100644 (file)
@@ -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
index bf8b9c9..a6a94eb 100644 (file)
@@ -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
index 15f1c19..20eecae 100644 (file)
@@ -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)
index 733f207..5c2fb72 100644 (file)
@@ -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); }
index a9cf2e1..0a33c2e 100644 (file)
@@ -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); }
index 7aa9fb0..3ac2e6f 100644 (file)
@@ -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 {
index 3260dbf..8f4ef35 100644 (file)
@@ -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
index dd7fb85..492b553 100644 (file)
@@ -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
index 2fee25a..db190b4 100644 (file)
@@ -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
index 43f042b..7247361 100644 (file)
@@ -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
index 11d9a0d..5b0e099 100644 (file)
@@ -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();
index b9114d2..e9cc394 100644 (file)
@@ -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();
index cfa676d..010eda7 100644 (file)
@@ -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 (file)
index 0000000..6beafd5
--- /dev/null
@@ -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
index a6d4746..b33427b 100644 (file)
@@ -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>
     <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" />
index 9553171..5685310 100644 (file)
@@ -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
index f9cd2d8..d52f731 100644 (file)
@@ -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;
index 70841d7..542bddf 100644 (file)
@@ -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
index 23f134f..88df5cb 100644 (file)
@@ -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
index 976c56f..c135a58 100644 (file)
@@ -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
 
index a7fcbb4..e37b79a 100644 (file)
@@ -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;
index 3aa5fdc..8c878b2 100644 (file)
@@ -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
index fd2b154..6d70d7c 100644 (file)
@@ -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
index e47d2fa..7b5461e 100644 (file)
@@ -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;
index 85d3ad3..55dbf1c 100644 (file)
@@ -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();
index 913fdd7..e1eaddb 100644 (file)
@@ -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>
index 87d6375..6daf123 100644 (file)
@@ -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" />
index af19bfd..1c5119f 100644 (file)
@@ -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" />