我正在为 Windows 8 Metro 创建一个应用程序,我需要将框架控件呈现为图像并将其保存到硬盘但不知道如何。我可以为此使用 SharpDX 吗?我能怎么做?在此先感谢您的帮助
4 回答
如果您不介意向 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);
我很抱歉这是不可能的。WritableBitmap 类的 Render() 方法当前不足以完成您想要的。出于同样的原因,此时无法创建屏幕截图。但这些都是积压的事情!但是,现在你知道了。
如果您遵循此线程,将解释 Metro 的局限性及其不起作用的原因。它的本质是:
抱歉,将 Xaml 渲染到元素或捕获您自己的应用程序的屏幕截图并未将其纳入发布版本。一个应用程序无法捕获另一个应用程序的屏幕截图是设计使然。
提到的解决方法是:
我的意思是——您可以使用 Direct2D 绘制形状、文本和图像。使用 XAML UI 绘制的相同形状。我并不是要暗示您可以呈现 XAML 控件 - 只是您可以使用 Direct2D 作为替代方案来获得相同的结果,尽管需要付出更多的努力。
因为我认为这是一个更正确的答案,所以我想重申Zeeshan在原始问题中所做的评论。
winrt xaml 工具包中有一个扩展方法。 http://winrtxamltoolkit.codeplex.com/.../WriteableBitmapRenderExtensions.cs
通过 nuget 安装:
> Install-Package WinRTXamlToolkit.Composition
添加使用:
using WinRTXamlToolkit.Composition;
渲染您的 xaml:
var bitmap = await element.Render();