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