切换 PC 时,InkCanvas 笔画未以正确的边界渲染

2024-05-14

我有一个 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(使用前将#替换为@)

切换 PC 时,InkCanvas 笔画未以正确的边界渲染 的相关文章

随机推荐

  • 同一服务器上的许多应用程序具有相同的 JMX Mbean 类

    我有超过 5 个 Spring Web 应用程序 它们都在使用另一个通用库 这个公共库有它自己的 MBean 由于强制的唯一 objectName 约束 我的应用程序无法部署在同一服务器上 我使用 MBean 的方式是这样的 Managed
  • 使用 cmd/schtasks 将任务设置为在系统启动时运行

    我对如何使用 schtasks 命令行安排任务在系统启动时作为 SYSTEM 运行有点困惑 我已经阅读了 MS 关于 schtasks exe 的文档 这里有人可以帮助我吗 以下命令安排 MyApp 程序从 2001 年 3 月 15 日开
  • Spring Oauth2 使用 Spring Boot 2.0 返回 401 Unauthorized 错误

    我正在尝试使用 spring oauth2 实现 SSO 对于 spring 1 5 x 它工作得很好 但是 一旦我将 oauth 服务器应用程序升级到 spring boot 2 2 3 RELEASE 我什至无法进入登录表单 即将 ht
  • 根据不平凡的标准有效合并两个数据帧

    正在接听这个问题 https stackoverflow com questions 18821862 data selection error 18823432 18823432昨晚 我花了一个小时试图找到一个没有增长的解决方案data
  • 消息框按钮文本

    我环顾四周 似乎所有内容都可以在消息框中编辑 禁止按钮上的文本 WPF http en wikipedia org wiki Windows Presentation Foundation C MessageBox Show Generic
  • 链接异常的实现是如何工作的?

    我之前问过一个question https stackoverflow com questions 3543725 should exceptions be chained in c关于如何在 C 中链接异常 其中一个答案为如何完成它提供了
  • “源兼容性”和“目标兼容性”有什么区别?

    之间有什么关系 区别sourceCompatibility and targetCompatibility 当它们设置为不同的值时会发生什么 根据工具链和兼容性 https docs gradle org current userguide
  • 带有右侧固定侧边栏的 Bootstrap 响应式网格

    我想创建一个带有类似引导程序的模板 它尊重网格的响应系统 在图中 导航栏和右侧 包含两个按钮 是粘性的 始终显示在视图上 我的问题是右侧 因为在引导网格系统中 右侧块将被视为单行 而主要内容包含多行 我怎样才能做到这一点 围绕整个 Boot
  • SQL 事务如何工作?

    我从事 SQL 工作的时间并不长 但我想我明白 通过将 SQL 语句包装在事务中 所有语句都会完成 或者都不会完成 这是我的问题 我有一个包含 lineitem 集合的订单对象 行项目在 order OrderId 上相关 我已经证实所有
  • 如何将 NSDate 转换为 NSString?

    我想将 NSDate 转换为 NSString 这怎么可能 我尝试了这个 但它不起作用 它正在生成异常 NSString dateToString NSString alloc initWithFormat NSString dateObj
  • 如何用纯JavaScript控制变换距离

    我做的http codepen io adamchenwei pen dOvJNX http codepen io adamchenwei pen dOvJNX 我尝试对 dom 应用某种移动方式 使其移动固定距离并停止 而不是动画并移动穿
  • 通过应用程序组在应用程序之间通信和保存数据

    iOS 8 昨天发布了一个有关应用程序组的新 API 以前在应用程序之间共享数据和通信有点混乱 我相信这正是应用程序组旨在纠正的问题 在我的应用程序中 我启用了应用程序组并添加了一个新组 但我找不到任何有关如何使用它的文档 文档和 API
  • 在 R 中按组检查重叠开始和结束时间

    我想检查数据的重叠 这是数据 ID lt c rep 1 3 rep 3 5 rep 4 4 rep 5 5 Begin lt c 0 2 5 3 7 8 7 25 25 10 15 17 20 1 NA 10 11 13 End lt c
  • 如何快速防止标签中出现孤儿?

    我有一个可以有一两行的标签 如果它有两行 我希望第二行至少有两个 或者可能三个 单词 而不仅仅是一个 关于如何使用 swift 实现这一点有什么想法吗 提前致谢 Daniel 编辑 我删除了我愚蠢的第一个想法 这些想法并没有真正的帮助 好吧
  • 如何延迟 AngularJS 应用程序初始化?

    我有一些数据正在后台异步处理 并且希望延迟整个 AngularJS 应用程序的初始化 直到完成 BackgroundData initialized 是一个 Q 承诺 所以像这样 BackgroundData initialized the
  • 在 Rails 6 上定义 Secret_key_base 的正确方法是什么?

    正确的定义方式是什么secret key base既然我们已经有了每个环境的凭据 就可以在 Rails 6 上使用了吗 我的环境有变量SECRET KEY BASE但 Rails 并没有接受它 我尝试定义secret key base in
  • 如何确定 Keras Conv2D 函数中的“filter”参数

    我刚刚开始我的 ML 之旅 并且已经完成了一些教程 对我而言 不清楚的一件事是如何为 Keras Conv2D 确定 过滤器 参数 我读过的大多数资料只是将参数设置为 32 没有任何解释 这只是经验法则还是输入图像的尺寸起作用 例如 CIF
  • 如何使用重复的键动态生成 JSON 对象?

    我知道这听起来不可能 但我的老板告诉我 我必须使用 jQuery 通过 AJAX 后调用发送 JSON 并且必须具有重复的键 问题是 如果我写这样的东西 post someurl key1 value1 key2 value2 key2 v
  • 多个连接到同一个表

    我有这组表格和数据 CREATE TABLE item id INT PRIMARY KEY name VARCHAR CREATE TABLE property id INT PRIMARY KEY name VARCHAR CREATE
  • 切换 PC 时,InkCanvas 笔画未以正确的边界渲染

    我有一个 UWP 应用程序 使用带有加载和保存墨迹按钮的 UWP InkCanvas 我在一台笔记本电脑上使用该应用程序进行了绘图 将墨迹保存为 gif 嵌入 isf 并将 gif 文件发送到另一台屏幕较小的笔记本电脑上进行尝试 当使用同一