ItemTemplate 和 ItemPanelTemplate 有什么区别?

发布于 2024-08-05 06:35:16 字数 134 浏览 7 评论 0原文

在 WPF Listbox 中,我对这两个概念感到困惑: ItemTemplateItemsPanelTemplate 有人能给我解释一下吗?

谢谢 约翰

In WPF Listbox, I'm confused with these 2 notions:
ItemTemplate and ItemsPanelTemplate
Can someone explain me more?

Thanks
John

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

深海夜未眠 2024-08-12 06:35:16

让我尝试通过示例来解释这一点:

<ListBox ItemsSource="{Binding}">
  <ListBox.ItemTemplate>
    <DataTemplate>
      <Border Background="SteelBlue" Padding="5" BorderBrush="Black"
        BorderThickness="1" Margin="0,2">
        <TextBlock Text="{Binding}"/>
      </Border>
    </DataTemplate>
  </ListBox.ItemTemplate>
  <ListBox.ItemsPanel>
    <ItemsPanelTemplate>
      <StackPanel Background="DarkKhaki"/>
    </ItemsPanelTemplate>
  </ListBox.ItemsPanel>
</ListBox>

结果:

WPF ListBox templates example

ItemTemplate 确定列表中每个项目的布局。另一方面,ItemsPanel 是将包含各个项目的面板。鉴于上述定义,可视化树将类似于以下内容:

<StackPanel>
  <Border>
    <TextBlock Text="Alpha"/>
  </Border>
  <Border>
    <TextBlock Text="Beta"/>
  </Border>
  ....
</StackPanel>

Let me try to explain this by example:

<ListBox ItemsSource="{Binding}">
  <ListBox.ItemTemplate>
    <DataTemplate>
      <Border Background="SteelBlue" Padding="5" BorderBrush="Black"
        BorderThickness="1" Margin="0,2">
        <TextBlock Text="{Binding}"/>
      </Border>
    </DataTemplate>
  </ListBox.ItemTemplate>
  <ListBox.ItemsPanel>
    <ItemsPanelTemplate>
      <StackPanel Background="DarkKhaki"/>
    </ItemsPanelTemplate>
  </ListBox.ItemsPanel>
</ListBox>

And the result:

WPF ListBox templates example

The ItemTemplate determines the layout of each item in the list. On the other hand the ItemsPanel is the panel that will contain the individual items. Given the above definition the visual tree will be something similar to this:

<StackPanel>
  <Border>
    <TextBlock Text="Alpha"/>
  </Border>
  <Border>
    <TextBlock Text="Beta"/>
  </Border>
  ....
</StackPanel>
‘画卷フ 2024-08-12 06:35:16

ItemTemplate 用于指定用于呈现列表框中的项目的 DataTemplate。
ItemPanelTemplate 用于指定用于排列 ListBox 子项的面板。

例如,如果您的 ListBox 绑定到 ObservableCollection,则必须指定 DataTemplate 来告诉它如何呈现每个 Person 对象。

<ListBox ItemsSource={Binding Persons}>
  <ListBox.ItemTemplate>
    <DataTemplate>
      <StackPanel>
        <TextBlock Text={Binding FirstName}/>
        <TextBlock Text={Binding LastName}/>
        <TextBlock Text={Binding Age}/>
      </StackPanel>
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

这将垂直排列每个项目,因为 ListBox 默认使用 StackPanel。如果您想更改此行为,请使用 ItemPanelTemplate 属性:

<ListBox>
  <ListBox.ItemsPanel>
    <ItemsPanelTemplate>
      <StackPanel Orientation="Horizontal"/>
    </ItemsPanelTemplate>            
  </ListBox.ItemsPanel>
</ListBox>

您甚至可以将 StackPanel 更改为任何其他面板(例如 WrapPanel)。

ItemTemplate is used to specify a DataTemplate used to render the item in your ListBox.
ItemPanelTemplate is used to specify the panel used to arrange the children of your ListBox.

For example, if your ListBox is bound to an ObservableCollection you must specify a DataTemplate to tell it how to render each Person object.

<ListBox ItemsSource={Binding Persons}>
  <ListBox.ItemTemplate>
    <DataTemplate>
      <StackPanel>
        <TextBlock Text={Binding FirstName}/>
        <TextBlock Text={Binding LastName}/>
        <TextBlock Text={Binding Age}/>
      </StackPanel>
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

That will arrange each item vertically because ListBox used a StackPanel by default. If you want to change this behaviour, used the ItemPanelTemplate property:

<ListBox>
  <ListBox.ItemsPanel>
    <ItemsPanelTemplate>
      <StackPanel Orientation="Horizontal"/>
    </ItemsPanelTemplate>            
  </ListBox.ItemsPanel>
</ListBox>

You can even change the StackPanel to any other panel (WrapPanel for example).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文