2017-03-28 119 views
2

我想實現我自己的自定義按鈕樣式。風格必須改變,只要按鈕改變他的狀態(從啓用到禁用)。Xamarin.Forms動態按鈕樣式

我目前的解決方案是在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")); 
       } 
      } 
     } 
    } 
} 

有一個在我的按鈕結合enabled屬性。問題非常明顯,一旦屬性發生變化,按鈕不會再次渲染並保留先前狀態的文本顏色。

我對Xamarin.Forms中的樣式做了一點研究。它似乎像動態樣式應該爲我做,但我想爲我的所有按鈕(如全球風格)。我可以以某種方式結合他們嗎?或者這是更好的解決方案?值得一提的是,我不介意再次實施iOS的整個事情。反正它會有所不同。所以Android xml樣式也會這樣做。

謝謝。

回答

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

+0

這不是問題所在。綁定工作正常,按鈕的背景被設置。 – greenhoorn

+0

這是你的問題。我以'SetTextColor'爲例。這一點仍然是一樣的。當'IsEnabled'屬性被改變時,它在這裏觸發,如果你需要改變你的背景資源,你也可以在這裏執行。我會編輯我的答案,以便更清楚地... – SuavePirate

+0

此外,答案直接回應了這個問題:「問題很明顯,一旦屬性更改,按鈕不會再次渲染並保留之前的文本顏色狀態「。....這會在更改」IsEnabled「屬性時更改文本顏色。這就是整個問題。 – SuavePirate