2016-10-18 5 views
1

私のXamarin.Forms Androidアプリケーション用のカスタムエントリがあります。現在、カスタムレンダラーを使用して、エントリに罫線の付いた楕円形を与えています。フォーカスのあるエントリの境界線の色を変更します

また、フォーカスしているエントリの境界線の色を変更し、焦点が合っていない場合は元の色に戻したいと考えています。

マイカスタムレンダラは以下の通りです:

public class EntryCellRenderer : EntryRenderer 
{ 
    protected override void OnElementChanged(ElementChangedEventArgs<Entry> e) 
    { 
     base.OnElementChanged(e); 
     var UIEntry = (e.NewElement != null) ? (EntryCell)e.NewElement : (EntryCell)e.OldElement; 

     if (this.Control != null) 
     { 
      Control.Gravity = Android.Views.GravityFlags.CenterVertical; 
      Control.SetPadding(30, 30, 30, 31); 
      GradientDrawable gd = new GradientDrawable(); 
      gd.SetShape(ShapeType.Rectangle); 

      var BackgroundColor = ColorHelper.FromHex(CoreTheme.COLOR_DEFAULT_CLEAR); 
      var ColorRef = Android.Graphics.Color.Argb(
       (byte)(BackgroundColor.A * 255), 
       (byte)(BackgroundColor.R * 255), 
       (byte)(BackgroundColor.G * 255), 
       (byte)(BackgroundColor.B * 255)); 


      gd.SetColor((int)ColorRef); 

      UIEntry.BackgroundColor = Xamarin.Forms.Color.Transparent; 
      gd.SetStroke(7, Android.Graphics.Color.LightGray); 
      gd.SetCornerRadius(20.0f); 
      Control.SetBackground(gd); 

     } 
    } 
} 

私はこのカスタムエントリと上記やりたいことのためにフォーカスイベントを持つ続行するかどうかはわかりません。

答えて

2

OnNativeFocusChangedをオーバーライドして、これを行うのに最適な場所でしょうが、それはパブリックではありません...

internal virtual void OnNativeFocusChanged(bool hasFocus) 
{ 
} 
+0

大丈夫ですが、これはうまくいきますが、エントリーから外れてしまうと、焦点が外れたり色が変わったりしません。これには理由がありますか? – Euridice01

+0

@ Euridice01わかりません。ビューフォーカスがフォーカスに変わったときに、 'Focused'イベントコールを取得していませんか?または...?つまり、この行は呼び出されていませんか? https://github.com/xamarin/Xamarin.Forms/blob/4f8af14f13f34d9b66d92e315c8486edd28e851a/Xamarin.Forms.Platform.Android/ViewRenderer.cs#L62 – SushiHangover

+0

ページが読み込まれています...エントリにフォーカスが当てられていません。それから私はそれをタップし、それは集中している。エントリーの中で入力を終えてエントリーの外をタップしたら...それは焦点が合っていません。このページはContentPageから継承されます(ViewRendererが呼び出されているかどうかはわかりません)。どうすればこれを最もうまくデバッグできますか? Btw、私はXamarin.Forms 1.5.6を使用しています...バグかどうかはわかりません。 – Euridice01

0

あなたのFocusイベントが呼び出されたときに実行されるようにActionを接続することができます。つまり、あなたのカスタムEntryCellに新しいActionプロパティを追加してもFocusを配線します:

public class CustomEntryCell : EntryCell { 

    public Action OnFocusEventAction { get; set; } 

    public CustomEntryCell() { Focused += OnFocused } 

    private void OnFocused(object sender, FocusEventArgs focusEventArgs) { OnFocusEventAction?.Invoke(); } 

    ///Or if you are not at C# 6 yet: 
    //private void OnFocused(object sender, FocusEventArgs focusEventArgs) { 
    // Action action = OnFocusEventAction; 
    // if(action != null) { action.Invoke(); } 
    //} 
} 

その後、カスタムレンダラがコントロールのActionに何かを割り当てます:

public class EntryCellRenderer : EntryRenderer { 
    protected override void OnElementChanged(ElementChangedEventArgs<Entry> e) { 
     .... 
     UIEntry.OnFocusEventAction =() => //Your custom border color change code here 
     .... 
    } 
} 

は、すべての外にこれを書きましたメモリとこのテキストボックスで何かが動作しない場合は私に知らせて、私はそれ以上の時間を費やすだろう!

e.NewElement.Unfocused += (sender, evt) => 
{ 
    // unfocused, set color 
}; 
e.NewElement.Focused += (sender, evt) => 
{ 
    // focus, set color 
}; 

FYI:あなたのOnElementChangedあなたがFocusedイベントにイベントを配線することができて

+0

エントリの外側をタップすると、エントリが非表示になることはありません。エントリはコンテンツページにあります。 – Euridice01

+0

私は別のunFocusイベントを作成しました。 Focusイベントに追加すると、unFocusが発生しないように見えます.Xamarin.Formsのバグでしょうか? – Euridice01

関連する問題