2015-08-11 11 views
7

ArkaplanBildirilen XAML liste öğeleri, bağımlılık özelliklerinin ne zaman ayarlandığını gösterir?

Özel bir wpf paneli oluşturuyorum. Alt öğeleri düzenlemeye yardımcı olmak için "düzenler" dediğim ikincil bir liste kullanır (Grid.RowDefinitions veya Grid.ColumnDefinitions benzeri). Her bir düzende birkaç bağımlılık özelliği bulunur ve alt öğeler, aşağıda görüldüğü gibi yerleştirildiklerini belirlemek için ekli bir özellik kullanır.

<Panel> 
    <Panel.Layouts> 
     <Layout/> 
     <Layout Attachment="Right"/> 
     <Layout Attachment="Left" Target="0"/> 
    </Panel.Layouts> 

    <ChildItem Panel.Layout="0"/> 
    <ChildItem Panel.Layout="1"/> 
    <ChildItem Panel.Layout="2"/> 
<Panel/> 

Açıkçası, İşler biraz basitleştirilmiş, ancak uzun lafın kısası: Ben "Yerleştir" süreç oluşabilir önce onlar eklendikçe düzenleri işlemek gerekir. Özel bir koleksiyon oluşturdum ve öğeleri eklendikçe görebiliyorum (aşağıya bakınız), ancak öğeler varsayılan özelliklerine sahip. Panel başlatıldıktan sonra ben koleksiyonuna baktığımızda

LayoutCollection: IList 
{ 
    public int IList.Add(object value) 
    { 
     // When first starting, this line always returns the default value, not the one set in XAML 
     Attachment a = (value as Layout).Attachment; 

     // Other code happens below... 
    } 
} 

Ancak, özellikleri doğru ayarlanmış olmalıdır. Sorumun hangisi bana getiriyor: XAML ve panelin başlatma arasındaki sürecinde hangi noktada ürün özelliklerini atanır ve nasıl alırım At

Soru

atandıkları? Bir şekilde ona bağlanmam ve biraz kod çalıştırmam gerek.

+0

BAĞLANTILI veya SONRAKİ Mülkiyete ait değerler, ayarlanmış/kullanılmış mı? Düzenlemeyi tamamen değiştirmekle ilgili bir durum varsa, https://msdn.microsoft.com/de-de/library/system.windows.frameworkelement.arrangeoverride(v=vs.110).aspx – MABVT

+0

Eklenmiş özellikler ('Panel.Layout' özellik eklidir) değerin ayarlandığı/değiştirildiğini bilmek için kullanabileceğiniz geri arama vardır. Pencere sınıfınızda bu geri çağrıyı geçersiz kılabilirsiniz. Bu bağlı özellikleri yarattığınız kodu ve soruna neden olan belirli bir noktayı gösterirseniz iyi olur. O zaman onu düzeltmek kolay olmalı. Bkz. [This] (http://stackoverflow.com/a/31857866/1997232). – Sinatr

+1

Ölçüleri gerçekten ölçmeden ve sonra da çocuk öğelerini düzenlemeden önce neden MeasureOverride'de işlemeyin? – Clemens

cevap

1

Fikrim şu ki, WPF'nin Panel yerleşim sistemi, olmasını istediğiniz şekilde engellenecek şekilde tasarlanmamış.

Ancak, Özel Bağımlılık Özel Bilgilerinizi "senkronize etmek" için yerinde bir mekanizma var. Ve asıl mesele, pafta geçişlerinde bu özelliklere ne zaman ihtiyacınız var?

ArrangeOverride sırasındaysa, AffectsArrange ayarlamalısınız. MeasureOverride sırasında veya AffectsMeasure. Bunun diğer bazı lezzetleri var ama bence ikisinden biri ihtiyacınızı karşılayabilir.

Örneğin, AffectsArrange'ı seçerseniz ve Panel'e List.Add bildirilirse, ArrangeOverride çağrılır ve yeni eklenen öğe sizin düzenleme mantığınızda kullanılabilir.

+0

Çok fazla test yaptım ve herşeyin OnInitialized'in çağrıldığı zamana göre ayarlandığını biliyorum. Çözümünüz, sorunu çözmek için zarif bir yol sağlar. Kontrolün başlatılmasında AffectsArrange'ı ayarlayacağımı düşünüyorum. – bidanshi

İlgili konular