2010-05-18 199 views
31

我無法找到Panel.IstItemsHost附加屬性的任何良好文檔。我看到很多人在ItemsControl的ItemsContainer模板上設置它的例子,但MSDN上的un-documentation沒有解釋設置屬性賦予的原因或優點。我已經建立了大量不設置此屬性的容器,但尚未注意到任何不良影響。Panel.IsItemsHost究竟做了什麼?

回答

34

說我有一個ItemsControl。我想要使​​用自定義面板,可以在滾動時快速瀏覽項目;它被稱爲SwoopPanel。現在,我如何告訴ItemsControl使用我的SwoopPanel來包含它創建的模板?

的快捷方式是設置ItemsPanel上的ItemsControl:

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

然而,有時候這並不爲你工作。也許你想定製在UI中呈現SwoopPanel的方式,解決這個問題的唯一方法是更改​​ItemsControl的控件模板。現在,您可以將SwoopPanel直接添加到控件模板,並使用該屬性將其標記爲ItemsControl,以便ItemsControl將放置它創建的所有模板化項目。

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

你必須這樣或那樣做嗎?不是。比另一個更有優勢嗎?那麼,第二種方式可以讓你更好地控制UI,第一種方式更簡單。真的,請選擇你的選擇。我從來沒有親自做過第二種方式,但我認爲可能有幾個地方可能有用。

+0

因此,基本上,ItemsControl代碼將記錄在其層次結構中設置爲IsItemsHost的控件,並且如果沒有設置ItemsPanelTemplate,請將該子代用作生成的子代的容器? (我猜如果你有一個模板和一個IsItemsHost孩子,它可能會拋出)。 – Armentage 2010-05-18 21:25:58

+1

IsItemsHost不是附屬性 – 2010-05-19 12:40:29

+1

@kai謝謝更新。看起來像一個好的候選人;感覺有點奇怪,Panel知道如何實現ItemsControl。 – Will 2010-05-19 12:56:41

9

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

從本質上講,這個帖子說的是,如果您要更換ListBox的控件模板,並希望新的佈局,設置IsItemsHost =真有些面板上,例如一個StackPanel。然後,ListBox中的任何項目將自動添加爲StackPanel的子項。如果列表框的方向是水平的,那麼列表框將是水平的。

另一種方法是將ListBox的ItemsPanel屬性設置爲ItemsTemplate,並在該模板中使用StackPanel。在這種情況下,ListBox項目將被添加到StackPanel子項中,就像在第一種情況下一樣。但是,您不需要設置IsItemsHost = true,它將完全不起作用。這是通過設置ItemsPanel屬性來完成的。

+1

這是解釋+1 – mkb 2015-06-22 23:08:52