[英]Add image to ListView C# WPF (without xaml)
如何在ListView中制作图像项目? 我需要没有xaml,只有C#。 我大约在网上冲浪了40分钟,却没有发现。 我已经尝试了很多事情,但我在第一栏中停了下来,我只看到“ System.Windows.Controls.StackPanel”。
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
GridView grView = new GridView();
GridViewColumn gwCol1 = new GridViewColumn();
GridViewColumn gwCol2 = new GridViewColumn();
gwCol1.Header = "Avatar";
gwCol2.Header = "Name";
gwCol2.DisplayMemberBinding = new Binding("name");
gwCol1.DisplayMemberBinding = new Binding("stack");
grView.Columns.Add(gwCol1);
grView.Columns.Add(gwCol2);
listView1.View = grView;
//
var list = new List<XData>();
listView1.ItemsSource = list;
//
BitmapImage image1 = new BitmapImage(new Uri(@"C:\Users\montana\OneDrive\Pictures\Saved Pictures\WVQfZqY.jpg"));
Image img = new Image();
img.Width = 100;
img.Height = 100;
img.Source = image1;
StackPanel stackPanel1 = new StackPanel();
stackPanel1.Orientation = Orientation.Horizontal;
stackPanel1.Children.Add(img);
list.Add(new XData() { name="hola", stack=stackPanel1 });
}
}
class XData
{
public string name { get; set; }
// public string url { get; set; }
public StackPanel stack { get; set; }
}
这是产生想要的结果的东西。
更改XData
定义以避免在那里存在视图元素(您没有提到MVVM,但最好坚持这样做):
class XData
{
public string Name { get; set; }
public string Path { get; set; }
}
现在,您可以在xaml(通用解决方案)中定义数据模板, 也可以在背后的代码中生成它,如下所示:
var factory = new FrameworkElementFactory(typeof(Image));
factory.SetValue(Image.SourceProperty, new Binding(nameof(XData.Path)));
factory.SetValue(Image.WidthProperty, 100.0);
factory.SetValue(Image.HeightProperty, 100.0);
var dataTemplate = new DataTemplate { VisualTree = factory };
数据模板可以随心所欲,但是显然可以在xaml中定义它,然后使用FindResource()
进行加载要容易得多,请考虑使用此选项。
然后必须将此数据模板指定为CellTemplate
如下所示:
GridView grView = new GridView();
grView.Columns.Add(new GridViewColumn { Header = "Avatar", CellTemplate = dataTemplate });
grView.Columns.Add(new GridViewColumn { Header = "Name", DisplayMemberBinding = new Binding(nameof(XData.Name)) });
listView1.View = grView;
注意 :不应将DisplayMemberBinding
用于带有CellTemplate
列。
现在,最后,您可以照常设置ItemSource
来填充ListView
:
var list = new List<XData>();
list.Add(new XData { Name = "hola", Path = @"c:\temp\1.jpg" });
list.Add(new XData { Name = "hola2", Path = @"c:\temp\2.png" });
listView1.ItemsSource = list;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.