C# 按钮颜色绑定会影响大小
我有三个按钮。如果可以更改元素,“保存”按钮的颜色为绿色,如果无法更改,则为灰色。我将按钮的颜色与ViewModel上的属性绑定,该属性是一个字符串,并使用转换器转换字符串的值。当我从按钮中移除颜色的绑定时,大小很好,但是使用绑定时,大小比其他按钮的大小小C# 按钮颜色绑定会影响大小,c#,.net,xaml,xamarin,xamarin.forms,C#,.net,Xaml,Xamarin,Xamarin.forms,我有三个按钮。如果可以更改元素,“保存”按钮的颜色为绿色,如果无法更改,则为灰色。我将按钮的颜色与ViewModel上的属性绑定,该属性是一个字符串,并使用转换器转换字符串的值。当我从按钮中移除颜色的绑定时,大小很好,但是使用绑定时,大小比其他按钮的大小小 <StackLayout Grid.Row="3" Orientation="Horizontal"
<StackLayout Grid.Row="3"
Orientation="Horizontal"
Padding="5,5,5,5"
BackgroundColor="CadetBlue">
<Button x:Name="wczytajWzorzecButton"
WidthRequest="120" HeightRequest="20"
Text="Last" FontSize="12"
HorizontalOptions="CenterAndExpand"
Command="{Binding GetTemplateCommand}"/>
<Button x:Name="wczytajOstatniButton"
WidthRequest="120" HeightRequest="20"
Text="First" FontSize="12"
HorizontalOptions="EndAndExpand"
Command="{Binding GetLastDocumentCommand}"/>
<Button x:Name="saveButton"
WidthRequest="120" HeightRequest="20"
Text="Save" FontSize="12"
BackgroundColor="{Binding PropertyButtonColor, Converter={StaticResource StringToColorConverter}}"
HorizontalOptions="StartAndExpand"
Command="{Binding SaveDocumentCommand}"/>
</StackLayout>
我的ViewModel:
public string PropertyButtonColor
{
get
{
if (CanSave())
return "Green";
else
return "Gray";
}
}
你知道为什么会这样吗?这个问题不是由绑定引起的,如果你为
按钮设置背景色,这个按钮的大小将在android中改变,就像下面的屏幕截图一样
事实上,这是一个不同的绘图正在使用
由于您要求使用纯色,请注意,wczytajOstatniButton
和wczytajWzorzecButton
有阴影
但是saveButton
没有,它是蓝色的
如果在“开发人员选项”中启用“显示布局边界”
,您将看到控件的实际边界,并且可能很清楚按钮是否变大了,或者只是不同的可绘制图形使其看起来更大了
这里有一个解决此问题的方法,您可以创建一个custon按钮
public class TintableButton : Button
{
public static readonly BindableProperty TintColorProperty = BindableProperty.Create("TintColor", typeof(Color), typeof(Button), (object)Color.Default, BindingMode.OneWay, (BindableProperty.ValidateValueDelegate)null, (BindableProperty.BindingPropertyChangedDelegate)null, (BindableProperty.BindingPropertyChangingDelegate)null, (BindableProperty.CoerceValueDelegate)null, (BindableProperty.CreateDefaultValueDelegate)null);
public Color TintColor
{
get
{
return (Color)GetValue(TintColorProperty);
}
set
{
SetValue(TintColorProperty, value);
}
}
}
然后在android中创建自定义渲染器。在控件背景上设置SetColorFilter
[assembly: ExportRenderer(typeof(TintableButton), typeof(TintableButtonRenderer))]
namespace ImageViewModel.Droid
{
public class TintableButtonRenderer : ButtonRenderer
{
public TintableButtonRenderer(Context context) : base(context)
{
}
protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Button> e)
{
base.OnElementChanged(e);
var control = e.NewElement as TintableButton;
if (control != null)
{
if (control.TintColor != Xamarin.Forms.Color.Default)
{
var androidColor = control.TintColor.ToAndroid();
Control.Background.SetColorFilter(androidColor, PorterDuff.Mode.Src);
}
}
}
}
}
[程序集:导出渲染器(typeof(TintableButton)、typeof(TintableButtonRenderer))]
命名空间ImageViewModel.Droid
{
公共类TintableButtonRenderer:ButtonRenderer
{
公共TintableButtonRenderer(上下文):基础(上下文)
{
}
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
var control=e.NewElement作为TintableButton;
if(控件!=null)
{
if(control.TintColor!=Xamarin.Forms.Color.Default)
{
var androidColor=control.TintColor.ToAndroid();
Control.Background.SetColorFilter(androidColor,PorterDuff.Mode.Src);
}
}
}
}
}
下面是跑步截图
请给我一些截图。顺便说一句,为什么不在ViewModel中返回“Color.Green”而不是返回字符串呢。
[assembly: ExportRenderer(typeof(TintableButton), typeof(TintableButtonRenderer))]
namespace ImageViewModel.Droid
{
public class TintableButtonRenderer : ButtonRenderer
{
public TintableButtonRenderer(Context context) : base(context)
{
}
protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Button> e)
{
base.OnElementChanged(e);
var control = e.NewElement as TintableButton;
if (control != null)
{
if (control.TintColor != Xamarin.Forms.Color.Default)
{
var androidColor = control.TintColor.ToAndroid();
Control.Background.SetColorFilter(androidColor, PorterDuff.Mode.Src);
}
}
}
}
}