在WPF中堆叠未知行数的最佳方法

时间:2014-03-13 05:26:53

标签: c# wpf

我目前有这样的WPF GUI设置:

enter image description here

"检查第三方更新"按钮将查询机器是否有过时的应用程序安装并显示结果,每个更新分组在自己的行/部分中,其中包含一些描述更新的文本和一个允许它们启动安装的按钮。

我有一个为第三方更新构建的类,包含应用程序名称,版本,安装路径,要显示的消息等。我的问题主要是如何实现可视组件。每次更新"应用程序列表"迭代遍历并找到成员,需要使用公共元素(按钮,文本,图片等)生成新行。而且我不知道可能会生成多少行,因此我需要考虑在选项卡中向下滚动的可能性。列表框控制的方式是什么?如何为动态创建的行设置可视模板?

2 个答案:

答案 0 :(得分:2)

ListBox将是一种明智的方法。您必须为ListBoxItems创建一个DataTemplate,并将其分配给ListBox的ItemTemplate属性,如Styling and Templating an ItemsControl中所述。其余所有内容,如选择项目或滚动列表的能力,当然都是由ListBox控件自动完成的。

可能看起来像这样:

<ListBox ItemsSource="{Binding ThirdPartyUpdates}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <Image Source="{Binding AppIcon}" Margin="5"/>
                <TextBlock Text="{Binding AppName}" Margin="5"/>
                <TextBlock Text="{Binding AppVersion}" Margin="5"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

上面的ListBox的视图模型将是这样的:

public class ThirdPartyUpdate
{
    public string AppIcon { get; set; }
    public string AppName { get; set; }
    public string AppVersion { get; set; }
}

public class ViewModel
{
    public ObservableCollection<ThirdPartyUpdate> ThirdPartyUpdates { get; set; }
}

答案 1 :(得分:0)

您可以使用ItemsControl并将其绑定到Class的集合,并使用ItemsControl的模板将数据绑定到您想要的任何控件。看看这个Example

对于集合中的每个项目,您将创建一行。使用ScrollViewer围绕项目控件。将VerticalScrollbar可见性设置为auto,以便仅在需要时才可见。如果您将最大高度设置为您感觉正确的值并将高度设置为自动。它将增长到最大高度,如果超出该项,则会显示滚动条。