首页 > 解决方案 > 在 Xamarin 中的 IsEnabled 上更改按钮的 TextColor

问题描述

在 Xamarin App 中,我想更改TextColor. 只有从.ButtonIsEnabled = falsePicker

@Leo Zhu - MSFT => https://stackoverflow.com/a/64854260/14139029有一个解决方案,非常有帮助,但在这种情况下不起作用。

.xml

<Button
    x:Name="FormButton"
    IsEnabled="False"
    TextColor="#4DABFE"
    Text="Submit"
    Command={Binding FormButtonCommand}>
    <Button.Triggers>
        <MultiTrigger TargetType="Button">
             <MultiTrigger.Conditions>
                <BindingCondition Binding="{Binding SelectedState,
                                                       Converter={StaticResource stringNullOrEmptyValueBoolConverter }}" Value="false" />
                <BindingCondition Binding="{Binding SelectedCity,
                                                       Converter={StaticResource stringNullOrEmptyValueBoolConverter }}" Value="false" />
             </MultiTrigger.Conditions>

        <Setter Property="IsEnabled" Value="True" />
        </MultiTrigger>
    </Button.Triggers>
</Button>

视图模型.cs

public ICommand FormButtonCommand => new Command(async (formbutton) =>
{
    if (SelectedCity == "Tokyo")
    {
        // Code
    }
    else if (SelectedCity == "Moscow")
    {
        // Code
    }
}, (x) => false);

标签: c#.netxamarinxamarin.forms

解决方案


好的,同样的道理,你设置了Button的IsEnable属性,当它为false时,它会以默认样式显示。

这是针对这种情况的解决方案(也适用于最后一种情况):</p>

在两个平台上创建一个自定义 ButtonRenderer:

对于安卓:</p>

[assembly: ExportRenderer(typeof(Button), typeof(CustomButtonRenderer))]
namespace Your namepace
{
   class CustomButtonRenderer :ButtonRenderer
   {

      public CustomButtonRenderer(Context context):base(context)
      {

      } 
      protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Button> e)
      {
         base.OnElementChanged(e);
         if (Control != null) SetColors();
   
      }

      protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs args)
      {
         base.OnElementPropertyChanged(sender, args);
         if (args.PropertyName == nameof(Button.IsEnabled)) SetColors();
      }
      private void SetColors()
      {
         Control.SetTextColor(Element.IsEnabled ? Color.FromHex("004B87").ToAndroid() : Color.FromHex("4DABFE").ToAndroid());
         Control.SetBackgroundColor(Element.IsEnabled ? Color.FromHex("222222").ToAndroid() : Color.FromHex("FFFFFF").ToAndroid());
      }
   }
}     

对于 iOS

[assembly: ExportRenderer(typeof(Button), typeof(CustomButtonRenderer))]
namespace Your namepace
{
  public class CustomButtonRenderer: ButtonRenderer
  {
    protected override void OnElementChanged(ElementChangedEventArgs<Button> args)
    {
        base.OnElementChanged(args);
        if (Control != null) SetColors();
    }

    protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs args)
    {
        base.OnElementPropertyChanged(sender, args);
        if (args.PropertyName == nameof(Button.IsEnabled)) SetColors();
    }

    private void SetColors()
    {
        Control.SetTitleColor(Element.IsEnabled ? Color.FromHex("004B87").ToUIColor() : Color.FromHex("4DABFE").ToUIColor(), Element.IsEnabled ? UIControlState.Normal : UIControlState.Disabled);
        Control.BackgroundColor = Element.IsEnabled ? Color.FromHex("222222").ToUIColor() : Color.FromHex("FFFFFF").ToUIColor();
    }
  }
}

推荐阅读