更改禁用按钮中的按钮文本颜色(Xamarin.Forms)

问题描述 投票:0回答:3

我需要在禁用按钮时更改按钮的文本颜色,我已经为iOS创建了一个自定义渲染器,为Android创建了一个。 iOS工作得很好,因为android没有改变颜色,我也通过样式创建了触发器,也没有解决。

如何使Xamarin.Forms的颜色交换工作?

Android渲染器:

[assembly: ExportRenderer(typeof(Button), typeof(MyButtonRenderer))]
namespace xxxxxx.Droid.Renderers
{
    public class MyButtonRenderer : ButtonRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Button> e)
        {
            base.OnElementChanged(e);

            if (Control != null)
                Control.SetTextColor(Color.White.ToAndroid());

            if (e != null)
            {
                e.NewElement.TextColor = Color.White;
                e.OldElement.TextColor = Color.White;
            }
        }
    }
}

根据我的命令的CanExecute更改此状态更改,这将是应用的默认样式。

这两种方式都没有解决

c# xamarin xamarin.forms xamarin.android
3个回答
1
投票

如果CanExecute按预期工作,那么您的IsEnabled属性应相应更新。您可以通过OnElementPropertyChanged方法收听此属性值更改。

public class MyButtonRenderer : ButtonRenderer
{

    ....

    protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        base.OnElementPropertyChanged(sender, e);

        if (e.PropertyName == nameof(Button.IsEnabled))
        {
            Element.TextColor = Element.IsEnabled ? Color.White : Color.Gray;
        }
    }

    ...

}

1
投票

在不弄乱自定义渲染器的情况下执行此操作的另一种方法是使按钮InputTransparent并在输入透明时阻止按下。当InputTransparent设置为true时,用户将无法单击该按钮,但它将保留其所有样式。唯一的问题是,如果在填写完最后一个输入字段时激活了按钮,则仍然可以单击该按钮。解决此问题的方法是在按钮单击方法中添加一个简单的InputTransparent检查。

XAML:

<!-- Uses "InputTransparent" instead of "IsEnabled" so we can have control of the text color when the button is "Disabled" -->
<!-- Must add "if (btnLogin.InputTransparent == true) return;" code to the top of the button clicked method of this event to block "LastControl" auto click -->
<Button Text="im back!" x:Name="btnLogin" Style="{StaticResource BaseButtonStyleTransparent}" WidthRequest="225" InputTransparent="True" TextColor="#999999">
    <Button.Triggers>
        <MultiTrigger TargetType="Button">
            <MultiTrigger.Conditions>
                <BindingCondition Binding="{Binding Source={x:Reference txtEmail}, Path=IsValid, Converter={StaticResource dataHasBeenEntered}}" Value="true" />
                <BindingCondition Binding="{Binding Source={x:Reference txtPassword}, Path=IsValid, Converter={StaticResource dataHasBeenEntered}}" Value="true" />
            </MultiTrigger.Conditions>
            <Setter Property="InputTransparent" Value="False" />
            <Setter Property="TextColor" Value="White" />
        </MultiTrigger>
    </Button.Triggers>
</Button>

C#:

private async void LoginClicked(object sender, EventArgs e)
{
    // If the button is psudo disabled dont let the user click the button
    if (btnLogin.InputTransparent == true)
        return;

    // Rest of LoginClicked Code   
}

0
投票

因为android没有改变颜色,我也通过样式创建了触发器,也没有解决。

有一些可能导致问题的可能性:

  1. 最有可能的是,您使用错误的Button类型定义渲染器,Droid项目中有Android.widget.ButtonXamarin.Forms.Button,定义渲染器所需的是Xamarin.Forms.Button[assembly:ExportRenderer(typeof(Xamarin.Forms.Button), typeof(MyButtonRenderer))] namespace xxxxxxxxx.Droid { ... }
  2. 你不需要设置e.OldElement.TextColor = Color.White;。实际上当时e.OldElement可能是null,因为它代表旧元素。所以只需删除此行。并且代码将正常工作。
© www.soinside.com 2019 - 2024. All rights reserved.