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

C# 在WPF中堆叠未知行数的最佳方法,c#,wpf,C#,Wpf,我目前有一个WPF GUI设置,如下所示: “检查第三方更新”按钮将查询机器是否有过时的应用程序安装,并显示结果,每个更新都分组在自己的行/节中,其中包含一些描述更新的文本和一个允许它们启动安装的按钮 我有一个为第三方更新构建的类,其中包含应用程序名称、版本、安装路径、要显示的消息等。我的问题主要是如何实现可视化组件。每次遍历“要更新的应用程序”列表并找到成员时,都需要使用公共元素(按钮、文本、图片等)生成新行。我不知道会生成多少行,所以我需要考虑在选项卡中向下滚动的可能性。listbox控件

我目前有一个WPF GUI设置,如下所示:

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


我有一个为第三方更新构建的类,其中包含应用程序名称、版本、安装路径、要显示的消息等。我的问题主要是如何实现可视化组件。每次遍历“要更新的应用程序”列表并找到成员时,都需要使用公共元素(按钮、文本、图片等)生成新行。我不知道会生成多少行,所以我需要考虑在选项卡中向下滚动的可能性。listbox控件是一种方法吗?如何为动态创建的要遵循的行设置可视模板?

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


对于集合中的每个项目,都将创建一行。将项目控件周围围上一圈。将垂直滚动条可见性设置为“自动”,使其仅在需要时可见。如果您将maximumheight设置为您认为正确的值,并将高度设置为auto。它将增长到最大高度,如果添加的项目超过该高度,滚动条将可见。

列表框将是一种明智的方法。您必须为ListBoxItems创建一个DataTemplate,并将其分配给ListBox的
ItemTemplate
属性,如中所述。所有其他功能,如选择项目或滚动列表的功能,当然是由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>
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; }
}

上述列表框的视图模型如下所示:

<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>
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; }
}
公共类第三方更新
{
公共字符串AppIcon{get;set;}
公共字符串AppName{get;set;}
公共字符串AppVersion{get;set;}
}
公共类视图模型
{
公共可观测集合第三方更新{get;set;}
}