2010-04-06 21 views
5

Bir çocuk içeren basit bir panel oluşturmaya çalışıyorum ve bunu en yakın kılavuz boyutlarına getireceğim. MeasureOverride ve ArrangeOverride'ı geçersiz kılarak bunu nasıl yapacağımı anlamaya zorlanıyorum.WPF MeasureOverride ve ArrangeOverride sonsuzluk ve 0 boyutlarını anlama konusunda yardıma mı ihtiyacınız var

İşte peşindeyim: Panelimin sahibine, (a) mümkün olduğu kadar büyük olmasını istediğini, sonra (b) bu ​​büyüklüğün ne olduğunu öğrendiğinde, kendisinin ve Çocuğun UIElementi en yakın küçük yaka noktasına göre. Yani eğer 10'lara yapışıyorsak ve 192x184'ten büyük olmayan bir bölgede olabilirsek, panel kendi ana kapsayıcısını "benim gerçek boyutum 190x180" olacak. Bu şekilde kontrolümü sınırlayan herhangi bir şey, potansiyel alanın aksine kenarlarına hizalanabilecektir.

Panelimi bir Kılavuzun içine koyduğumda, geçersiz kılmalarda gelen boyut için 0 veya PositiveInfinity (Unutuyorum) alıyorum, ama bilmem gerek "alanım gerçekten ne kadar büyük olabilir?" sonsuzluklar ..

WPF, PozitifInfinity'nin sihirli değerlerini ve büyüklüklerini 0 olarak gördüğü sorunun bir parçası olduğunu düşünüyorum. MeasureOverride ile "Bana izin vereceğiniz kadar büyük olabilirim" ve ArrangeOverride'de gerçekte büyüklükte bir boyuta sahip olmanın bir yoluna ihtiyacım var. Ya da bunun tamamen yanlış bir şekilde mi gidiyorum? Reflektörde standart panellerin kodlarında biraz dolaşmaktan ölçüm yapmak ve düzenlemek çok karmaşık görünüyor.

cevap

5

Ölçü adımında, WPF size sonsuzluk gönderirse, ne kadar büyük olmasını istediğinizi söylemeniz gerekir. 0 gönderirse, düzeniniz için tam anlamıyla alan yoktur. Düzenleme adımında, yerleşim adımı için ne kadar alanın kullanılabileceğini size söyleyeceksiniz. Bu, ölçüm adımında verdiğiniz boyuttan farklı olma olasılığı yüksektir. Sonsuza iki adımda geri dönemezsiniz. Aşağıdaki kod, neyin peşinde olduğunuzu gerçekleştirmelidir (bir UIElement Child özelliği üstlendiğimi unutmayın):

protected overrride Size MeasureOverride(Size availableSize) 
{ 
    Child.Measure(availableSize); 
    return Child.DesiredSize; 
} 

protected override Size ArrangeOverride(Size finalSize) 
{ 
    int w = (((int)finalSize.Width)/SnapPrecision) * SnapPrecision; 
    int h = (((int)finalSize.Height)/SnapPrecision) * SnapPrecision; 

    Child.Arrange(new Rect(0, 0, w, h)); 
    return new Size(w, h); 
} 
İlgili konular