Xamarin.Forms 动态按钮样式
Xamarin.Forms dynamic button styling
我想实现自己的自定义按钮样式。每当按钮更改其状态(即从启用到禁用,即)时,样式必须更改。
我目前的解决方案是在 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"));
}
}
}
}
}
我的按钮上启用了绑定 属性。问题很明显,一旦 属性 更改,按钮就不会再次渲染并保持先前状态的文本颜色。
我对 Xamarin.Forms 中的样式做了一些研究。看起来动态样式应该为我做,但我想为我的所有按钮使用它(如全局样式)。我能以某种方式将它们结合起来吗?或者这是更好的解决方案?值得一提的是,我不介意再次为 iOS 实施整个过程。反正都会不一样所以 Android xml-Styles 也会这样做。
谢谢。
如果您想在 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 文件来定义启用和禁用的不同资源。我相应地将它们命名为 YourEnabledResource
和 YourDisabledResource
。
我想实现自己的自定义按钮样式。每当按钮更改其状态(即从启用到禁用,即)时,样式必须更改。
我目前的解决方案是在 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"));
}
}
}
}
}
我的按钮上启用了绑定 属性。问题很明显,一旦 属性 更改,按钮就不会再次渲染并保持先前状态的文本颜色。
我对 Xamarin.Forms 中的样式做了一些研究。看起来动态样式应该为我做,但我想为我的所有按钮使用它(如全局样式)。我能以某种方式将它们结合起来吗?或者这是更好的解决方案?值得一提的是,我不介意再次为 iOS 实施整个过程。反正都会不一样所以 Android xml-Styles 也会这样做。
谢谢。
如果您想在 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 文件来定义启用和禁用的不同资源。我相应地将它们命名为 YourEnabledResource
和 YourDisabledResource
。