如何在 WPF 应用程序中正确添加带有图像单元格的 GridViewColumn
How to add GridViewColumn with image cells properly in WPF app
如果我只添加字符串值列 - 一切正常:
gridView.Columns.Add(new GridViewColumn
{
Header = "ExecFileName",
DisplayMemberBinding = new Binding("ExecFileName")
});
但是我如何在该列的单元格中添加具有 BitmapImage 或 ImageSource 值的列?
无论我做什么 - 我总是只能看到图像文件的路径 - 如何显示图像本身?
P.S.: 我正在从代码创建 GridView,在 xaml 我只有:
<ListView x:Name="ResultListView"
BorderThickness="2,0,2,0"
BorderBrush="Gray"
Height="Auto"
Width="Auto"
Margin="0,0,0,10"
RenderTransformOrigin="0.502,2.299"
AutomationProperties.IsColumnHeader="True"
Loaded="ResultListView_Loaded"
MouseDoubleClick="ResultListView_MouseDoubleClick" >
</ListView>
由于您是在代码隐藏中创建 GridView,因此您还需要在代码隐藏中创建到 ImageSource/BitmapSource 的绑定。
这是生成此列表视图的示例:
MainWindow.xaml 文件是:
<Window x:Class="WpfApplication6.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApplication6"
mc:Ignorable="d"
Title="MainWindow" Height="150" Width="250"
d:DataContext="{d:DesignData d:Type=local:MainWindow}">
<Grid>
<ListView x:Name="ResultListView"
ItemsSource="{Binding Items}"
BorderThickness="2,0,2,0"
BorderBrush="Gray"
Height="Auto"
Width="Auto"
Margin="0,0,0,10"
RenderTransformOrigin="0.502,2.299"
AutomationProperties.IsColumnHeader="True">
</ListView>
</Grid>
</Window>
隐藏代码是这样的(MainWindow.xaml.cs):
using System;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Media.Imaging;
namespace WpfApplication6
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public ObservableCollection<Item> Items { get; } = new ObservableCollection<Item>(new[]
{
new Item { ExecFileName = @"C:\Temp\icon1.png" },
new Item { ExecFileName = @"C:\Temp\icon2.png" }
});
public MainWindow()
{
InitializeComponent();
DataContext = this;
FrameworkElementFactory factory = new FrameworkElementFactory(typeof(Image));
factory.SetBinding(Image.SourceProperty, new Binding("ImageSource"));
GridView gridView = new GridView();
gridView.Columns.Add(new GridViewColumn
{
Header = "FileName",
DisplayMemberBinding = new Binding("ExecFileName")
});
gridView.Columns.Add(new GridViewColumn
{
Header = "Image",
CellTemplate = new DataTemplate() { VisualTree = factory }
});
ResultListView.View = gridView;
}
}
public class Item
{
public string ExecFileName { get; set; }
public BitmapImage ImageSource
{
get
{
return new BitmapImage(
new Uri(ExecFileName, UriKind.RelativeOrAbsolute));
}
}
}
}
我只给出一个简短的答案 - 我的错误到底是什么:
我正在尝试像往常一样为字符串值单元格添加列:
gridView.Columns.Add(new GridViewColumn
{
Header = "Icon",
DisplayMemberBinding = new Binding("Icon")
});
但我需要这样添加:
FrameworkElementFactory factory = new FrameworkElementFactory(typeof(Image));
factory.SetBinding(Image.SourceProperty, new Binding("Icon"));
gridView.Columns.Add(new GridViewColumn
{
Header = "Icon",
CellTemplate = new DataTemplate() { VisualTree = factory }
});
如果我只添加字符串值列 - 一切正常:
gridView.Columns.Add(new GridViewColumn
{
Header = "ExecFileName",
DisplayMemberBinding = new Binding("ExecFileName")
});
但是我如何在该列的单元格中添加具有 BitmapImage 或 ImageSource 值的列?
无论我做什么 - 我总是只能看到图像文件的路径 - 如何显示图像本身?
P.S.: 我正在从代码创建 GridView,在 xaml 我只有:
<ListView x:Name="ResultListView"
BorderThickness="2,0,2,0"
BorderBrush="Gray"
Height="Auto"
Width="Auto"
Margin="0,0,0,10"
RenderTransformOrigin="0.502,2.299"
AutomationProperties.IsColumnHeader="True"
Loaded="ResultListView_Loaded"
MouseDoubleClick="ResultListView_MouseDoubleClick" >
</ListView>
由于您是在代码隐藏中创建 GridView,因此您还需要在代码隐藏中创建到 ImageSource/BitmapSource 的绑定。
这是生成此列表视图的示例:
MainWindow.xaml 文件是:
<Window x:Class="WpfApplication6.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApplication6"
mc:Ignorable="d"
Title="MainWindow" Height="150" Width="250"
d:DataContext="{d:DesignData d:Type=local:MainWindow}">
<Grid>
<ListView x:Name="ResultListView"
ItemsSource="{Binding Items}"
BorderThickness="2,0,2,0"
BorderBrush="Gray"
Height="Auto"
Width="Auto"
Margin="0,0,0,10"
RenderTransformOrigin="0.502,2.299"
AutomationProperties.IsColumnHeader="True">
</ListView>
</Grid>
</Window>
隐藏代码是这样的(MainWindow.xaml.cs):
using System;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Media.Imaging;
namespace WpfApplication6
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public ObservableCollection<Item> Items { get; } = new ObservableCollection<Item>(new[]
{
new Item { ExecFileName = @"C:\Temp\icon1.png" },
new Item { ExecFileName = @"C:\Temp\icon2.png" }
});
public MainWindow()
{
InitializeComponent();
DataContext = this;
FrameworkElementFactory factory = new FrameworkElementFactory(typeof(Image));
factory.SetBinding(Image.SourceProperty, new Binding("ImageSource"));
GridView gridView = new GridView();
gridView.Columns.Add(new GridViewColumn
{
Header = "FileName",
DisplayMemberBinding = new Binding("ExecFileName")
});
gridView.Columns.Add(new GridViewColumn
{
Header = "Image",
CellTemplate = new DataTemplate() { VisualTree = factory }
});
ResultListView.View = gridView;
}
}
public class Item
{
public string ExecFileName { get; set; }
public BitmapImage ImageSource
{
get
{
return new BitmapImage(
new Uri(ExecFileName, UriKind.RelativeOrAbsolute));
}
}
}
}
我只给出一个简短的答案 - 我的错误到底是什么:
我正在尝试像往常一样为字符串值单元格添加列:
gridView.Columns.Add(new GridViewColumn
{
Header = "Icon",
DisplayMemberBinding = new Binding("Icon")
});
但我需要这样添加:
FrameworkElementFactory factory = new FrameworkElementFactory(typeof(Image));
factory.SetBinding(Image.SourceProperty, new Binding("Icon"));
gridView.Columns.Add(new GridViewColumn
{
Header = "Icon",
CellTemplate = new DataTemplate() { VisualTree = factory }
});