2014-07-08 5 views
6

birkaç iyi zaten bir "özel denetimi" nasıl oluşturulacağını örnekleri vardır - Görünüm bir sınıf türetmekXamarin.Forms XAML ve Özel Renderer kullanarak UserControl'ın

  • http://blog.xamarin.com/using-custom-controls-in-xamarin.forms-on-android/
  • (Platform başına stili düzeltmek için).

    Bunu yapmanın bir örneği var mı lütfen? İkili bir etikete ve bir giriş kutusuna sahip bir görünüm ile basit bir örnek, ana ilkeleri göstermek için yeterli olmalıdır.

    bizim usercontrols düzen ve içeriğini temsil eden bir contentView Tanımlı - İşte

    Ben bugüne kadar ne olduğunu. codebehind ile

    <ContentView xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="News.Forms.VisualNewsContentView"> 
        <ContentView.Content> 
         <StackLayout> 
          <Label x:Name="MyLabel" Text="Label"></Label> 
          <Entry x:Name="MyEntry" Text="Entry"></Entry> 
         </StackLayout> 
        </ContentView.Content> 
    </ContentView> 
    

    -

    public partial class VisualNewsContentView : ContentView 
    { 
        public VisualNewsContentView() 
        { 
         InitializeComponent(); 
        } 
    
        // Not sure if I need this to access Entry ... 
        public Entry GetEntry() 
        { 
         return MyEntry; 
        } 
    } 
    

    o contentView için bir Android Custom Renderer ekle, nasıl contentView parçaları/erişimi kontrol eder ve doğal olarak özelleştirebilirim?

    [assembly:ExportRenderer (typeof(VisualNewsContentView), typeof(VisualNewsRenderer))] 
    
    namespace News.Forms.Android 
    { 
        public class VisualNewsRenderer: ViewRenderer 
        { 
         public VisualNewsRenderer() { } 
    
         protected override void OnModelChanged (VisualElement oldModel, VisualElement newModel) 
         { 
          base.OnModelChanged (oldModel, newModel); 
    
          if (newModel != null) { 
           VisualNewsContentView newsContentView = newModel as VisualNewsContentView; 
    
           // i.e. How could I get hold of EditText etc so I could natively customise its appearance? When you use a built in renderer like EntryRenderer you can use Control to access native control. 
           Console.WriteLine (newsContentView.GetLabel().Text); 
           EditText ed = (EditText)newsContentView.GetEntry().??? 
          } 
         } 
        } 
    } 
    

    Hemen oldukça işe parçaları bir araya alamayan, contentView Sayfada küçük hale görünüyor ama viewrenderer yılında Çocuk Yerli denetimlere erişmek için nasıl çalışamaz.

    Etiket ve Giriş Metni değerleri için Bağlamayı nasıl kullanabileceğinizi göstermekten memnuniyet duyarız.

    Kullanıcı denetiminin her bir etiket/giriş vb. Için özel oluşturucu tanımlamak istemiyorum.

  • cevap

    2

    Bu ne demek istiyorsun? Xamarin.Forms denetimlere erişmek için

    bazı özellikleri:

    public partial class VisualNewsContentView : ContentView 
        { 
         public VisualNewsContentView() 
         { 
          InitializeComponent(); 
         } 
    
         public Label Label 
         { 
          get 
          { 
           return MyLabel; 
          } 
          set 
          { 
           MyLabel = value; 
          } 
         } 
    
         public Entry Entry 
         { 
          get 
          { 
           return MyEntry; 
          } 
          set 
          { 
           MyEntry = value; 
          } 
         } 
        } 
    

    sayfadaki denetimleri özelleştirmek için Oluşturucu'daki içindeki bazı sihirli:

    [assembly:ExportRenderer (typeof(VisualNewsContentView), typeof(VisualNewsRenderer))] 
    
    namespace News.Forms.Android 
    { 
        public class VisualNewsRenderer: ViewRenderer 
        { 
         public VisualNewsRenderer() { } 
    
         protected override void OnModelChanged (VisualElement oldModel, VisualElement newModel) 
         { 
          base.OnModelChanged (oldModel, newModel); 
    
          if (newModel != null) { 
           VisualNewsContentView newsContentView = newModel as VisualNewsContentView; 
           newsContentView.Label.Text = "It´s some kind of.."; 
           newsContentView.Entry.Text = "MAGIC!"; 
           newsContentView.Entry.BackgroundColor = Color.Blue; 
           newsContentView.Entry.RotationX = 180; 
           newsContentView.Entry.Focus(); 
    
          } 
         } 
        } 
    } 
    

    DÜZENLEME:

    I don' denetimlerinizi XAML sayfasından yerel denetimlere eşleştirmenin mümkün olup olmadığını öğrenin. Native @ renderer'ı özelleştirmek istediğiniz kontrolleri ekleyebilirsiniz.

    [assembly:ExportRenderer (typeof(VisualNewsContentView), typeof(VisualNewsRenderer))] 
    
    namespace News.Forms.Android 
    { 
        public class VisualNewsRenderer: NativeRenderer 
        { 
         public VisualNewsRenderer() { } 
    
         protected override void OnModelChanged (VisualElement oldModel, VisualElement newModel) 
         { 
          base.OnModelChanged (oldModel, newModel); 
    
          if (newModel != null) { 
           LinearLayout layout = new LinearLayout (Application.Context); 
           layout.Orientation = Orientation.Vertical; 
    
           TextView tv = new TextView (Application.Context); 
           tv.Ellipsize = TextUtils.TruncateAt.Middle; 
           tv.Text = "It´s some kind of.."; 
    
           EditText et = new EditText (Application.Context); 
           et.SetTextColor (Graphics.Color.Chocolate); 
           et.Text = "MAGIC!"; 
    
           layout.AddView (tv); 
           layout.AddView (et); 
    
           SetNativeControl (layout); 
          } 
         } 
        } 
    } 
    

    Ama böyle size contentView kullanarak olmayacak .. ben bundan daha iyi bir şey üzgün olması ediyorum ..

    +0

    Merhaba @Bart, yanıtınız için teşekkür ederim, açık olmasaydım üzgünüm, ancak temel Android Denetimi/Görünümü'ne (yani EditText) erişmem gerekiyor, bu yüzden doğrudan yapamayacağım yerel özelleştirme yapabilirim Form özellikleriyle. – WickedW

    +0

    @WickedW Cevabımı düzenledim, ancak Formlar öğelerini yerel olanlarla eşleştirmenin mümkün olup olmadığını bilmiyorum. – Bart

    +0

    Teşekkürler @Bart, tek bir kontrol/görüntüleme seviyesinde ya da tüm sayfayı/uicontroller'ı ele geçirir ve önerdiğiniz gibi bir VEYA "hibrid" yaklaşımı sağlayarak özelleştirebilirsiniz. Xamarin Forms ekibi ekibinden birinin, kişiselleştirilmesi için bir usercontrol üzerinde kontrolleri ele geçirmemize izin verebileceklerini/planlayabilecekleri konusunda yorum yapması ister miydi? – WickedW

    1

    bileşik kullanıcı kontrolü özelleştirme için Çözümümün için özel bir denetim yapmak olduğunu Bileşik kullanıcı kontrolünde kullanılan her kontrol.CustomControls için

    <ContentView xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
    xmlns:CustomControls="clr-namespace:App.CustomControls;assembly=App" x:Class="News.Forms.VisualNewsContentView"> 
         <ContentView.Content> 
          <CustomControls:StackLayout> 
           <CustomControls:Label x:Name="MyLabel" Text="Label"></CustomControls:Label> 
           <CustomControls:Entry x:Name="MyEntry" Text="Entry"></CustomControls:Entry> 
          </CustomControls:StackLayout> 
         </ContentView.Content> 
        </ContentView> 
    

    Örnek sınıfı:

    <ContentView xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="News.Forms.VisualNewsContentView"> 
        <ContentView.Content> 
         <StackLayout> 
          <Label x:Name="MyLabel" Text="Label"></Label> 
          <Entry x:Name="MyEntry" Text="Entry"></Entry> 
         </StackLayout> 
        </ContentView.Content> 
    </ContentView> 
    

    böyle bir şey yapar: bu kontrol Örneğin , StackLayout geçerli:

    (StackLayout.cs olarak)

    using Xamarin.Forms; 
    
    namespace App.CustomControls 
    { 
        public class StackLayout : Xamarin.Forms.StackLayout 
        { 
        } 
    } 
    

    (Android projesi için StackLayoutRenderer.cs içinde)

    [assembly: ExportRenderer(typeof(App.CustomControls.StackLayout), typeof(App.Droid.CustomRenderers.StackLayoutRenderer))] 
    namespace App.Droid.CustomRenderers.MapView 
    { 
        public class StackLayoutRenderer : ViewRenderer<StackLayout, Android.Widget.LinearLayout> 
        { 
         protected override void OnElementChanged(ElementChangedEventArgs<StackLayout> e) 
         { 
          base.OnElementChanged(e);        
         }   
        } 
    }