我有一个 UWP 应用程序,使用带有加载和保存墨迹按钮的 UWP InkCanvas。我在一台笔记本电脑上使用该应用程序进行了绘图,将墨迹保存为 gif(+嵌入 isf),并将 gif 文件发送到另一台屏幕较小的笔记本电脑上进行尝试。
当使用同一应用程序但在另一台笔记本电脑上打开 Ink 时,绘图会在边界处被剪切,就好像它不适合屏幕一样,这可能是由于笔记本电脑的屏幕尺寸较小所致。
我尝试通过将 InkCanvas 封装在 Scrollviewer 中来调整整个 InkCanvas 的大小,但绘制遵循 InkCanvas 缩放,因此绘制仍会在边界处被剪裁。与 InkCanvas 上的渲染转换相同。加载墨迹时我还尝试了 StrokeContainer 的复制粘贴方法。它不起作用,而且我发现它很笨重,因为需要循环遍历所有笔画才能选择它们,然后复制粘贴。
我正在寻找一种自动调整 InkCanvas(首选)或 Strokes 大小的方法,以便无论笔记本电脑屏幕的大小如何,绘图都完全显示在 InkCanvas 上。我原以为默认情况下会发生这种情况,但事实并非如此。
虽然我使用的代码非常简单,但我提供它作为开始:
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid Background="White" Grid.Row="1">
<InkCanvas x:Name="inkCanvas"/>
</Grid>
<StackPanel>
<Button Content="Load" Click="LoadButton_Click"/>
<Button Content="Save" Click="SaveButton_Click"/>
</StackPanel>
</Grid>
private async void LoadButton_Click(object sender, RoutedEventArgs e)
{
FileOpenPicker openPicker = new FileOpenPicker();
openPicker.FileTypeFilter.Clear();
openPicker.FileTypeFilter.Add(".isf");
openPicker.FileTypeFilter.Add(".gif");
openPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
StorageFile file = await openPicker.PickSingleFileAsync();
if (file != null)
{
IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.Read);
using (var inputStream = stream.GetInputStreamAt(0))
{
await inkCanvas.InkPresenter.StrokeContainer.LoadAsync(inputStream);
}
stream.Dispose();
}
}
The StrokeContainer.SaveAsync()
方法将创建一个 GIF。我不确定它到底是如何保存墨迹笔划数据的,但它似乎是逐点保存的。自从你的InkCanvas
基于其父级进行拉伸Grid
,其最终边界将因屏幕而异,甚至在调整大小的 UWP 窗口中也是如此。
因此,当您重新加载笔划数据时,它会将点准确地放置在生成的位置。它不会为你改变任何东西。这是原始数据。
如果您希望数据出现在不同的位置,您可以对点应用变换。以下是如何将所有数据缩小 50% 的快速示例:
var container = inkCanvas.InkPresenter.StrokeContainer;
var strokes = container.GetStrokes();
var bounds = container.BoundingRect;
var center = new Vector2((float)bounds.Left, (float)bounds.Top);
var transform = Matrix3x2.CreateScale(.5f, .5f, center);
foreach (var stroke in strokes)
{
stroke.PointTransform *= transform;
}
你可以把这段代码放在后面await container.LoadAsync(inputStream)
.
您需要决定如何处理您的输出。这将取决于您想要的用户体验。如果您想缩放输出,请使用上面的代码片段。如果你想移动它,那么使用Matrix3x2.CreateTranslation(...)
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)