2012-11-23 77 views
6

我遇到问题。添加图像在C#wpf项目中编程DataGrid - 如何?

我想用C#编写所有的东西,不需要VS Designer。

所以,我创建的图像,并和DataGrid(我将其作为主窗口格的孩子):

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和一个图像。所以刚开始我需要创建一个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行数据的数据表。

然后,所有我需要做的就是这样设置的DataGrid的ItemsSource的:

dg.ItemsSource = dt.DefaultView; 

我做错了吗?为什么在最后的网格中有一行而不是实际的图像是System.Windows.Controls.Image?我需要绑定它还是什么?

所有事情我需要做的,没有设计师的程序化。

如何显示真实图像而不是该字符串?

+1

OMG!没有设计师?怎么写XAML?这不是winforms。不要在代码中操作UI元素。 –

回答

4

仍然不知道如何在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也是如此。 希望它可以帮助别人。

0

在这里有一个超级简单的例子,帮了我这么多的

http://www.c-sharpcorner.com/Forums/Thread/80586/displaying-images-in-datagrid-in-wpf-C-Sharp.aspx

我改编为MVVM

查看

<DataGrid x:Name="dgGrid" ItemsSource="{Binding collection}" AutoGenerateColumns="False"> 
     <DataGrid.Columns> 
      <DataGridTemplateColumn Header="Image"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <Image Height="25" Width="50" Source="{Binding path}" /> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
     </DataGrid.Columns> 
     <DataGridTextColumn Header="Name" Binding="{Binding name}"/> 
    </DataGrid> 

示例代码实体

public class File 
{ 
    public string path{ get; set; } 
    public string name{ get; set; } 
} 

ViewModel

var collection = new ObservableCollection<File>(); 
collection.Add(new File() { [email protected]"C:\Users\homeIcon.png", name="Home" });