【问题标题】:Change TextColor of Button on IsEnabled in Xamarin在 Xamarin 中的 IsEnabled 上更改按钮的 TextColor
【发布时间】:2020-11-17 10:26:26
【问题描述】:

在 Xamarin App 中,我想在 IsEnabled = false 时更改 ButtonTextColor。在从 Picker 中选择项目之前,此按钮不会启用。

@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>

ViewModel.cs

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

【问题讨论】:

  • 请出示 SelectedCity 属性声明。

标签: c# .net xamarin xamarin.forms


【解决方案1】:

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

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

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

安卓版

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

【讨论】:

  • 如果有一个按钮,我不想从CustomRenderer设置它的颜色,我怎么能避免呢?再次感谢
  • 你可以自定义按钮,并添加bindableproperty(例如:EnableTextColor,DisEnableTextColor ...),然后你可以在你的xaml中定义颜色,在CustomRenderer中你可以得到你的颜色设置。
猜你喜欢
  • 2021-02-25
  • 1970-01-01
  • 2013-03-31
  • 2011-12-09
  • 1970-01-01
  • 2019-12-21
  • 2020-02-28
  • 2014-12-20
  • 1970-01-01
相关资源
最近更新 更多