Bölüm 26'nın özeti. Özel düzenler
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
,AbsoluteLayout
veRelativeLayout
.
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 VisualElement
tanı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 Layout
tarafı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ı
UpdateChildrenLayout
Page
türevler veUpdateChildrenLayout
türevler içinLayout
,LayoutChildren
Page
türevleri veLayoutChildren
tü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:
LayoutChanged
Page
türevler veLayoutChanged
tü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 MeasureFlag
bir bağımsız değişken içerir:
IncludeMargins
None
kenar 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 GetSizeRequest
iki özelliği olan türünde SizeRequest
bir değer döndürür:
Çoğu zaman bu iki değer aynıdır ve Minimum
değer genellikle yoksayılabilir.
VisualElement
ayrıca öğesinden GetSizeRequest
çağrılana GetSizeRequest
benzer korumalı bir yöntem tanımlar:
OnSizeRequest
birSizeRequest
değ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:
WidthRequest
türündedouble
, öğesininRequest
özelliğini etkilerSizeRequest
HeightRequest
türündedouble
, öğesininRequest
özelliğini etkilerSizeRequest
MinimumWidthRequest
türündedouble
, öğesininMinimum
özelliğini etkilerSizeRequest
MinimumHeightRequest
tü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
).Measure
OnMeasure
OnSizeRequest
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
Measure
için geçersiz kılınOnMeasure
. Düzenin kendisi için istenen boyutu döndürme - Düzenin tüm alt öğelerini çağırmak
Layout
için geçersiz kılLayoutChildren
for
Bu geçersiz kılmalardaki veya foreach
döngüsü, özelliği olarak false
ayarlanmış 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 InvalidateMeasure
tanı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ı InvalidateLayout
benzer 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 veOnRemoved
bu 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ıInvalidateLayout
yaparak 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ıInvalidateLayout
veOnChildMeasureInvalidated
temizlemelidir.
Ö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 StackLayout
alı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 UniformGridLayout
gö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:
LowerChild
bir çocuğu koleksiyonun başına taşımak içinRaiseChild
bir ç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.