2012-11-23 31 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" });