代码之家  ›  专栏  ›  技术社区  ›  Maks V. Zaikin

WinUI数据网格行中的文件图标[重复]

  •  0
  • Maks V. Zaikin  · 技术社区  · 1 年前

    存在要转换系统的决议。绘画图标到系统。媒体ImageSource( Convert System.Drawing.Icon to System.Media.ImageSource ). 但是当我使用WinUI而不是WPF时,这个分辨率似乎不可用。我需要转换系统。绘画图标到Microsoft。UI。Xaml。ImageSource在图像控件中显示应用程序的图标。

    我试过使用微软。UI。Xaml。媒体成像。BitmapSource。FromAbi(System.Drawing.Icon.Icon.Handle),但它不适用于System。AccessViolationException。

    那么,我怎样才能得到一个微软。UI。Xaml。图标的ImageSource版本?

    0 回复  |  直到 2 年前
        1
  •  3
  •   Simon Mourier    2 年前

    下面是一个C#代码,它从 GDI+ Icon WinUI3 BitmapSource ,使用图标的像素从一个复制到另一个。

    public static async Task<Microsoft.UI.Xaml.Media.Imaging.SoftwareBitmapSource> GetWinUI3BitmapSourceFromIcon(System.Drawing.Icon icon)
    {
        if (icon == null)
            return null;
    
        // convert to bitmap
        using var bmp = icon.ToBitmap();
        return await GetWinUI3BitmapSourceFromGdiBitmap(bmp);
    }
    
    public static async Task<Microsoft.UI.Xaml.Media.Imaging.SoftwareBitmapSource> GetWinUI3BitmapSourceFromGdiBitmap(System.Drawing.Bitmap bmp)
    {
        if (bmp == null)
            return null;
    
        // get pixels as an array of bytes
        var data = bmp.LockBits(new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, bmp.PixelFormat);
        var bytes = new byte[data.Stride * data.Height];
        Marshal.Copy(data.Scan0, bytes, 0, bytes.Length);
        bmp.UnlockBits(data);
    
        // get WinRT SoftwareBitmap
        var softwareBitmap = new Windows.Graphics.Imaging.SoftwareBitmap(
            Windows.Graphics.Imaging.BitmapPixelFormat.Bgra8,
            bmp.Width,
            bmp.Height,
            Windows.Graphics.Imaging.BitmapAlphaMode.Premultiplied);
        softwareBitmap.CopyFromBuffer(bytes.AsBuffer());
    
        // build WinUI3 SoftwareBitmapSource
        var source = new Microsoft.UI.Xaml.Media.Imaging.SoftwareBitmapSource();
        await source.SetBitmapAsync(softwareBitmap);
        return source;
    }