2016-12-02 9 views
5

Xamarin.Forms öğesindeki bir denetimin Height ve Width özelliklerini kullanmaya çalışırken, her ikisi de -1 değerini döndürür ve Bağıl Mizanpajın ekranda ortalanmış görünmesine neden olur.Xamarin.Forms: Relative Layout'u kullanarak görünümleri nasıl ortalarsınız? Genişlik ve Yükseklik, -1

var mainLayout = new RelativeLayout(); 

//Add the Switch to the center of the screen 
mainLayout.Children.Add(mySwitch, 
    Constraint.RelativeToParent(parent => parent.Width/2 - mySwitch.Width/2), 
    Constraint.RelativeToParent(parent => parent.Height/2 - mySwitch.Height/2)); 

//Add a Label below the switch 
mainLayout.Children.Add(switchLabel, 
    Constraint.RelativeToParent(parent => parent.Width/2 - switchLabel.Width/2), 
    Constraint.RelativeToView(mySwitch, (parent, view) => view.Y + mySwitch.Height + 10)); 

Content = mainLayout; 

enter image description here

cevap

14

Neden Xamarin.Forms çıkmıyor -1 Height ve Width için?

Xamarin.Forms, bu özellikler için varsayılan değer olarak -1 değerini döndürür ve Xamarin'e kadar -1 kalır. Formlar, yerel denetimi, ör. UIButton ve yerleşime bu yerel denetimi ekler. Görüntüleme

kullanın Func dinamik almak sınırla Göreli Düzenleri Kullanılır https://github.com/xamarin/Xamarin.Forms/blob/master/Xamarin.Forms.Core/VisualElement.cs

Best Way: Bu linkte

, varsayılan değer olarak -1 dönen Xamarin.Forms kaynak kodunu görebilirsiniz Width ve Height özellikleri

var mainLayout = new RelativeLayout(); 

Func<RelativeLayout, double> getSwitchWidth = (parent) => mySwitch.Measure(parent.Width, parent.Height).Request.Width; 
Func<RelativeLayout, double> getSwitchHeight = (parent) => mySwitch.Measure(parent.Width, parent.Height).Request.Height; 
Func<RelativeLayout, double> getLabelWidth = (parent) => switchLabel.Measure(parent.Width, parent.Height).Request.Width; 
Func<RelativeLayout, double> getLabelHeight = (parent) => switchLabel.Measure(parent.Width, parent.Height).Request.Height; 

//Add the Switch to the center of the screen 
mainLayout.Children.Add(mySwitch, 
    Constraint.RelativeToParent(parent => parent.Width/2 - getSwitchWidth(parent)/ 2), 
    Constraint.RelativeToParent(parent => parent.Height/2 - getSwitchHeight(parent)/2)); 

//Add a Label below the switch 
mainLayout.Children.Add(switchLabel, 
    Constraint.RelativeToParent(parent => parent.Width/2 - getLabelWidth(parent)/2), 
    Constraint.RelativeToView(mySwitch, (parent, view) => view.Y + getSwitchHeight(parent) + 10)); 

Content = mainLayout; 

enter image description here

Bana bu hile öğretmek için @BrewMate teşekkürler!

+1

Bu, dinamik metin içeren etiketleri ortalamak için de harika! Metin, boyut olarak arttıkça/azaldıkça, Bağıl Düzen otomatik olarak genişliğini yeniden hesaplar ve Etiket'i merkezde tutar. –

+0

Xamarin Forms'taki CaptainXamtastic'in yanıtı da bunu açıklayan harika bir iş: https://forums.xamarin.com/discussion/22902/how-to-add-a-label-to-a-relative-layout-and -center-it-horizontally –

+11

XAML'de bunu yapmanın bir yolu var mı? –

İlgili konular