C# 在WinRT metro中将控件渲染为图像

C# 在WinRT metro中将控件渲染为图像,c#,windows-8,microsoft-metro,rendering,windows-runtime,C#,Windows 8,Microsoft Metro,Rendering,Windows Runtime,我正在为Windows8Metro创建一个应用程序,我需要将一个框架控件渲染成一个映像并将其保存到硬盘,但不知道如何操作。我可以用SharpDX吗?我该怎么办?提前感谢您的帮助很抱歉,这是不可能的。WritableBitmap类的Render()方法当前不足以完成所需的操作。出于同样的原因,此时无法创建屏幕截图。但这些都是积压的事情!但是,现在你知道了。如果你坚持到底,Metro的局限性以及它不起作用的原因都会得到解释。其实质是: 抱歉,但是正在将Xaml渲染到元素或捕获元素的屏幕截图 您自己的

我正在为Windows8Metro创建一个应用程序,我需要将一个框架控件渲染成一个映像并将其保存到硬盘,但不知道如何操作。我可以用SharpDX吗?我该怎么办?提前感谢您的帮助

很抱歉,这是不可能的。WritableBitmap类的Render()方法当前不足以完成所需的操作。出于同样的原因,此时无法创建屏幕截图。但这些都是积压的事情!但是,现在你知道了。

如果你坚持到底,Metro的局限性以及它不起作用的原因都会得到解释。其实质是:

抱歉,但是正在将Xaml渲染到元素或捕获元素的屏幕截图 您自己的应用程序未进入发布版本。这是故意的 一个应用程序无法捕获另一个应用程序的屏幕截图

提到的解决办法是:

我的意思是-你可以使用 Direct2D。与使用XAML UI绘制的形状相同。 我并不是想暗示您可以呈现XAML控件——只是这样 您可以使用Direct2D作为替代方案来实现相同的结果,尽管 多花点力气


因为我认为这是一个更正确的答案,所以我想重申在原问题中所作的评论


winrt xaml工具箱中有一个扩展方法。

通过nuget安装:

> Install-Package WinRTXamlToolkit.Composition
使用以下方法添加:

using WinRTXamlToolkit.Composition;
呈现您的xaml:

var bitmap = await element.Render();

如果您不介意向SharpDX程序集添加依赖项,那么justin.m.chase的方法肯定有效。RenderTargetBitmap类可能非常适合您尝试完成的任务

// Render XAML to bitmap
var bitmap = new  RenderTargetBitmap();
await bitmap.RenderAsync(elementToRender);

// get the pixels
IBuffer pixelBuffer = await bitmap.GetPixelsAsync();
byte[] pixels = pixelBuffer.ToArray();

// write the pixels to a InMemoryRandomAccessStream
var stream = new  InMemoryRandomAccessStream();
var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.BmpEncoderId, stream);
encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Straight, (uint)bitmap.PixelWidth, (uint)bitmap.PixelHeight, 96, 96, pixels);

await encoder.FlushAsync();
stream.Seek(0);

winrt xaml工具箱中有一个扩展方法。