我需要在禁用按钮时更改按钮的文本颜色,我已经为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更改此状态更改,这将是应用的默认样式。
这两种方式都没有解决
如果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;
}
}
...
}
在不弄乱自定义渲染器的情况下执行此操作的另一种方法是使按钮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
}
因为android没有改变颜色,我也通过样式创建了触发器,也没有解决。
有一些可能导致问题的可能性:
Button
类型定义渲染器,Droid项目中有Android.widget.Button
和Xamarin.Forms.Button
,定义渲染器所需的是Xamarin.Forms.Button
:
[assembly:ExportRenderer(typeof(Xamarin.Forms.Button),
typeof(MyButtonRenderer))]
namespace xxxxxxxxx.Droid
{
...
}
e.OldElement.TextColor = Color.White;
。实际上当时e.OldElement
可能是null,因为它代表旧元素。所以只需删除此行。并且代码将正常工作。