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