diff options
author | Samantha Houts <samantha.houts@xamarin.com> | 2016-03-29 15:41:39 -0700 |
---|---|---|
committer | Samantha Houts <samantha.houts@xamarin.com> | 2016-03-29 15:41:39 -0700 |
commit | 0817c7a4580a01fe03336276e3ec325b9c1bdf2f (patch) | |
tree | b0ca94775dc87da9f48ef700f195119628feaece | |
parent | 346338b5dc3c84b80969376bc87e886f4ef880a8 (diff) | |
download | xamarin-forms-0817c7a4580a01fe03336276e3ec325b9c1bdf2f.tar.gz xamarin-forms-0817c7a4580a01fe03336276e3ec325b9c1bdf2f.tar.bz2 xamarin-forms-0817c7a4580a01fe03336276e3ec325b9c1bdf2f.zip |
[W] Button BG Color & BorderRadius are consistent
UWP Buttons now respect the BorderRadius.
BackgroundColor no longer extends past the Border.
4 files changed, 147 insertions, 7 deletions
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39853.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39853.cs new file mode 100644 index 00000000..54f4e3e1 --- /dev/null +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39853.cs @@ -0,0 +1,78 @@ +using System; + +using Xamarin.Forms.CustomAttributes; + +namespace Xamarin.Forms.Controls +{ + [Preserve(AllMembers = true)] + [Issue(IssueTracker.Bugzilla, 39853, "BorderRadius ignored on UWP", PlatformAffected.WinRT)] + public class Bugzilla39853 : TestContentPage + { + public class RoundedButton : Xamarin.Forms.Button + { + public RoundedButton(int radius) + { + base.BorderRadius = radius; + base.WidthRequest = 2 * radius; + base.HeightRequest = 2 * radius; + HorizontalOptions = LayoutOptions.Center; + VerticalOptions = LayoutOptions.Center; + BackgroundColor = Color.Aqua; + BorderColor = Color.White; + TextColor = Color.Purple; + Text = "YAY"; + Image = new FileImageSource { File = "crimson.jpg" }; + } + + public new int BorderRadius + { + get + { + return base.BorderRadius; + } + + set + { + base.WidthRequest = 2 * value; + base.HeightRequest = 2 * value; + base.BorderRadius = value; + } + } + + public new double WidthRequest + { + get + { + return base.WidthRequest; + } + + set + { + base.WidthRequest = value; + base.HeightRequest = value; + base.BorderRadius = ((int)value) / 2; + } + } + + public new double HeightRequest + { + get + { + return base.HeightRequest; + } + + set + { + base.WidthRequest = value; + base.HeightRequest = value; + base.BorderRadius = ((int)value) / 2; + } + } + + } + protected override void Init() + { + Content = new RoundedButton(100); + } + } +} diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems index 81a6c2e2..bca0e29c 100644 --- a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems @@ -126,6 +126,7 @@ <Compile Include="$(MSBuildThisFileDirectory)Bugzilla39499.cs" /> <Compile Include="$(MSBuildThisFileDirectory)Bugzilla39668.cs" /> <Compile Include="$(MSBuildThisFileDirectory)Bugzilla39829.cs" /> + <Compile Include="$(MSBuildThisFileDirectory)Bugzilla39853.cs" /> <Compile Include="$(MSBuildThisFileDirectory)_Template.cs" /> <Compile Include="$(MSBuildThisFileDirectory)Issue1028.cs" /> <Compile Include="$(MSBuildThisFileDirectory)Issue1075.cs" /> diff --git a/Xamarin.Forms.Platform.WinRT/ButtonRenderer.cs b/Xamarin.Forms.Platform.WinRT/ButtonRenderer.cs index 60ee6418..131e5f9f 100644 --- a/Xamarin.Forms.Platform.WinRT/ButtonRenderer.cs +++ b/Xamarin.Forms.Platform.WinRT/ButtonRenderer.cs @@ -88,6 +88,14 @@ namespace Xamarin.Forms.Platform.WinRT } } + protected override void UpdateBackgroundColor() + { + // Button is a special case; we don't want to set the Control's background + // because it goes outside the bounds of the Border/ContentPresenter, + // which is where we might change the BorderRadius to create a rounded shape. + return; + } + void OnButtonClick(object sender, RoutedEventArgs e) { Button buttonView = Element; @@ -97,7 +105,7 @@ namespace Xamarin.Forms.Platform.WinRT void UpdateBackground() { - Control.Background = Element.BackgroundColor != Color.Default ? Element.BackgroundColor.ToBrush() : (Brush)Windows.UI.Xaml.Application.Current.Resources["ButtonBackgroundThemeBrush"]; + Control.BackgroundColor = Element.BackgroundColor != Color.Default ? Element.BackgroundColor.ToBrush() : (Brush)Windows.UI.Xaml.Application.Current.Resources["ButtonBackgroundThemeBrush"]; } void UpdateBorderColor() diff --git a/Xamarin.Forms.Platform.WinRT/FormsButton.cs b/Xamarin.Forms.Platform.WinRT/FormsButton.cs index 73c2f922..ffe75d4f 100644 --- a/Xamarin.Forms.Platform.WinRT/FormsButton.cs +++ b/Xamarin.Forms.Platform.WinRT/FormsButton.cs @@ -1,7 +1,9 @@ using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Media; #if WINDOWS_UWP +using WContentPresenter = Windows.UI.Xaml.Controls.ContentPresenter; namespace Xamarin.Forms.Platform.UWP #else @@ -11,36 +13,87 @@ namespace Xamarin.Forms.Platform.WinRT { public class FormsButton : Windows.UI.Xaml.Controls.Button { - public static readonly DependencyProperty BorderRadiusProperty = DependencyProperty.Register("BorderRadius", typeof(int), typeof(FormsButton), + public static readonly DependencyProperty BorderRadiusProperty = DependencyProperty.Register(nameof(BorderRadius), typeof(int), typeof(FormsButton), new PropertyMetadata(default(int), OnBorderRadiusChanged)); + public static readonly DependencyProperty BackgroundColorProperty = DependencyProperty.Register(nameof(BackgroundColor), typeof(Brush), typeof(FormsButton), + new PropertyMetadata(default(Brush), OnBackgroundColorChanged)); + +#if WINDOWS_UWP + WContentPresenter _contentPresenter; +#else Border _border; +#endif + + public Brush BackgroundColor + { + get + { + return (Brush)GetValue(BackgroundColorProperty); + } + set + { + SetValue(BackgroundColorProperty, value); + } + } public int BorderRadius { - get { return (int)GetValue(BorderRadiusProperty); } - set { SetValue(BorderRadiusProperty, value); } + get + { + return (int)GetValue(BorderRadiusProperty); + } + set + { + SetValue(BorderRadiusProperty, value); + } } protected override void OnApplyTemplate() { base.OnApplyTemplate(); +#if WINDOWS_UWP + _contentPresenter = GetTemplateChild("ContentPresenter") as WContentPresenter; +#else _border = GetTemplateChild("Border") as Border; +#endif + UpdateBackgroundColor(); UpdateBorderRadius(); } + static void OnBackgroundColorChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + ((FormsButton)d).UpdateBackgroundColor(); + } + static void OnBorderRadiusChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { ((FormsButton)d).UpdateBorderRadius(); } + void UpdateBackgroundColor() + { + Background = Color.Transparent.ToBrush(); +#if WINDOWS_UWP + if (_contentPresenter != null) + _contentPresenter.Background = BackgroundColor; +#else + if (_border != null) + _border.Background = BackgroundColor; +#endif + } + void UpdateBorderRadius() { - if (_border == null) - return; - _border.CornerRadius = new CornerRadius(BorderRadius); +#if WINDOWS_UWP + if (_contentPresenter != null) + _contentPresenter.CornerRadius = new CornerRadius(BorderRadius); +#else + if (_border != null) + _border.CornerRadius = new CornerRadius(BorderRadius); +#endif } } }
\ No newline at end of file |