2010-05-18 28 views
31

Panel.IstItemsHost ekli özelliği için iyi bir belge bulamıyorum. ItemsControl için ItemsContainer şablonunda ayarlayan birçok insan örneğini görüyorum, ancak MSDN'deki un-document belgelerinin özelliği, özellik belirleme nedenini veya avantajlarını açıklamıyor. Bu özelliği SAHİP OLMAYAN, ancak henüz herhangi bir yan etki görmediği için çok fazla konteyner ürettim.Panel.IsItemsHost tam olarak ne yapar?

cevap

34

ItemsControl'üm var mı? Kaydırarak öğeleri içeri ve dışarı sokan özel bir panel kullanmak istiyorum; onun bir SwoopPanel denir. Şimdi, ItemsControl'ün, oluşturduğu şablonları içermek için SwoopPanel'i kullanmasını nasıl anlarım?

hızlı bir yolu ItemsControl üzerinde ItemsPanel ayarlamaktır: sizin için çalışmıyor bazen Ancak

<ItemsControl.ItemsPanel> 
    <ItemsPanelTemplate> 
     <lol:SwoopPanel /> 
    </ItemsPanelTemplate> 
</ItemsControl.ItemsPanel> 

. Belki de SwoopPanel'in UI'de nasıl sunulduğunu özelleştirmek istersiniz ve bunun üstesinden gelmenin tek yolu ItemsControl'ün kontrol şablonunu değiştirmektir. Şimdi SwoopPanel'inizi doğrudan kontrol şablonuna ekleyebilir ve özelliği kullanarak ItemsControl'ün oluşturduğu tüm şablonlanmış öğeleri yerleştireceği ItemsHost olarak işaretleyebilirsiniz.

<Style TargetType="ItemsControl"> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="ItemsControl"> 
     <Border CornerRadius="5"> 
      <ScrollViewer VerticalScrollBarVisibility="Hidden"> 
      <lol:SwoopPanel IsItemsHost="True"/> 
      </ScrollViewer> 
     </Border> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 

Bunu bir şekilde veya başka yapmak zorunda mısın? Hayır. Bir diğerinden daha avantajlı mı? Eh, ikinci yol UI daha fazla kontrol sağlar, ilk yol daha kolay. Seçimini al, gerçekten. Bunu hiç bir şekilde ikinci şekilde yapmadım, ama sanırım yararlı olabileceği birkaç yer olabilir.

+0

Temel olarak, ItemsControl kodu, hiyerarşisinde IsItemsHost olarak ayarlanan denetimi not edecektir ve ItemsPanelTemplate ayarlanmamışsa, bu çocuğu oluşturulan çocuklar için kapsayıcı olarak kullanın. (Eğer bir şablon ve bir isItemsHost çocuğunuz varsa atmak mümkün sanırım). – Armentage

+1

IsItemsHost ekli bir özellik değildir. –

+1

@kai thanks. İyi bir aday gibi görünüyor; Panel'in ItemsControl'ün nasıl uygulandığını bilmesi biraz garip geliyor. – Will

9

Esasen http://msdn.microsoft.com/en-us/library/system.windows.controls.panel.isitemshost(v=vs.90).aspx

Bkz, ya bu Mesaja diyor olduğunu bir ListBox ControlTemplate değiştirilmesi ve yeni bir düzen, bırakılması istemiyle eğer IsItemsHost = true bazı panelde, örneğin StackPanel. Sonra, ListBox'taki herhangi bir öğe otomatik olarak StackPanel'in çocukları olarak eklenecektir. ListBox yönünü yatay ise, liste kutusu yatay olacaktır.

Diğer yol, ListBox'un ItemsPanel özelliğini bir ItemsTemplate öğesine ayarlamak ve bu şablonda bir StackPanel'iniz var. Bu durumda, ListBox öğeleri ilk durumda olduğu gibi StackPanel çocuklarına eklenecektir. Ancak, IsItemsHost = true değerini ayarlamanıza gerek yoktur, kesinlikle bir etkisi olmaz. Bu, ItemsPanel özelliğini ayarladığınız gerçeği ile sizin için yapılır.

+1

bu açıklama +1'dir. – mkb