我尝试在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和其他格式)。