Panel.IsItemsHost究竟做了什么?

问题描述:

我无法找到Panel.IstItemsHost附加属性的任何良好文档。我看到很多人在ItemsControl的ItemsContainer模板上设置它的例子,但MSDN上的un-documentation没有解释设置属性赋予的原因或优点。我已经建立了大量不设置此属性的容器,但尚未注意到任何不良影响。Panel.IsItemsHost究竟做了什么?

说我有一个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

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