C# 按钮颜色绑定会影响大小

C# 按钮颜色绑定会影响大小,c#,.net,xaml,xamarin,xamarin.forms,C#,.net,Xaml,Xamarin,Xamarin.forms,我有三个按钮。如果可以更改元素,“保存”按钮的颜色为绿色,如果无法更改,则为灰色。我将按钮的颜色与ViewModel上的属性绑定,该属性是一个字符串,并使用转换器转换字符串的值。当我从按钮中移除颜色的绑定时,大小很好,但是使用绑定时,大小比其他按钮的大小小 <StackLayout Grid.Row="3" Orientation="Horizontal"

我有三个按钮。如果可以更改元素,“保存”按钮的颜色为绿色,如果无法更改,则为灰色。我将按钮的颜色与ViewModel上的属性绑定,该属性是一个字符串,并使用转换器转换字符串的值。当我从按钮中移除颜色的绑定时,大小很好,但是使用绑定时,大小比其他按钮的大小小

<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);
                }
            }
        }
    }
}