将完整的页面设计捕获到图像中,Windows Phone 8.1

时间:2016-01-07 15:39:15

标签: c# wpf windows-phone-8.1

我正在开发windows mobile app 8.1,

我希望将页面中的完整设计(wpf控件)转换为图像。 目前,我已使用this

实施了屏幕截图捕获任务

如果页面设计具有滚动功能,则其捕获当前查看区域不是完整页面。 如果我想用可滚动设计转换完整页面设计,该怎么做?

请在屏幕截图下方查看

enter image description here

enter image description here

enter image description here

这是问题, var renderTargetBitmap = new RenderTargetBitmap(); 等待renderTargetBitmap.RenderAsync(uielement);

仅捕获当前查看区域而不是完整的元素内容。

是否可以捕获完整的元素内容?

1 个答案:

答案 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}}方法。