2017-10-27 21 views
0

無効にすると、ボタンのテキストの色を変更する必要があります.iOS用のカスタムレンダラーとAndroid用のカスタムレンダラーを作成しました。アンドロイドは色を変えないので、iOSは完全に機能しました。私はスタイルを介してトリガーを作成して解決しません。無効なボタンのボタンのテキストの色を変更する(Xamarin.Forms)

Xamarin.Formsのカラースワップの仕方は?

アンドロイドレンダラ:

[assembly: ExportRenderer(typeof(Button), typeof(MyButtonRenderer))] 
namespace xxxxxx.Droid.Renderers 
{ 
    public class MyButtonRenderer : ButtonRenderer 
    { 
     protected override void OnElementChanged(ElementChangedEventArgs<Button> e) 
     { 
      base.OnElementChanged(e); 

      if (Control != null) 
       Control.SetTextColor(Color.White.ToAndroid()); 

      if (e != null) 
      { 
       e.NewElement.TextColor = Color.White; 
       e.OldElement.TextColor = Color.White; 
      } 
     } 
    } 
} 

この状態変化は、私の命令のCanExecuteに応じて変更されるが、これが適用されるデフォルトスタイルになります。予想通りCanExecute作品は、その後、あなたのIsEnabledプロパティは適宜更新する必要がある場合は

これらの方法はいずれも、

答えて

1

を解決します。 OnElementPropertyChangedメソッドを通じてこのプロパティの値の変更を聞くことができます。

public class MyButtonRenderer : ButtonRenderer 
{ 

    .... 

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

     if (e.PropertyName == nameof(Button.IsEnabled)) 
     { 
      Element.TextColor = Element.IsEnabled ? Color.White : Color.Gray; 
     } 
    } 

    ... 

} 
0

アンドロイドは色を変えていないので、私はスタイルを経由して、トリガーをも作成しているとも解決していません。

問題を引き起こす可能性がありますいくつかの可能性があります。あなたが定義するために必要なもの

  1. 、あなたがそこにAndroid.widget.Buttonであり、ドロイドプロジェクトでXamarin.Forms.Button、間違ったButtonタイプを使用して、レンダラーを定義しているほとんどの場合、レンダラはXamarin.Forms.Buttonです:

    [assembly:ExportRenderer(typeof(Xamarin.Forms.Button), 
             typeof(MyButtonRenderer))] 
    namespace xxxxxxxxx.Droid 
    { 
        ... 
    } 
    
  2. あなたはe.OldElement.TextColor = Color.White;を設定する必要はありません。そして、実際には、その時点でe.OldElementはおそらく、古い要素を表しているので、nullです。だからこの行を削除してください。コードは正常に動作します。 Androirについては

0

[assembly: ExportRenderer(typeof(Button), typeof(MyButtonRenderer))] 
namespace Forms.Droid.Renderers 
{ 
    public class MyButtonRenderer : ButtonRenderer 
    { 
     public MyButtonRenderer(Context context) : base(context) { } 

     protected override void OnElementChanged(ElementChangedEventArgs<Button> args) 
     { 
      base.OnElementChanged(args); 
      if (Control != null) SetColors(); 
     } 

     protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs args) 
     { 
      base.OnElementPropertyChanged(sender, args); 
      if (args.PropertyName == nameof(Button.IsEnabled)) SetColors(); 
     } 

     private void SetColors() 
     { 
      Control.SetTextColor(Element.IsEnabled ? Element.TextColor.ToAndroid() : Android.Graphics.Color.Gray); 
      Control.SetBackgroundColor(Element.IsEnabled ? Element.BackgroundColor.ToAndroid() : Android.Graphics.Color.DarkGray); 
     } 
    } 
} 

iOS用:

[assembly: ExportRenderer(typeof(Button), typeof(MyButtonRenderer))] 
namespace Forms.iOS.Renderers 
{ 
    public class MyButtonRenderer : ButtonRenderer 
    { 
     protected override void OnElementChanged(ElementChangedEventArgs<Button> args) 
     { 
      base.OnElementChanged(args); 
      if (Control != null) SetColors(); 
     } 

     protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs args) 
     { 
      base.OnElementPropertyChanged(sender, args); 
      if (args.PropertyName == nameof(Button.IsEnabled)) SetColors(); 
     } 

     private void SetColors() 
     { 
      Control.SetTitleColor(Element.IsEnabled ? Element.TextColor.ToUIColor() : UIColor.Gray, Element.IsEnabled ? UIControlState.Normal : UIControlState.Disabled); 
      Control.BackgroundColor = Element.IsEnabled ? Element.BackgroundColor.ToUIColor() : UIColor.DarkGray; 
     } 
    } 
} 
関連する問題