C# 如果WPF ListView的视图与Windows 7中的超大图标视图类似,如何为该视图定义每个项目?

C# 如果WPF ListView的视图与Windows 7中的超大图标视图类似,如何为该视图定义每个项目?,c#,.net,wpf,xaml,effects,C#,.net,Wpf,Xaml,Effects,基本上我是在尝试做类似的事情 只显示固定尺寸的图像,图像下方没有文本。它还应该在图像之间有一个固定的水平和垂直距离 此外,如果有人可以添加鼠标悬停发光效果来模拟相同的东西,那将是很酷的 我现在更熟悉xaml了,但我只是对定义列表视图控件的每个项感到困惑。我之前只在GridViewColumns中使用了WPFListView,所以这是新的 另外,我试图绑定包含图像的列表视图的对象如下所示: class Film { Image Image {get;set;} } 但是如果我将它们存储在

基本上我是在尝试做类似的事情

只显示固定尺寸的图像,图像下方没有文本。它还应该在图像之间有一个固定的水平和垂直距离

此外,如果有人可以添加鼠标悬停发光效果来模拟相同的东西,那将是很酷的

我现在更熟悉xaml了,但我只是对定义
列表视图
控件的每个项感到困惑。我之前只在
GridViewColumns
中使用了WPF
ListView
,所以这是新的

另外,我试图绑定包含图像的
列表视图的对象如下所示:

class Film
{
    Image Image {get;set;}
}

但是如果我将它们存储在不同于
图像
的类型中,那也很酷。

我会使用
项控件

作为
ItemsPanel
我将使用
WrapPanel
。作为
ItemTemplate
您可以提供一个绑定到电影图像的数据模板,最好将图像作为
ImageSource
提供,然后您可以直接将其用作图像元素的源


为图像定义一种样式,在该样式中为
IsMouseOver
=每个框架元素定义一个触发器,当鼠标位于图像上方时,每个框架元素都具有您想要的任何视觉效果。

我将使用
项控件

作为
ItemsPanel
我将使用
WrapPanel
。作为
ItemTemplate
您可以提供一个绑定到电影图像的数据模板,最好将图像作为
ImageSource
提供,然后您可以直接将其用作图像元素的源


为您的图像定义一种样式,在该样式中,您可以为
IsMouseOver
=每个框架元素定义一个触发器,当鼠标悬停在图像上时,每个框架元素都具有您想要的任何视觉效果。

下面是一个快速而肮脏的示例,其效果与您想要的效果类似:

XAML

<Window x:Class="WpfListViewDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:my="clr-namespace:WpfListViewDemo"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ListView ItemsSource="{Binding Films}"
                  Background="Black">

            <!-- Panel that will contains the items -->
            <ListView.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel IsItemsHost="True"
                               ItemWidth="150" ItemHeight="220"
                               Width="{Binding ActualWidth, RelativeSource={RelativeSource FindAncestor, AncestorType=ScrollContentPresenter}}"/>
                </ItemsPanelTemplate>
            </ListView.ItemsPanel>

            <!-- Template for each item -->
            <ListView.ItemTemplate>
                <DataTemplate DataType="{x:Type my:Film}">
                    <Grid>
                        <!-- Halo that will be shown when the mouse is over the image -->
                        <Ellipse Name="mouseOverHalo" Visibility="Hidden"
                                 Width="180" Height="250"
                                 VerticalAlignment="Center"
                                 HorizontalAlignment="Center"
                                 ClipToBounds="False">
                            <Ellipse.Fill>
                                <RadialGradientBrush Center="0.5, 0.5">
                                    <GradientStop Offset="0.0" Color="Blue" />
                                    <GradientStop Offset="0.8" Color="Blue" />
                                    <GradientStop Offset="1.0" Color="Black" />
                                </RadialGradientBrush>
                            </Ellipse.Fill>
                        </Ellipse>
                        <Image Name="img"
                               Source="{Binding ImagePath}"
                               ToolTip="{Binding Title}"
                               Margin="10" />
                    </Grid>
                    <DataTemplate.Triggers>
                        <!-- Trigger to display the halo when the mouse is over the image -->
                        <Trigger SourceName="img" Property="IsMouseOver" Value="True">
                            <Setter TargetName="mouseOverHalo"
                                    Property="Visibility"
                                    Value="Visible">
                            </Setter>
                        </Trigger>
                    </DataTemplate.Triggers>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </Grid>
</Window>
代码隐藏

(您也可以使用ViewModel类作为DataContext,为了简单起见,我在这里使用了代码)

公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
胶片=新的可见光采集(LoadFilms());
this.DataContext=this;
}
私有静态IEnumerable LoadFilms()
{
字符串imagesDirectory=@“D:\Docs\DVD\covers”;
返回
从目录中的文件。枚举文件(imagesDirectory)
选择新电影
{
Title=Path.GetFileNameWithoutExtension(文件),
ImagePath=文件
};
}
公共可观测收集影片{get;private set;}
}

光环现在很难看,但嘿,我不是设计师;)

下面是一个快速而肮脏的示例,它提供了与您想要的效果类似的效果:

XAML

<Window x:Class="WpfListViewDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:my="clr-namespace:WpfListViewDemo"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ListView ItemsSource="{Binding Films}"
                  Background="Black">

            <!-- Panel that will contains the items -->
            <ListView.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel IsItemsHost="True"
                               ItemWidth="150" ItemHeight="220"
                               Width="{Binding ActualWidth, RelativeSource={RelativeSource FindAncestor, AncestorType=ScrollContentPresenter}}"/>
                </ItemsPanelTemplate>
            </ListView.ItemsPanel>

            <!-- Template for each item -->
            <ListView.ItemTemplate>
                <DataTemplate DataType="{x:Type my:Film}">
                    <Grid>
                        <!-- Halo that will be shown when the mouse is over the image -->
                        <Ellipse Name="mouseOverHalo" Visibility="Hidden"
                                 Width="180" Height="250"
                                 VerticalAlignment="Center"
                                 HorizontalAlignment="Center"
                                 ClipToBounds="False">
                            <Ellipse.Fill>
                                <RadialGradientBrush Center="0.5, 0.5">
                                    <GradientStop Offset="0.0" Color="Blue" />
                                    <GradientStop Offset="0.8" Color="Blue" />
                                    <GradientStop Offset="1.0" Color="Black" />
                                </RadialGradientBrush>
                            </Ellipse.Fill>
                        </Ellipse>
                        <Image Name="img"
                               Source="{Binding ImagePath}"
                               ToolTip="{Binding Title}"
                               Margin="10" />
                    </Grid>
                    <DataTemplate.Triggers>
                        <!-- Trigger to display the halo when the mouse is over the image -->
                        <Trigger SourceName="img" Property="IsMouseOver" Value="True">
                            <Setter TargetName="mouseOverHalo"
                                    Property="Visibility"
                                    Value="Visible">
                            </Setter>
                        </Trigger>
                    </DataTemplate.Triggers>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </Grid>
</Window>
代码隐藏

(您也可以使用ViewModel类作为DataContext,为了简单起见,我在这里使用了代码)

公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
胶片=新的可见光采集(LoadFilms());
this.DataContext=this;
}
私有静态IEnumerable LoadFilms()
{
字符串imagesDirectory=@“D:\Docs\DVD\covers”;
返回
从目录中的文件。枚举文件(imagesDirectory)
选择新电影
{
Title=Path.GetFileNameWithoutExtension(文件),
ImagePath=文件
};
}
公共可观测收集影片{get;private set;}
}

光环现在很难看,但嘿,我不是设计师;)

啊,我正忙着模拟一个例子:)我还是要发布它:我添加了一个阴影,但你可以很容易地将其更改为光晕,而C#part只是从.exe旁边的文件夹中填充一个文件名列表

XAML:


C#:

使用System.Collections.Generic;
使用System.Windows;
使用System.Windows.Documents;
名称空间picu查看器
{
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
}
}
公共类图片
{
公共列表获取图片()
{            
列表p=新列表();
p、 添加(@)pack://siteoforigin:,,,/Images/black.png);
p、 添加(@)pack://siteoforigin:,,,/Images/blu.png);
p、 添加(@)pack://siteoforigin:,,,/Images/empty.png”);
p、 添加(@)pack://siteoforigin:,,,/Images/red.png);
返回p;
}
}
}

啊,我正忙着模拟一个例子:)我还是要发布它:我添加了一个阴影,但你可以很容易地将其更改为发光,而C部分只是从.exe旁边的文件夹中填充一个文件名列表

XAML:


C#:

使用System.Collections.Generic;
使用System.Windows;
使用System.Windows.Documents;
名称空间picu查看器
{
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
}
}
公共类图片
{
公共列表获取图片()
{            
列表p=新列表();
p、 添加(@)pack://siteoforigin:,,,/Images/black.png);
p、 添加(@)pack://siteoforigin:,,,/Images/blu.png);
p、 添加(@)pack://siteoforigin:,,,/Images/em
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        Films = new ObservableCollection<Film>(LoadFilms());
        this.DataContext = this;
    }

    private static IEnumerable<Film> LoadFilms()
    {
        string imagesDirectory = @"D:\Docs\DVD\covers";
        return
            from file in Directory.EnumerateFiles(imagesDirectory)
            select new Film
                {
                    Title = Path.GetFileNameWithoutExtension(file),
                    ImagePath = file
                };

    }

    public ObservableCollection<Film> Films { get; private set; }
}
<Window x:Class="pic_viewer.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:pic_viewer"
    Title="MainWindow" Height="350" Width="525">
<Window.Resources>
    <DataTemplate x:Key="item_template" DataType="Item">
        <Image Source="{Binding}"  Width="64" Height="64"/>
        <DataTemplate.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="BitmapEffect">
                <Setter.Value>
                    <DropShadowBitmapEffect ShadowDepth="3" Color="Black"/>
                </Setter.Value>
            </Setter>
            </Trigger>
        </DataTemplate.Triggers>
    </DataTemplate>
    <ObjectDataProvider x:Key="pic_list" ObjectType="{x:Type local:Pic}" MethodName="get_pics"/>
</Window.Resources>

<ListView ScrollViewer.HorizontalScrollBarVisibility="Disabled" x:Name="item_listbox"
             ItemsSource="{Binding Source={StaticResource pic_list}}" ItemTemplate="{StaticResource item_template}">
    <ListView.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel/>
        </ItemsPanelTemplate>
    </ListView.ItemsPanel>
</ListView>
</Window>
using System.Collections.Generic;
using System.Windows;
using System.Windows.Documents;

namespace pic_viewer
{
    public partial class MainWindow : Window
   {
        public MainWindow()
        {
           InitializeComponent();
        }
    }

    public class Pic
    {
        public List<string> get_pics()
        {            
            List<string> p = new List<string>();
            p.Add(@"pack://siteoforigin:,,,/Images/black.png");
            p.Add(@"pack://siteoforigin:,,,/Images/blu.png");
            p.Add(@"pack://siteoforigin:,,,/Images/empty.png");
            p.Add(@"pack://siteoforigin:,,,/Images/red.png");
            return p;
        }
    }
}