【问题标题】:Xamarin.Forms dynamic button stylingXamarin.Forms 动态按钮样式
【发布时间】:2017-03-28 11:56:34
【问题描述】:

我想实现我自己的自定义按钮样式。每当按钮更改其状态(从启用到禁用即)时,样式都必须更改。

我目前的解决方案是在 Android 中定义一种样式,然后我的自定义 ButtonRenderer 将此样式应用于按钮。

Button_Style.xml:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:state_pressed="true" >
    <shape>
      <solid
          android:color="#d7d7d7" />
      <stroke
          android:width="1dp"
          android:color="#d7d7d7" />
      <corners
          android:radius="6dp" />
      <padding
          android:left="10dp"
          android:top="10dp"
          android:right="10dp"
          android:bottom="10dp" />
    </shape>
  </item>
  <item android:state_enabled="false">
    <shape>
      <solid
          android:color="#efefef" />
      <stroke
          android:width="1dp"
          android:color="#efefef" />
      <corners
          android:radius="6dp" />
      <padding
          android:left="10dp"
          android:top="10dp"
          android:right="10dp"
          android:bottom="10dp" />
    </shape>
  </item>
  <item>
    <shape>
      <gradient
          android:startColor="#d7d7d7"
          android:endColor="#d7d7d7"
          android:angle="270" />
      <stroke
          android:width="1dp"
          android:color="#d7d7d7" />
      <corners
          android:radius="6dp" />
      <padding
          android:left="10dp"
          android:top="10dp"
          android:right="10dp"
          android:bottom="10dp" />
    </shape>
  </item>
</selector>

自定义渲染器:

using FrameworkForms.UserControl;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
using Color = Android.Graphics.Color;

[assembly: ExportRenderer(typeof(CustomButton), typeof(FrameworkForms.Droid.Renderer.CustomizedButtonRenderer))]
namespace FrameworkForms.Droid.Renderer
{
    public class CustomizedButtonRenderer : ButtonRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Button> e)
        {
            base.OnElementChanged(e);
            if (Control != null)
            {
                Control.SetBackgroundResource(Resource.Drawable.button_style);
                Control.SetAllCaps(false);
                if (!Control.Enabled)
                {
                    Control.SetTextColor(Color.ParseColor("#858585"));
                }
            }
        }
    }
}

我的按钮启用属性上有一个绑定。问题很明显,一旦属性发生变化,按钮就不会再次渲染,而是保持之前状态的textcolor。

我对 Xamarin.Forms 中的样式进行了一些研究。似乎动态样式应该为我做,但我想为我的所有按钮都使用它(如全局样式)。我可以以某种方式将它们结合起来吗?或者这甚至是一个更好的解决方案?值得一提的是,我不介意再次为 iOS 实现整个过程。反正会不一样所以 Android xml-Styles 也会这样做。

谢谢。

【问题讨论】:

    标签: c# android xamarin android-styles


    【解决方案1】:

    如果您想在IsEnabled 属性更改时更改某些内容,则需要覆盖OnElementPropertyChanged

        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);
            if(e.PropertyName == "IsEnabled")
            {
                if(Element.IsEnabled)
                {
                    Control.SetTextColor(Color.ParseColor("#858585"));
                    Control.SetBackgroundResource(Resource.Drawable.YourEnabledResource);
                }
                else
                {
                    Control.SetTextColor(Element.TextColor.ToAndroid());
                    Control.SetBackgroundResource(Resource.Drawable.YourDisabledResource);
                }
            }
        }
    

    然后您可以创建两个可绘制的 xml 文件来定义启用和禁用的不同资源。我将它们命名为 YourEnabledResourceYourDisabledResource

    【讨论】:

    • 这不是问题。绑定工作正常,按钮的背景已设置。
    • 这是你的问题。我以SetTextColor 为例。重点还是一样的。当IsEnabled 属性改变时,它会在这里触发,如果你需要改变你的后台资源,你也可以在这里做。我将编辑我的答案以更清楚...
    • 另外,答案直接回应了这个:“问题很明显,一旦属性发生变化,按钮不会再次渲染,保持之前状态的textcolor。”... . 这将在您更改IsEnabled 属性时更改文本颜色。这就是重点。
    • 为了额外清楚,您应该像现在一样覆盖OnElementChanged,但也要覆盖OnElementPropertyChanged。每当您更改 Xamarin.Forms 元素上任何可绑定属性的值时,都会触发此方法。
    • 抱歉,我并没有真正阅读您的回答。当然是这样谢谢你:-)
    猜你喜欢
    • 2014-12-04
    • 2016-12-05
    • 1970-01-01
    • 2020-07-17
    • 1970-01-01
    • 2013-03-02
    • 2017-02-15
    • 2022-11-28
    • 1970-01-01
    相关资源
    最近更新 更多