2012-11-23 18 views
6

मुझे एक समस्या है।छवि जोड़ना सी # wpf प्रोजेक्ट में प्रोग्रामग्रेड को प्रोग्रामिक रूप से करें - कैसे?

मैं वीएस डिजाइनर के बिना सी # में सभी चीजों को प्रोग्रामिक रूप से लिखना चाहता हूं।

तो, मैं एक छवि और और डेटा ग्रिड बना रहा हूं (और मैं MainWindow ग्रिड के एक बच्चे के रूप में यह जोड़ रहा):

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 पंक्ति के साथ एक DataTable है।

dg.ItemsSource = dt.DefaultView; 

क्या मैं गलत कर रहा हूँ:

तब सब मैं क्या करने की जरूरत है इस तरह डेटा ग्रिड के ItemsSource स्थापित करने के लिए है? अंतिम ग्रिड पर क्यों सिस्टम है। Windows.Controls. वास्तविक छवि के बजाय एक पंक्ति में छवि? क्या मुझे इसे बांधने की ज़रूरत है?

डिजाइनर के बिना, मुझे सभी चीजें प्रोग्रामिक रूप से करने की ज़रूरत है।

उस स्ट्रिंग के बजाय वास्तविक छवि को कैसे प्रदर्शित करें?

+1

ओएमजी! डिजाइनर के बिना? एक्सएएमएल लिखने के बारे में क्या? यह Winforms नहीं है। कोड में यूआई तत्वों में हेरफेर न करें। –

उत्तर

4

अभी भी यह नहीं पता कि 100% में इसे कैसे करें, लेकिन मैं इसे समझता हूं।

सबसे महत्वपूर्ण बात यह है कि डेटाग्रिड (या ग्रिड व्यू) छवि का समर्थन नहीं करता है। क्यूं कर? मुझसे मत पूछो इसलिए मैंने छवि को बिटमैप इमेज में बदल दिया और यह एक आकर्षण की तरह काम करता है।

तो वहाँ मेरी संशोधनों है:

 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> 

और सभी ठीक काम कर रहे हैं!

ग्रिड व्यू या लिस्ट व्यू के लिए समान है। उम्मीद है कि यह किसी की मदद करता है।

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; } 
} 
है

व्यूमोडेल

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