GraphicsCaptureItem::CreateFromVisual 但我的输入参数是 Microsoft.UI.Composition.Visual 类型而不是 Windows

问题描述 投票:0回答:1

我正在从 UWP 迁移到 WinUI3,并且我正在尝试捕获 Xaml 中某些元素的屏幕截图。

auto vis = ElementCompositionPreview::GetElementVisual(m_elementToCapture);
m_item = GraphicsCaptureItem::CreateFromVisual(vis);

我使用的是 Microsoft 版本的 ElementCompositionPreview::GetElementVisual,因此 vis 属于 Microsoft.UI.Composition.Visual 类型,但 GraphicsCaptureItem::CreateFromVisual 需要 Windows.UI.Composition.Visual

尝试使用 try_asvis 转换为所需类型,它返回 null。 我想知道这种情况该怎么办?

c++ winui-3 c++-winrt
1个回答
0
投票

WinUI3 中目前没有 Microsoft 版本的

GraphicsCaptureItem::CreateFromVisual
。建议您使用 RenderTargetBitmap.RenderAsync 将 UIElement 可视化树的快照渲染到图像源。

private async void  myButton_Click(object sender, RoutedEventArgs e)
{
    myButton.Content = "Clicked";
    await CaptureElementScreenshot(myButton, "Test.png");
}

public static int GetCurrentDpi(Window window)
{
    IntPtr hWnd = WinRT.Interop.WindowNative.GetWindowHandle(window);
    return GetDpiForWindow(hWnd);
}
public async Task CaptureElementScreenshot(UIElement element, string filename)
{
    var renderTargetBitmap = new RenderTargetBitmap();
    await renderTargetBitmap.RenderAsync(element);

    var pixelBuffer = await renderTargetBitmap.GetPixelsAsync();
    var pixels = pixelBuffer.ToArray();

    var dpi = GetCurrentDpi(this);

    using (var stream = new InMemoryRandomAccessStream())
    {
        var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, stream);

        encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied,
                                (uint)renderTargetBitmap.PixelWidth, (uint)renderTargetBitmap.PixelHeight,
                                dpi, dpi, pixels);
        await encoder.FlushAsync();

        StorageFolder localFolder = ApplicationData.Current.LocalFolder;
        StorageFile file = await localFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);


        using (var fileStream = await file.OpenAsync(FileAccessMode.ReadWrite))
        {
            await RandomAccessStream.CopyAndCloseAsync(stream.GetInputStreamAt(0), fileStream.GetOutputStreamAt(0));
        }
    }
}

[DllImport("User32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern int GetDpiForWindow(IntPtr hwnd);
© www.soinside.com 2019 - 2024. All rights reserved.