2013-07-17 4 views
0

Мне было поручено взять существующий список прозрачных изображений .png (в настоящее время размещен в ImageList) и отображать их в WPF DataGrid на основе столбца ImageID.Отображение прозрачного изображения в WPF DataGrid

Я настроил DataGridColumn следующим образом:

_dataTemplateColumn = new DataGridTemplateColumn(); 
    _dataTemplateColumn.Header = ""; 
    FrameworkElementFactory _factory = new FrameworkElementFactory(typeof(Image)); 
    Binding _binding = new Binding("Image"); 
    _binding.Mode = BindingMode.TwoWay; 
    _factory.SetValue(Image.SourceProperty, _binding); 
    DataTemplate _cellTemplate = new DataTemplate(); 
    _cellTemplate.VisualTree = _factory; 
    _dataTemplateColumn.CellTemplate = _cellTemplate; 

    Style _style = new Style(); 
    _style.Setters.Add(new Setter(BackgroundProperty, Brushes.Transparent)); 
    _dataTemplateColumn.CellStyle = _style; 

Я затем создать пользовательский объект во время выполнения, который включает в себя изображение для меня и запустить следующие 2 метода на Образа, первый изменить его размер и второй, чтобы превратить его в Bitmap, а не BitmapImage (который является единственным форматом, мне удалось получить его работу в WPF с до сих пор):

public static Bitmap ResizeImage(this Bitmap Bitmap, Size size) 
    { 
     try 
     { 
      Bitmap _bitmap = new Bitmap(size.Width, size.Height); 
      using (Graphics _graphic = Graphics.FromImage((Image)_bitmap)) 
      { 
       _graphic.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
       _graphic.DrawImage(Bitmap, 0, 0, size.Width, size.Height); 
      } 
      _bitmap.MakeTransparent(Color.Magenta); 

      return _bitmap; 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 

    public static Bitmap ToBitmap(this BitmapImage BitmapImage) 
    { 
     using (MemoryStream _stream = new MemoryStream()) 
     { 
      BitmapEncoder _encoder = new BmpBitmapEncoder(); 
      _encoder.Frames.Add(BitmapFrame.Create(BitmapImage)); 
      _encoder.Save(_stream); 
      System.Drawing.Bitmap _bitmap = new System.Drawing.Bitmap(_stream); 
      _bitmap.MakeTransparent(Color.Magenta); 
      return new Bitmap(_bitmap); 
     } 
    } 

изображение, что отображается правильный размер и положение в DataGrid, но прозрачность не является urb из формата .png. Если кто-нибудь знает лучший метод для меня (возможно, правильнее взять изображение в файл ресурсов, например, например?) Или способ получить прозрачность, работающую в моем текущем коде, это было бы очень полезно!

+0

Капля все 'System.Drawing.Bitmap' родственный вещи. Это не нужно в WPF. Просто привяжите свойство Image.Source к 'Uri', которое ссылается на исходный файл изображения. Изменение размера уже выполняется с помощью элемента управления «Image». – Clemens

+0

Я не использую Image Control, хотя изображение должно отображаться в DataGridColumn и выполняется с помощью DataGridTemplateColumn? – SkankyMuppet

+0

Тогда что это: 'FrameworkElementFactory (typeof (Image));'? «Изображение» - это [Управление изображениями] (http://msdn.microsoft.com/en-us/library/System.Windows.Controls.Image.aspx). – Clemens

ответ

0

Следующий пример дает представление о том, как это может выглядеть следующим образом:

XAML:

<Window ...> 
    <Window.Resources> 
     <DataTemplate x:Key="ImageCellTemplate"> 
      <Image Source="{Binding Image}" Width="100"/> 
     </DataTemplate> 
    </Window.Resources> 
    <Grid> 
     <DataGrid x:Name="dataGrid" AutoGenerateColumns="False"/> 
    </Grid> 
</Window> 

Код:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     var col = new DataGridTemplateColumn(); 
     col.CellTemplate = (DataTemplate)Resources["ImageCellTemplate"]; 

     dataGrid.Columns.Add(col); 

     foreach (var file in Directory.EnumerateFiles(@"C:\Users\Public\Pictures\Sample Pictures", "*.jpg")) 
     { 
      dataGrid.Items.Add(new DataItem { Image = file }); 
     } 
    } 
} 

public class DataItem 
{ 
    public string Image { get; set; } 
} 
+0

Спасибо, что сработало :) – SkankyMuppet