2012-11-23 9 views
6

Ho un problema.Aggiunta immagine eseguire DataGrid in modo programmatico nel progetto C# wpf - come?

Voglio scrivere TUTTE le cose in modo programmatico in C#, senza VS Designer.

Quindi, sto creando un'immagine e DataGrid e (e sto aggiungendo come un bambino di MainWindow Griglia):

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); 

Poi voglio aggiungere 4 colonne, ad esempio, 3 del testo e uno di immagine. Così in un primo momento ho bisogno di creare un DataTable e DataRow con dati di esempio:

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); 

ora ho un DataTable con 4 colonne e 1 riga di dati.

Poi tutto quello che ho bisogno di fare è impostare ItemsSource di DataGrid in questo modo:

dg.ItemsSource = dt.DefaultView; 

Quello che sto facendo di sbagliato? Perché sulla griglia finale c'è System.Windows.Controls.Image in una riga anziché un'immagine reale? Devo legarlo o qualcosa del genere?

Tutte le cose che devo fare programmaticamente, senza designer.

Come visualizzare l'immagine reale anziché quella stringa?

+1

OMG! senza designer? che ne dici di scrivere XAML? questa non è una winform. non manipolare gli elementi dell'interfaccia utente nel codice. –

risposta

4

Ancora non so come farlo in modo programmato al 100%, ma lo capisco.

La cosa più importante è che DataGrid (o GridView) non supporta Image. Perché? Non chiedermelo Così ho cambiato l'immagine in BitmapImage e funziona come un fascino.

Quindi c'è la mia modifiche:

 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); 

Ma avevo bisogno di aggiungere risorse a XAML (non so come programmare esso). Quindi c'è un codice:

<Window.Resources> 
    <DataGridTemplateColumn x:Key="dgt" Header="Column1" Width="SizeToCells"> 
     <DataGridTemplateColumn.CellTemplate> 
      <DataTemplate> 
       <Image Source="{Binding Column1}" /> 
      </DataTemplate> 
     </DataGridTemplateColumn.CellTemplate> 
    </DataGridTemplateColumn> 
</Window.Resources> 

E tutto funziona BENE!

Lo stesso per GridView o ListView. Spero che aiuti qualcuno.

0

qui ha un super semplice esempio che mi ha aiutato tanto

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

ho adattato il codice di esempio per il MVVM

View

<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> 

Entity

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" });