wpf - 如何使WPF ListView 动态显示图像和标签

标签 wpf xaml listview

我很难为WPF窗口创建UI。我正在尝试(动态地)显示一堆电影海报,这些电影海报的名称直接位于图像的下方。通过foreach迭代将ItemsSource分配给图像列表。图像文件本身的大小可能不同,但是如下所示,我将设置一个统一的大小。

基本上,我的目标是使其看起来像这样:

enter image description here

到目前为止,我的代码仅显示一个窗口,该窗口具有一个大的水平行(?),图像居中,没有标签。这是我的XAML代码:

<Window x:Name="TVWindow" x:Class="PACS_Pre_Alpha.TV"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="TV" Height="746" Width="1000" ResizeMode="NoResize">
<Grid x:Name="TVGrid">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition />
    </Grid.RowDefinitions>
    <ListView x:Name="TvBox" HorizontalAlignment="Left" Height="648" VerticalAlignment="Top" Width="994" Grid.Row="5" Grid.Column="5">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <UniformGrid Columns="5" />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ListView.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Vertical" VerticalAlignment="Stretch">
                    <Image Source="{Binding ImageData}" HorizontalAlignment="Center" VerticalAlignment="Top" />
                    <TextBlock Text="{Binding Title}" HorizontalAlignment="Center" VerticalAlignment="Bottom" />
                </StackPanel>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</Grid>

我的电影是使用以下C#代码添加的:
foreach (string tvf in ContentFiles)
{
            string ContentTitle = System.IO.Path.GetFileNameWithoutExtension(tvf);
            MovieData cnt = new MovieData();
            cnt.ImageData = LoadImage(ActualImage);
            cnt.Title = ContentTitle;
            ContentDataList.Add(cnt);

}
        TvBox.ItemsSource = ContentDataList;

编辑:我已经按照@MarkFeldman的建议更改了XAML标记,但是现在什么也没有出现。
编辑:目前看起来像这样:
enter image description here

最佳答案

您将提供有关数据本身的更多信息,即数据的格式,如何将其分配给ItemsSource等。一方面,您没有设置ItemTemplate,所以您可能首先要看一下。例如,如果您有一个包含电影数据的类,如下所示:

public class MovieData
{
    private string _Title;
    public string Title
    {
        get { return this._Title; }
        set { this._Title = value; }
    }

    private BitmapImage _ImageData;
    public BitmapImage ImageData
    {
        get { return this._ImageData; }
        set { this._ImageData = value; }
    }

}

然后,您将使用以下内容显示它:
<ListView.ItemTemplate>
    <DataTemplate>
        <StackPanel Orientation="Vertical" VerticalAlignment="Stretch">
            <Image Source="{Binding ImageData}" HorizontalAlignment="Center" VerticalAlignment="Top"/>
            <TextBlock Text="{Binding Title}" HorizontalAlignment="Center" VerticalAlignment="Bottom"/>
        </StackPanel>
    </DataTemplate>
</ListView.ItemTemplate>

更新:

抱歉,我认为很明显您仍然需要使用UniformGrid。完整的XAML如下所示:
<ListView x:Name="TvBox" HorizontalAlignment="Stretch" VerticalAlignment="Top">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid Columns="5" HorizontalAlignment="Stretch"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ListView.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Vertical" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
                <Image Source="{Binding ImageData}" HorizontalAlignment="Stretch" VerticalAlignment="Top" Stretch="UniformToFill" />
                <TextBlock Text="{Binding Title}" HorizontalAlignment="Stretch" VerticalAlignment="Bottom" />
            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

我已经为您提供了MovieData类,因此您的Window代码应如下所示:
public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();

        this.TvBox.ItemsSource = new MovieData[]
        {
            new MovieData{Title="Movie 1", ImageData=LoadImage("image.jpg")},
            new MovieData{Title="Movie 2", ImageData=LoadImage("image.jpg")},
            new MovieData{Title="Movie 3", ImageData=LoadImage("image.jpg")},
            new MovieData{Title="Movie 4", ImageData=LoadImage("image.jpg")},
            new MovieData{Title="Movie 5", ImageData=LoadImage("image.jpg")},
            new MovieData{Title="Movie 6", ImageData=LoadImage("image.jpg")}
        };
    }

    // for this code image needs to be a project resource
    private BitmapImage LoadImage(string filename)
    {
        return new BitmapImage(new Uri("pack://application:,,,/" + filename));
    }
}

在此示例中,我假设您的项目中有一个名为“image.jpg”的图像,该图像已设置为构建 Action “资源”,如果图像来自其他位置,则需要相应地修改LoadImage代码。

关于wpf - 如何使WPF ListView 动态显示图像和标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35786002/

相关文章:

WPF 与 StringFormat 的绑定(bind)不适用于工具提示

c# - 如何在 C# 中制作一个不可见但可点击的按钮

c# - 根据字符串查找文本框并更改其文本

c# - WPF MVVM 填充另一个组合框的 OnPropertyChanged 组合框

c# - 在 WPF (MVVM) 中动态更改窗口的用户控件

c# - 无法从代码隐藏访问 Metro XAML 自定义控件

java - 反转 ListView 顺序并显示而不滚动

android widget listview 可点击

Jquery Mobile ListView 禁用画外音

wpf - VS2008 在使用 WPF 时默默地死了很多