Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Not
Bu kitap 2016 baharında yayımlanmıştır ve o zamandan beri güncellenmemiştir. Kitapta değerli kalan çok şey vardır, ancak bazı malzemeler eskidir ve bazı konular artık tamamen doğru veya eksiksiz değildir.
Xamarin.Forms ' den Layout<View>türetilen birkaç sınıf içerir:
StackLayout,Grid,AbsoluteLayoutveRelativeLayout.
Bu bölümde, 'den Layout<View>türetilen kendi sınıflarınızı nasıl oluşturacağınız açıklanmaktadır.
Düzene genel bakış
Düzeni işleyen Xamarin.Forms merkezi bir sistem yoktur. Her öğe, kendi boyutunun ne olması gerektiğini ve belirli bir alanda nasıl işleneceklerini belirlemekle sorumludur.
Ebeveynler ve çocuklar
Çocuk sahibi olan her öğe, bu çocukları kendi içinde konumlandırmaktan sorumludur. Çocuklarının hangi boyutta olması gerektiğini, mevcut boyutuna ve çocuğun olmak istediği boyuta göre belirleyen ebeveyndir.
Boyutlandırma ve konumlandırma
Düzen, görsel ağacın en üstünde sayfayla başlar ve ardından tüm dallarda ilerler. Düzendeki Layout en önemli genel yöntem tarafından VisualElementtanımlanır. Diğer öğelerin üst öğesi olan her öğe, alt öğelerinin her birine bir değer biçiminde Rectangle kendisine göre bir boyut ve konum vermek için çağırırLayout. Bu Layout çağrılar görsel ağaç üzerinden yayılır.
Bir öğenin ekranda görünmesi için çağrısı Layout gereklidir ve aşağıdaki salt okunur özelliklerin ayarlanmasına neden olur. Yöntemine Rectangle geçirilen ile tutarlıdır:
Çağrısından Layout Height önce ve Width –1 sahte değerlerine sahip olun.
Çağrısı Layout , aşağıdaki korumalı yöntemlere yapılan çağrıları da tetikler:
SizeAllocated, hangi çağrılarıOnSizeAllocated, geçersiz kılınabilir.
Son olarak, aşağıdaki olay tetiklenir:
yöntemi OnSizeAllocated ve Layouttarafından Page geçersiz kılınmış ve alt öğeye sahip olabilecek tek iki sınıftırXamarin.Forms. Geçersiz kılınan yöntem çağrıları
UpdateChildrenLayoutPagetürevler veUpdateChildrenLayouttürevler içinLayout,LayoutChildrenPagetürevleri veLayoutChildrentürevleri içinLayout.
LayoutChildren ardından öğenin alt öğelerinin her birini çağırır Layout . En az bir alt öğe yeni Bounds bir ayara sahipse aşağıdaki olay tetiklenir:
LayoutChangedPagetürevler veLayoutChangedtürevler içinLayout
Kısıtlamalar ve boyut istekleri
LayoutChildren Tüm çocuklarına akıllı bir şekilde çağrı Layout yapmak için, çocuklar için tercih edilen veya istenen boyutu bilmesi gerekir. Bu nedenle, her bir alt öğe için yapılan çağrılar Layout genellikle
Kitap yayımlandıktan GetSizeRequest sonra yöntemi kullanım dışı bırakıldı ve yerine
Measure yöntemi özelliğine Margin uyum sağlar ve iki üyesi olan türünde MeasureFlagbir bağımsız değişken içerir:
IncludeMarginsNonekenar boşluklarını eklememek için
Birçok öğe GetSizeRequest için veya Measure işleyicisinden öğenin yerel boyutunu alır. Her iki yöntemin de genişlik ve yükseklik kısıtlamaları için parametreleri vardır. Örneğin, a Label , birden çok metin satırı kaydırmayı belirlemek için genişlik kısıtlamasını kullanır.
Measure hem hem de GetSizeRequestiki özelliği olan türünde SizeRequestbir değer döndürür:
Çoğu zaman bu iki değer aynıdır ve Minimum değer genellikle yoksayılabilir.
VisualElementayrıca öğesinden GetSizeRequestçağrılana GetSizeRequest benzer korumalı bir yöntem tanımlar:
OnSizeRequestbirSizeRequestdeğer verir
Bu yöntem artık kullanım dışıdır ve şununla değiştirilir:
veya öğesinden Layout türetilen her sınıf veya Layout<T> OnMeasureöğesini geçersiz kılmalıdırOnSizeRequest. Burada düzen sınıfı kendi boyutunu belirler. Bu, genellikle alt öğelerinin boyutuna göre belirlenir ve bu boyut genellikle çağrılarak GetSizeRequest veya Measure alt öğelere göre elde edilir. veya GetSizeRequest OnMeasureçağrısından OnSizeRequest önce ve sonra ya da Measure aşağıdaki özelliklere göre ayarlamalar yapar:
WidthRequesttüründedouble, öğesininRequestözelliğini etkilerSizeRequestHeightRequesttüründedouble, öğesininRequestözelliğini etkilerSizeRequestMinimumWidthRequesttüründedouble, öğesininMinimumözelliğini etkilerSizeRequestMinimumHeightRequesttüründedouble, öğesininMinimumözelliğini etkilerSizeRequest
Sonsuz kısıtlamalar
(veya ) ve (veya ) öğesine GetSizeRequest geçirilen kısıtlama bağımsız değişkenleri sonsuz olabilir (yani değerleriDouble.PositiveInfinity).MeasureOnMeasureOnSizeRequest Ancak, SizeRequest bu yöntemlerden döndürülen sonsuz boyutlar içeremez.
Sonsuz kısıtlamalar, istenen boyutun öğenin doğal boyutunu yansıtması gerektiğini gösterir. Alt öğelerinde sonsuz yükseklik kısıtlaması olan dikey StackLayout çağrılar GetSizeRequest (veya Measure). Yatay yığın düzeni, sonsuz genişlik kısıtlaması olan alt öğelerinde (veya Measure) öğesini çağırır GetSizeRequest . Sonsuz AbsoluteLayout genişlik ve yükseklik kısıtlamaları olan alt öğelerinde bir çağrı GetSizeRequest (veya Measure).
İşlemin içine göz atma
ExploreChildSize, basit bir düzen için kısıtlama ve boyut isteği bilgilerini görüntüler.
Düzen<Görünümünden Türetme>
Özel düzen sınıfı öğesinden Layout<View>türetilir. İki sorumluluğu vardır:
- Düzenin tüm alt öğelerini çağırmak
Measureiçin geçersiz kılınOnMeasure. Düzenin kendisi için istenen boyutu döndürme - Düzenin tüm alt öğelerini çağırmak
Layoutiçin geçersiz kılLayoutChildren
for Bu geçersiz kılmalardaki veya foreach döngüsü, özelliği olarak falseayarlanmış olan IsVisible tüm alt öğeleri atlamalıdır.
çağrısı OnMeasure garanti edilmez. OnMeasure düzenin üst öğesi düzenin boyutunu (örneğin, sayfayı dolduran bir düzen) yönetiyorsa çağrılmaz. Bu nedenle, LayoutChildren çağrı sırasında OnMeasure elde edilen alt boyutlara güvenemez. Çoğu zaman, LayoutChildren düzenin alt öğelerini çağırması Measure gerekir veya bir tür boyut önbelleğe alma mantığı uygulayabilirsiniz (daha sonra ele alınmalıdır).
Kolay bir örnek
VerticalStackDemo örneği basitleştirilmiş VerticalStack bir sınıf ve kullanımına ilişkin bir gösterim içerir.
Dikey ve yatay konumlandırma basitleştirilmiş
Gerçekleştirmesi gereken işlerden VerticalStack biri geçersiz kılma sırasında LayoutChildren gerçekleşir. yöntemi, alt öğesinin HorizontalOptions içindeki yuvasına nasıl yerleştirileceğini belirlemek için alt öğesinin VerticalStacközelliğini kullanır. Bunun yerine statik yöntemini Layout.LayoutChildIntoBoundingRectçağırabilirsiniz. Bu yöntem alt öğeyi çağırır Measure ve alt öğeyi belirtilen dikdörtgen içinde konumlandırmak için ve VerticalOptions özelliklerini kullanırHorizontalOptions.
Örneğin
Genellikle öğenin özelliğindeki bir değişiklik, öğenin düzende nasıl görüneceğini etkiler. Yeni bir düzeni tetikleyebilmek için düzenin geçersiz kılınması gerekir.
VisualElement , genellikle, değişikliği öğenin boyutunu etkileyen herhangi bir bağlanabilir özelliğin özellik değiştiren işleyicisi tarafından çağrılan korumalı bir yöntemi InvalidateMeasuretanımlar. InvalidateMeasure yöntemi bir MeasureInvalidated olayı tetikler.
Layout sınıfı, bir türevin alt öğelerini nasıl konumlandırdığını ve boyutlandırdığını etkileyen herhangi bir Layout değişiklik için çağırması gereken adlı InvalidateLayoutbenzer bir korumalı yöntem tanımlar.
Düzenleri kodlamak için bazı kurallar
Türevler tarafından
Layout<T>tanımlanan özellikler bağlanabilir özellikler tarafından yedeklenmeli ve özellik tarafından değiştirilen işleyiciler çağırmalıdırInvalidateLayout.Layout<T>Ekli bağlanabilir özellikleri tanımlayan bir türev, alt öğelerine özellik tarafından değiştirilen bir işleyici eklemek veOnRemovedbu işleyiciyi kaldırmak için geçersiz kılmalıdırOnAdded. İşleyici, bu ekli bağlanabilir özelliklerdeki değişiklikleri denetlemeli ve çağrısıInvalidateLayoutyaparak yanıt vermelidir.Alt
Layout<T>boyutlarda bir önbellek uygulayan bir türev, bu yöntemler çağrıldığında önbelleği geçersiz kılmalıInvalidateLayoutveOnChildMeasureInvalidatedtemizlemelidir.
Özelliklere sahip bir düzen
WrapLayout Book.Toolkit içindeki Xamarin.Formssınıf, tüm alt öğelerinin aynı boyutta olduğunu varsayar ve alt öğeleri bir satırdan (veya sütundan) sonrakine sarmalar. gibi bir Orientation özelliği ve ColumnSpacing RowSpacing gibi Gridözellikleri tanımlar ve alt boyutları önbelleğe StackLayoutalır.
PhotoWrap örneği, stok fotoğraflarını görüntülemek için bir WrapLayout ScrollView ekler.
Kısıtlanmamış boyutlara izin verilmez!
Book.Toolkit kitaplığındakiXamarin.Forms, tüm alt öğelerini kendi içinde görüntülemeye yöneliktir. UniformGridLayout Bu nedenle, kısıtlanmamış boyutlarla başa çıkamaz ve karşılaşılırsa bir özel durum oluşturur.
PhotoGrid örneği aşağıdakileri UniformGridLayoutgösterir:
Çakışan alt öğeler
Bir Layout<T> türev, alt öğeleriyle çakışabilir. Ancak, alt öğeler, yöntemlerinin çağrılma sırasına göre değil, koleksiyondaki sıralarına Layout göre işlenirChildren.
sınıfı, Layout bir alt öğeyi koleksiyon içinde taşımanıza olanak sağlayan iki yöntem tanımlar:
LowerChildbir çocuğu koleksiyonun başına taşımak içinRaiseChildbir çocuğu koleksiyonun sonuna taşımak için
Çakışan alt öğeler için, koleksiyonun sonundaki alt öğeler, koleksiyonun başındaki alt öğeler üzerinde görsel olarak görünür.
Book.Toolkit kitaplığındakiXamarin.Forms sınıf, işleme sırasını belirtmek için ekli bir özellik tanımlar ve bu nedenle alt öğelerinden birinin diğerlerinin üzerinde görüntülenmesine izin verir. OverlapLayout StudentCardFile örneği şunu gösterir:
Daha fazla ekli bağlanabilir özellik
Book.Toolkit kitaplığındaki Xamarin.Formssınıfı, iki Point değer ve bir kalınlık değeri belirtmek için ekli bağlanabilir özellikleri tanımlar ve öğeleri çizgilere benzeyecek şekilde işler.BoxView CartesianLayout
UnitCube örneği bunu kullanarak bir 3B küp çizer.
Düzen ve DüzenTo
TürevLayout<T>, düzene animasyon eklemek yerine Layout çağrı LayoutTo yapabilir. sınıfı AnimatedCartesianLayout bunu yapar ve AnimatedUnitCube örneği bunu gösterir.

