我正在从 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_as 将 vis 转换为所需类型,它返回 null。 我想知道这种情况该怎么办?
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);