如何更改“Xamarin.Forms Material Visual”禁用按钮的透明度?

Posted

技术标签:

【中文标题】如何更改“Xamarin.Forms Material Visual”禁用按钮的透明度?【英文标题】:How to change transparency of "Xamarin.Forms Material Visual" disabled button? 【发布时间】:2021-01-11 08:30:12 【问题描述】:

我想更改禁用按钮的透明度。

禁用按钮视图

启用按钮视图

[assembly: ExportRenderer(typeof(LabelButton), typeof(SkyRacing.Droid.LabelButtonRenderer))]
namespace SkyRacing.Droid

    public class LabelButtonRenderer : MaterialButtonRenderer
    
        public LabelButtonRenderer(Context ctx) : base(ctx)
        

        

        protected override void OnDraw(android.Graphics.Canvas canvas)
        
            base.OnDraw(canvas);

            if (!Element.IsEnabled)
                Element.Opacity = 0.9;
        

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

            if (e.PropertyName == nameof(Xamarin.Forms.Button.IsEnabled))
            
                if (!Element.IsEnabled)
                    Element.Opacity = 0.9;
            
        
    

我尝试创建自定义渲染器并将禁用按钮的不透明度更改为 0.9,但它仍然太透明。如何降低按钮的透明度? (仅供参考,在调试模式下,我检查了 Element 属性。在我设置为 0.9 之前它已经是 1,想知道它是如何透明的)。

【问题讨论】:

【参考方案1】:

如果Buttondisabled,您可以使用Style 自定义任何属性。更改Opacity 的值以更改按钮的透明度。

<ContentPage.Resources>

    <Style x:Key="BaseButton" TargetType="Button">
        <Style.Triggers>
            <Trigger TargetType="Button"
                     Property="IsEnabled"
                     Value="False">
                <Setter Property="TextColor" Value="#5019171c" />
                <Setter Property="BackgroundColor" Value="Red" />
                <Setter Property="Opacity" Value="0.9" />
            </Trigger>
        </Style.Triggers>
    </Style>

</ContentPage.Resources>

<StackLayout>
    <!-- Place new controls here -->
    <Button Text="click" Clicked="Button_Clicked"/>

    <Button Text="sampleButton"  BackgroundColor="Blue" x:Name="sampleButton" Style="StaticResource BaseButton"/>
</StackLayout>

更新代码:

[assembly: ExportRenderer(typeof(Xamarin.Forms.Button), typeof(LabelButtonRenderer), new[]  typeof(VisualMarker.MaterialVisual) )]
namespace App389.Droid

    public class LabelButtonRenderer : MaterialButtonRenderer
    
        public LabelButtonRenderer(Context ctx) : base(ctx)
        

        


        protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Button> e)
        
            base.OnElementChanged(e);
        

        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        

            if (e.PropertyName == nameof(Xamarin.Forms.Button.IsEnabled))
            
                if (Element.IsEnabled == false) 
                                       
                    Control.BackgroundTintList = Android.App.Application.Context.Resources.GetColorStateList(Resource.Color.button_normalcolor);
                
                else
                
                    Control.BackgroundTintList = Android.App.Application.Context.Resources.GetColorStateList(Resource.Color.button_disablecolor);
                
            

               
    

并在colors.xml中添加颜色:

<resources>
    <color name="launcher_background">#FFFFFF</color>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF4081</color>
  
    <color name="button_normalcolor">#ff00</color>
    <color name="button_disablecolor">#FF4081</color>

</resources>

更新 ios 代码:

[assembly: ExportRenderer(typeof(Xamarin.Forms.Button), typeof(LabelButtonRenderer), new[]  typeof(VisualMarker.MaterialVisual) )]
public class LabelButtonRenderer : MaterialButtonRenderer


    protected override void OnElementChanged(ElementChangedEventArgs<Button> e)
    
        base.OnElementChanged(e);

    

    protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
    

        Console.WriteLine(e.PropertyName.ToString());

        if (e.PropertyName == nameof(Xamarin.Forms.Button.IsEnabled))
        
            Control.BackgroundColor = Element.BackgroundColor.ToUIColor();

        

    

【讨论】:

已经试过了,即使我将不透明度设置为1,按钮仍然是透明的。对于默认视觉效果,它可以正常工作,但对于材质视觉效果,他们正在为透明应用其他东西。 @DragonWarrior 我的解决方案对您有用吗?如果是,请您接受(点击此答案左上角的☑️),以便我们可以帮助更多有相同问题的人:)。 嗨@Jack Hua - MSFT,抱歉回复延迟。我想你可能很接近,但我不想在那里硬编码背景颜色。我想要的是,它应该采用我在 XMAL 代码中设置的任何颜色,并在禁用时删除透明度。感谢您的努力,我真的很感激。 &lt;Button BackgroundColor="Black" Visual="Material" Text="Click Me!" HorizontalOptions="Center" VerticalOptions="Center" IsEnabled="False"/&gt; 您可以使用这个简单的按钮进行检查。请记住,需要安装 Xamarin.Forms.Visual.Material 才能应用材料设计效果。 是的,使用我的代码需要硬编码那里的颜色,因为 Control.BackgroundTintList 使用 Resource.Color 中的颜色。否则,您可以将颜色从表单项目传递到 Android 项目,然后在自定义渲染器中获取并使用该颜色。【参考方案2】:

@Jack 提供的解决方案对我有用。此外,您可以这样尝试:

<Button x:Name="testButton" Text="Test">
            <VisualStateManager.VisualStateGroups>
                <VisualStateGroup x:Name="CommonStates">
                    <VisualState x:Name="Normal">
                        <VisualState.Setters>
                            <Setter Property="BackgroundColor" Value="Blue" />
                        </VisualState.Setters>
                    </VisualState>
                    <VisualState x:Name="Disabled">
                        <VisualState.Setters>
                            <Setter Property="BackgroundColor" Value="Blue" />
                            <Setter Property="Opacity" Value="0.9"/>
                        </VisualState.Setters>
                    </VisualState>
                </VisualStateGroup>
            </VisualStateManager.VisualStateGroups>
        </Button>

如果这也不起作用,请分享有关您的 xaml 的更多详细信息

【讨论】:

不,这对我不起作用,可能适用于默认视觉,但不适用于 Visual="Material" 请分享您的 xaml 详细信息 &lt;Button BackgroundColor="Black" Visual="Material" Text="Click Me!" HorizontalOptions="Center" VerticalOptions="Center" IsEnabled="False"/&gt; 您可以使用这个简单的按钮进行检查。请记住,需要安装 Xamarin.Forms.Visual.Material 才能应用材料设计效果。

以上是关于如何更改“Xamarin.Forms Material Visual”禁用按钮的透明度?的主要内容,如果未能解决你的问题,请参考以下文章

更改模式时如何更改导航阴影颜色?

如何更改分区ID为AF?

更改标签文本时如何更改标签颜色

如何更改环境的字体大小?

如何使用 sqitch postgresql 验证更改列数据类型更改?

如何更改列表框项目的文本?