0

我的任务是获取现有的透明 .png 图像列表(当前位于 ImageList 中)并根据 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 个方法,第一个调整它的大小,第二个将它转换为位图而不是位图图像(这是我唯一的格式到目前为止,设法让它在 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 中以正确的大小和位置显示,但不保留 .png 格式的透明度。如果有人知道对我来说更好的方法(例如,首先将图像放入资源文件中可能更正确?)或者在我当前的代码中获得透明度的方法将不胜感激!

4

1 回答 1

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; }
}
于 2013-07-17T09:28:57.990 回答