WPF add datagrid image column possible?

前端 未结 4 1070
抹茶落季
抹茶落季 2020-12-17 18:38

Using C#.Net 4.5, Visual Studio 2012 Ulti, WPF.

I\'ve got some old win-forms code that i wanted to do in this new WPF app.

code is the following:

<         


        
相关标签:
4条回答
  • 2020-12-17 19:18

    You may try add Image to DataGridTextColumn via pattern bellow. You may sorting and copy to clipboard works well. Use your converter, or binding to your property.

    <DataGridTextColumn  Header="Level"  IsReadOnly="True" Binding="{Binding Level,Converter={StaticResource LogLevelStringConverter}}"   >
        <DataGridTextColumn.CellStyle>
            <Style TargetType="DataGridCell" >
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="DataGridCell">
                            <Grid Background="{TemplateBinding Background}" >
                                <ContentPresenter VerticalAlignment="Center" Margin="20,0,0,0" HorizontalAlignment="Left"  />
                                <Image Grid.Column="0" Width="18" Height="18" Source="{Binding Level,Converter={StaticResource LogLevelIconConverter}}"  HorizontalAlignment="Left" />
                            </Grid>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </DataGridTextColumn.CellStyle>
    </DataGridTextColumn>
    
    0 讨论(0)
  • 2020-12-17 19:19

    See this answer:

    Image Column in WPF DataGrid

     <DataGridTemplateColumn Header="Image" Width="SizeToCells"
     IsReadOnly="True">
       <DataGridTemplateColumn.CellTemplate>
          <DataTemplate>
               <Image Source="{Binding Image}" />
          </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
     </DataGridTemplateColumn>
    

    To add a column in code after:

    DataGridTextColumn textColumn1 = new DataGridTextColumn();
    textColumn1.Header = "Your header";
    textColumn1.Binding = new Binding("YourBindingField");
    dg.Columns.Add(textColumn1);
    

    Use DataGridTemplateColumn to add a custom column See: How do I show image in wpf datagrid column programmatically?

    0 讨论(0)
  • 2020-12-17 19:21

    Here is MainWindow.xaml's code just simple for better understanding

    `

    <Window x:Class="Pic_in_Datagrid.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:Pic_in_Datagrid"
            mc:Ignorable="d"
            Title="MainWindow" Height="350" Width="525">
    
        <Grid>
            <DataGrid x:Name="dt1" ColumnWidth="*" AutoGenerateColumns="False">
    
            </DataGrid>
        </Grid>
    </Window>
    

    After it here is my MainWindow.xaml.cs's code for image or text for adding in datadrid dynamically...

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Windows;
    using System.Windows.Data;
    using System.Windows.Media.Imaging;
    using System.Windows.Controls;    
    namespace Pic_in_Datagrid
            {
                /// <summary>
                /// Interaction logic for MainWindow.xaml
                /// </summary>
                public partial class MainWindow : Window
                {
                    public StudentData stu_data { get; set; }
                    public MainWindow()
                    {
                        InitializeComponent();
                        stu_data = new StudentData();
    
                        List<StudentData> stu = new List<StudentData>();
                        stu.Add(new StudentData() { image = toBitmap(File.ReadAllBytes(@"D:\1.jpg")), stu_name = "abc" });
                        stu.Add(new StudentData() { image = toBitmap(File.ReadAllBytes(@"D:\1.jpg")), stu_name = "def" });
    
    
    
                        FrameworkElementFactory factory = new FrameworkElementFactory(typeof(System.Windows.Controls.Image));
                        Binding bind = new System.Windows.Data.Binding("image");//please keep "image" name as you have set in your class data member name
                        factory.SetValue(System.Windows.Controls.Image.SourceProperty, bind);
                        DataTemplate cellTemplate = new DataTemplate() { VisualTree = factory };
                        DataGridTemplateColumn imgCol = new DataGridTemplateColumn()
                        {
                            Header = "image", //this is upto you whatever you want to keep, this will be shown on column to represent the data for helping the user...
                            CellTemplate = cellTemplate
                        };
                        dt1.Columns.Add(imgCol);
    
                        dt1.Columns.Add(new DataGridTextColumn()
                        {
                            Header = "student name",
                            Binding = new Binding("stu_name") //please keep "stu_name" as you have set in class datamember name
                        });
    
                        dt1.ItemsSource = stu;    
                    }
    
                    public static BitmapImage toBitmap(Byte[] value)
                    {
                        if (value != null && value is byte[])
                        {
                            byte[] ByteArray = value as byte[];
                            BitmapImage bmp = new BitmapImage();
                            bmp.BeginInit();
                            bmp.StreamSource = new MemoryStream(ByteArray);
                            bmp.EndInit();
                            return bmp;
                        }
                        return null;
                    }
                }
    
               public class StudentData
               {
                        public BitmapImage image { get; set; }
                        public string stu_name { get; set; }
                }
            }
    

    The above all code is taken from different resources... Thanks to them who developed and shared these codes...

    0 讨论(0)
  • 2020-12-17 19:25

    Here is what I did. Add a datatemplate in your datagrid with image control like this

                <DataGridTemplateColumn Header="File Type" Width="*">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Image Height="25" Width="50" Source="{Binding FileIcon}"  />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
    

    As you can see my I am binding Image with a property named "FileIcon" that is used in class Version like this

                public class Version
                {
                  public string FileIcon { get; set; }
                }
    

    Now only this you have to do is bind provide a path to "FileIcon" and update ItemSource of DataGrid like this

                ObservableCollection<Version> items = new ObservableCollection<Version>();
    
                items.Add(new Version()
                {
                    FileIcon = "/AssemblyName;component/Images/eye.png",
                });
                YourDataGrid.ItemsSource = null;
                YourDataGrid.ItemsSource = items;
    
    0 讨论(0)
提交回复
热议问题