我尝试在Windows 10通用应用程序中将InkCanvas的笔触渲染到RenderTargetBitmap。这是我的xaml代码:

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="10" />
        <RowDefinition Height="*" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>

    <Grid x:Name="container">
        <Rectangle Fill="LightBlue" />
        <InkCanvas x:Name="InkCanvas" />
    </Grid>

    <Image Grid.Row="2" x:Name="TheImage" />

    <Button Grid.Row="3" Content="CopyToRendertargt" Click="Button_Click" />

</Grid>


这是我设置Image.Source属性的代码:

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
        InkCanvas.InkPresenter.InputDeviceTypes = Windows.UI.Core.CoreInputDeviceTypes.Mouse;
    }


    private async void Button_Click(object sender, RoutedEventArgs e)
    {
        RenderTargetBitmap renderTarget = new RenderTargetBitmap();

        await renderTarget.RenderAsync(this.container);

        this.TheImage.Source = renderTarget;
    }

}


当我单击按钮时,我在InkCanvas上所做的笔划会消失,并且InkCanvas会变强,直到我调整应用程序窗口的大小为止。笔触未渲染到RenderTargetBitmap。该图像仅显示了LightBlue矩形。

某人对此有解决方案吗?

**更新**

对于那些正在寻找将笔划保存到uwp上的位图的正确方法的人。我发现了将InkCanvas描边保存到位图的UWP方法:InkStrokeContainer对象具有一个名为SaveAsync(...)的方法,可以将描边保存到流中。如果将此流用作位图的源,则笔触将作为位图。

        InkStrokeContainer container = TheInkCanvas.InkPresenter.StrokeContainer;
        WriteableBitmap bmp;
        using (InMemoryRandomAccessStream ims =
            new InMemoryRandomAccessStream())
        {
            await container.SaveAsync(ims);
            bmp = await new WriteableBitmap(1, 1)
                .FromStream(ims, BitmapPixelFormat.Bgra8);
        }


*注意:此示例代码(https://www.nuget.org/packages/WriteableBitmapEx/)中使用了WriteableBitmapEx

最佳答案

RenderTargetBitmap documentation的XAML视觉效果和RenderTargetBitmap部分中,它描述了:无法捕捉的内容将在捕捉的图像中显示为空白,但是同一视觉树中的其他内容仍可以捕捉并呈现(存在无法捕获的内容不会使该XAML合成的整个捕获无效。因此,可能是InkCanvas的内容不可捕获。

一种替代方法是使用Win2D(Microsoft的Direct2D .NET包装器)。 Win2D可以通过nuget包在UWP应用中使用。您将能够管理墨水笔划并将其保存为图像(jpeg,png和其他格式)。

10-07 15:04