Render control into image in WinRT metro

别来无恙 提交于 2019-12-06 14:00:05

If you follow through this thread the limitations of Metro and the reasons why it won't work are explained. The essence of it is:

Sorry, but rendering Xaml to an element or capturing a screenshot of your own app did not make it into the release version. It is by design that an app cannot capturing a screenshot of another app.

A workaround mentioned is:

What I meant was - you can draw shapes, text and images using Direct2D. The same shapes that you would otherwise draw with XAML UI. I did not mean to imply that you can render XAML controls - just that you can use Direct2D as an alternative to achieve same results albeit with somewhat more effort.

justin.m.chase's approach certainly works if you do not mind adding dependencies to SharpDX assemblies. The RenderTargetBitmap class might be a good fit for what you are trying to accomplish.

// 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);

I apologize that this is not possible. The WritableBitmap class' Render() method is current insufficient to accomplish what you are wanting. For the same reason a screenshot cannot be created at this time. But these are the things that are on the backlog! But, now you know.

justin.m.chase

Because I think this is a more correct answer I would like to reiterate the comment that Zeeshan made in the original question.

There is a extension method for that in winrt xaml toolkit. http://winrtxamltoolkit.codeplex.com/.../WriteableBitmapRenderExtensions.cs

Install via nuget:

> Install-Package WinRTXamlToolkit.Composition

Add the using:

using WinRTXamlToolkit.Composition;

Render your xaml:

var bitmap = await element.Render();
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!