2017-03-28 13 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")); 
       } 
      } 
     } 
    } 
} 

有効になって私のボタンに結合プロパティがあります。問題はかなり明らかです。プロパティが変更されると、ボタンは再度レンダリングされず、以前の状態のテキストカラーが保持されます。

私はXamarin.Formsのスタイルについて少し研究しました。それはダイナミックなスタイリングが私のためにやってくれるはずだが、私はすべてのボタン(グローバルスタイルのようなもの)にしたいと思っている。私は何とかそれらを組み合わせることはできますか?それとももっと良い解決策ですか?言及したいと思いますが、私はiOSのすべてを再び実装することは気にしません。とにかく違うことになるでしょう。だから、Android xml-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); 
      } 
     } 
    } 

次にあなたが有効および無効にするために、あなたのさまざまなリソースを定義するために、2つの描画可能なXMLファイルを作成することができます。私はそれに応じてYourEnabledResourceYourDisabledResourceと題しました。

+0

これは問題ではありません。バインディングが正しく機能し、ボタンの背景が設定されます。 – greenhoorn

+0

これは問題です。私は例として 'SetTextColor'を使いました。ポイントはまだ同じです。 'IsEnabled'プロパティが変更されると、ここで起動されます。バックグラウンドリソースを変更する必要がある場合は、ここでも変更できます。私は私の答えをより明確にするために編集します... – SuavePirate

+0

また、答えは直接これに反応します: "問題はかなり明白です。プロパティが変更されると、ボタンは再度レンダリングされず、前のstate .... "....これは' IsEnabled'プロパティを変更するときにテキストの色を変更します。それは全体のポイントです。 – SuavePirate

関連する問題