我有个问题.
我想在没有VS Designer的情况下以C#编程编写所有内容.
所以,我正在创建一个图像和DataGrid(我将它添加为MainWindow Grid的子代):
Image img = new Image(); Uri uri = new Uri(@"C:\d1.jpg"); img.Source = new System.Windows.Media.Imaging.BitmapImage(uri); DataGrid dg = new DataGrid(); grid1.Children.Add(dg);
然后我想添加4列,例如3个文本和1个图像.所以首先我需要创建一个包含样本数据的DataTable和DataRow:
DataTable dt = new DataTable(); dt.Columns.Add("Column1"); dt.Columns.Add("Column2"); dt.Columns.Add("Column3"); dt.Columns.Add("Column4",typeof(Image)); // type of image! DataRow dr = dt.NewRow(); dr[0] = "aaa"; dr[1] = "bbb"; dr[2] = "ccc"; dr[3] = img; // add a sample image dt.Rows.Add(dr);
现在我有一个包含4列和1行数据的DataTable.
然后我需要做的就是像这样设置DataGrid的ItemsSource:
dg.ItemsSource = dt.DefaultView;
我做错了什么?为什么在最终网格上连续有System.Windows.Controls.Image而不是真实图像?我需要绑定它还是什么?
所有我需要以编程方式完成的事情,没有设计师.
如何显示真实图像而不是该字符串?
解决方法
仍然不知道如何在100%的程序上做到这一点,但我弄清楚了.
最重要的是DataGrid(或GridView)不支持Image.为什么?不要问我.所以我将图像更改为BitmapImage,它就像一个魅力.
所以有我的修改:
Uri uri = new Uri(@"C:\d1.jpg"); BitmapImage bmp = new System.Windows.Media.Imaging.BitmapImage(uri); ... DataGrid dg = new DataGrid(); dg.AutoGenerateColumns = false; DataGridTemplateColumn col1 = (DataGridTemplateColumn)this.FindResource("dgt"); dg.Columns.Add(col1); DataGridTextColumn col2 = new DataGridTextColumn(); col2.Header = "Column2"; col2.Binding = new Binding("Column2"); dg.Columns.Add(col2); ... DataTable dt = new DataTable(); dt.Columns.Add("Column1",typeof(BitmapImage)); dt.Columns.Add("Column2"); DataRow dr = dt.NewRow(); dr[0] = bmp; dr[1] = "test"; dt.Rows.Add(dr); ... dg.ItemsSource = dt.DefaultView; grid1.Children.Add(dg);
但我需要将资源添加到XAML(不知道如何编程).所以有一个代码:
<Window.Resources> <DataGridTemplateColumn x:Key="dgt" Header="Column1" Width="SizeToCells"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Image Source="{Binding Column1}" /> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </Window.Resources>
一切都很好!
GridView或ListView也是如此.希望它可以帮到某人.