2013-07-17 2 views
0

저는 현재 ImageList에 들어있는 투명한 .png 이미지 목록을 가져 와서 ImageID 열을 기반으로하는 WPF DataGrid에 표시해야했습니다. 다음과 같이 내가의 DataGridColumn를 설정 한WPF DataGrid에 투명한 이미지 표시

:

_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 가지 방법을 실행하고 오히려 (내가 지금까지와 WPF에서 작업 얻을 관리해야하는 유일한 형식입니다)를 BitmapImage보다 비트 맵으로 변환하는 두 번째 :

이미지가 올바른 크기와 위치에 표시되고
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에 있지만 투명도는 pres가 아닙니다. .png 형식에서 삭제되었습니다. 누구든지 나에게 더 나은 방법을 안다면 (예를 들어 이미지를 리소스 파일로 가져 오는 것이 더 낫겠습니까?) 또는 현재 코드 내에서 투명성을 유지하는 방법을 사용하면 가장 좋습니다.

+0

드롭 모두'관련 System.Drawing.Bitmap' 물건. WPF에서는 필요하지 않습니다. 'Image.Source' 속성을 원본 이미지 파일을 참조하는'Uri'에 바인드하면됩니다. 크기 조정은 이미'Image' 컨트롤에 의해 수행됩니다. – Clemens

+0

Image 컨트롤을 사용하고 있지 않지만 DataGridColumn 내에서 이미지를 표시하고 DataGridTemplateColumn을 사용하여 이미지를 완성해야합니까? – SkankyMuppet

+0

다음은 무엇입니까 :'FrameworkElementFactory (typeof (Image));'? 'Image'는 [Image control] (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