我正在开发windows mobile app 8.1,
我希望将页面中的完整设计(wpf控件)转换为图像。 目前,我已使用this
实施了屏幕截图捕获任务如果页面设计具有滚动功能,则其捕获当前查看区域不是完整页面。 如果我想用可滚动设计转换完整页面设计,该怎么做?
请在屏幕截图下方查看
这是问题, var renderTargetBitmap = new RenderTargetBitmap(); 等待renderTargetBitmap.RenderAsync(uielement);
仅捕获当前查看区域而不是完整的元素内容。
是否可以捕获完整的元素内容?
答案 0 :(得分:0)
您可以使用RenderTargetBitmap
课程。创建一个扩展方法,其中包含您要创建图像的任何UIElement
(在这种情况下,它将是您的页面)和将保存生成的图像的文件。如果成功,该方法返回true:
public static async Task<bool> SaveVisualElementToFile(this UIElement element, StorageFile file)
{
try
{
var renderTargetBitmap = new RenderTargetBitmap();
await renderTargetBitmap.RenderAsync(element);
var pixels = await renderTargetBitmap.GetPixelsAsync();
using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, stream);
byte[] bytes = pixels.ToArray();
encoder.SetPixelData(
BitmapPixelFormat.Bgra8,
BitmapAlphaMode.Straight,
(uint)renderTargetBitmap.PixelWidth,
(uint)renderTargetBitmap.PixelHeight,
DisplayInformation.GetForCurrentView().LogicalDpi,
DisplayInformation.GetForCurrentView().LogicalDpi,
bytes);
await encoder.FlushAsync();
}
return true;
}
catch (Exception)
{
return false;
}
}
您需要确保UIElement
位于可视树中(已呈现),否则该方法将无效。
然后你可以调用这样的方法:
StorageFolder localFolder = ApplicationData.Current.TemporaryFolder;
StorageFile file = await localFolder.CreateFileAsync(ShareSreenshotFileName, CreationCollisionOption.ReplaceExisting);
await view.SaveVisualElementToFile(file);
编辑:
出现问题是因为ListView
已虚拟化,因此并非所有项目都会呈现。您可以使用StackPanel
作为列表视图的项目面板来禁用虚拟化:
<ListView>
<ListView.ItemsStackPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical"/>
</ItemsPanelTemplate>
</ListView.ItemsStackPanel>
</ListView>
另一个问题是如果您传递listview的容器(网格或其他任何东西),只有容器边界将显示在生成的图像中,因此您需要将ListView
引用传递给{ {1}}方法。