以编程方式在WPF中添加视图/控件

时间:2015-01-17 19:14:23

标签: c# wpf xaml

从数据库加载数据后(让我们说我们加载了课程),我想在列表中显示它们。我已经读过您可以使用UserControl动态添加内容,但这些示例专门用于动态更改内容,而不是显示结果列表。

我想要的是创建一个 XAML 模板,并为每个列表项实例化一次,并将其添加到列表中(换句话说,将其添加到StackedPanel)。我怎样才能做到这一点?另外,我应该使用Page还是UserControl

1 个答案:

答案 0 :(得分:3)

这正是创建ListBoxItemsControl控件的原因。 ListBox是ItemsControl的增强版本,所以我只讨论后者,基本的。

ItemsControl包含一个名为ItemsSource的依赖项属性。在那里传递一个集合,ItemsControl将生成一个"面板"充满了"观点"从该来源获取的物品。

默认情况下,ItemsControl使用StackPanel作为面板,但如果需要,可以通过ItemPanel属性更改它。

默认情况下,ItemsControl使用默认的WPF模板匹配来生成并显示每个项目的视图。但是,您可以专门使用ItemTemplate属性设置DataTemplate来说明视图的外观。

示例:

<!-- simple vertical/StackPanel list -->
<ItemsControl ItemsSource="{Binding MyItems}">
    <ItemsControl.ItemTemplate>
        <!-- the template of a single Item -->
        <!-- note that I'm setting it here explicitely -->
        <!-- but the ItemTemplate prop could have been bound, resourcized, etc -->
        <DataTemplate>
            <Border BorderThickness="1">
                <!-- reads a ShoeSize from the items from MyItems -->
                <TextBlock Text="{Binding ShoeSize}" />
            </Border>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

<!-- simple horizontal/StackPanel list -->
<ItemsControl ItemsSource="{Binding MyItems}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Horizontal" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Border BorderThickness="1">
                <TextBlock Text="{Binding ShoeSize}" />
            </Border>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>


<!-- you can use any panel and any itemtemplate -->
<ItemsControl ItemsSource="{Binding MyXYPoints}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <!-- any Panel is OK! even plain canvas -->
            <Canvas />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <!-- just remember that in canvas there's no autolayout -->
            <!-- so you need to set the coords on each item! -->
            <Ellipse Width="2" Height="2"
                     Canvas.Left="{Binding PositionX}"
                     Canvas.Top="{Binding PositionY}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

ListBox本质上是相同的控件,但为您提供了一些默认的&#39;好东西,如能够滚动(虚拟化)项目,如果有太多,选择一个项目,等等。您可以从ItemsControl获取这些功能,但您需要自己实现或至少配置它们。 ListBox刚刚完成它。但绝对是#34;更重的&#34;比ItemsControl,所以选择最适合的。

无论如何......我写的只是因为我今天心情很好。但是你真的需要阅读更多关于ItemsControl和Bindings的内容。在WPF中,您几乎不会在UI上手动放置代码&#34;。我实际上不应该写这么多,因为专家已经涵盖了所有这些...... 请继续阅读 this excellent series of articles by Dr.Wpf。尤其是&#34; I&#34;章节,因为它与你所询问的内容完全相关,但我真的建议你阅读它们。它们有点详细,对于某些读者来说有点太多了,但它们让你非常需要了解你手头有什么好工具。