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);
        }
    }

Image は DataGrid に正しいサイズと位置で表示されていますが、透過性は .png 形式から保持されません。誰かが私にとってより良い方法を知っている場合(たとえば、最初に画像をリソースファイルに入れる方が正しいかもしれません)、または現在のコード内で透過性を機能させる方法を知っている場合は、それが最も高く評価されます!

4

1 に答える 1