2016-10-27 26 views
0

Xamarin.Formsのカスタムコントロールに.axmlレイアウトファイルを使用する方法を理解しようとしています。誰でもカスタムレンダラで.axmlファイルを使用する例を提供できますか?たとえば、カスタムEntryコントロール(EnhancedEntry)を作成したいとします。構成可能な境界線の幅だけでなく、構成可能な背景色と境界線の色が必要です。私は、バックグラウンド形状を作成した.axmlレイアウトからAndroidコントロール用のXamarin.Formsカスタムレンダラー

、私はこのように.axmlファイルに定義されたレイアウトを持って

drawable/enchancedEntryBackground.xml: 

<?xml version="1.0" encoding="UTF-8"?> 
    <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> 
     <corners android:bottomLeftRadius="3dp" android:bottomRightRadius="3dp" android:topLeftRadius="3dp" android:topRightRadius="3dp" /> 
     <stroke android:width="0.5dp" android:color="@android:color/holo_blue_dark" /> 
     <solid android:color="@android:color/white" /> 
    </shape> 

layout/EnhancedEntry.axml 

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:minWidth="25px" 
    android:minHeight="25px"> 
    <EditText 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/enhancedEntry" 
     android:background="@drawable/enhancedentrybackground" /> 
</LinearLayout> 

サポートするプロパティを持つカスタムレンダラ骨格とクラスを考えますxmlとaxmlの仕様を使用して新しい外観を作成することは可能ですか?

[assembly: ExportRenderer(typeof(EnhancedEntry), typeof(EnhancedEntryRenderer))] 
namespace eSiteMobile.Droid.CustomRenderers 
{ 

    public class EnhancedEntryRenderer : EntryRenderer 
    { 
     protected override void OnElementChanged(ElementChangedEventArgs<Entry> e) 
     { 
      base.OnElementChanged(e);    
     } 

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

public class EnhancedEntry : Entry 
    { 
     public static BindableProperty BorderColorProperty = BindableProperty.Create(nameof(BorderColor), typeof(Color), 
      typeof(EnhancedEntry), default(Color), defaultBindingMode: BindingMode.OneWay); 

     public static BindableProperty BorderWidthProperty = BindableProperty.Create(nameof(BorderWidth), typeof(int), 
      typeof(EnhancedEntry), default(int), defaultBindingMode: BindingMode.OneWay); 

     public Color BorderColor 
     { 
      get { return (Color) GetValue(BorderColorProperty); } 
      set { SetValue(BorderColorProperty, value); } 
     } 

     public int BorderWidth 
     { 
      get { return (int) GetValue(BorderWidthProperty); } 
      set { SetValue(BorderWidthProperty, value); } 
     } 
    } 

答えて

1

あなたはControlとしてレンダリングさEntryを参照OnElementChanged()であなたが話しているプロパティを設定することができます。これはaxmlやxmlではなく、まだ可能です。

VSのソリューションエクスプローラでは、「すべてのファイルを表示」をクリックすると、カスタムレイアウトファイルを追加するためのAndroid.Resource.Layoutフォルダが表示されます。私はこれが私のためにはうまくいかなかったので、明らかに言うが、あなたがまだxmlでそれを望んでいるなら試してみる価値がある。

これが完了したら、OnElementChanged()メソッドのビューをカスタマイズしたレイアウトファイルを参照できるはずですが、すべてを1か所で簡単に行うことができます。

関連する問題