Aracılığıyla paylaş


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 ve
  • RelativeLayout.

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:

  • Bounds türü Rectangle
  • X türü double
  • Y türü double
  • Width türü double
  • Height türü double

Ç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:

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ı

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:

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:

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:

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ünde double, öğesinin Request özelliğini etkiler SizeRequest
  • HeightRequest türünde double, öğesinin Request özelliğini etkiler SizeRequest
  • MinimumWidthRequest türünde double, öğesinin Minimum özelliğini etkiler SizeRequest
  • MinimumHeightRequest türünde double, öğesinin Minimum özelliğini etkiler SizeRequest

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 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ıl LayoutChildren

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

  1. 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ır InvalidateLayout.

  2. Layout<T> Ekli bağlanabilir özellikleri tanımlayan bir türev, alt öğelerine özellik tarafından değiştirilen bir işleyici eklemek ve OnRemoved 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ı InvalidateLayoutyaparak yanıt vermelidir.

  3. Alt Layout<T> boyutlarda bir önbellek uygulayan bir türev, bu yöntemler çağrıldığında önbelleği geçersiz kılmalı InvalidateLayout ve OnChildMeasureInvalidated 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 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:

Photo Grid'in üçlü ekran görüntüsü

Ç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çin
  • RaiseChild 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:

Öğrenci Kartı Dosya Kılavuzu'nun üçlü ekran görüntüsü

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.