在 wpf 中绘图时对线条进行动画处理

2023-12-03

XAML

<Canvas Name="canvas" MouseDown="canvas_MouseDown" MouseUp="canvas_MouseUp" Background="White" MouseMove="canvas_MouseMove" />

C#

Line AnimationLine;
Point P1;
private void canvas_MouseDown(object sender, MouseButtonEventArgs e)
{
    P1 = e.GetPosition(canvas);
    AnimationLine = new Line() { Stroke = new SolidColorBrush { Color = Colors.Blue },StrokeThickness = 3};
    AnimationLine.X1 = P1.X;
    AnimationLine.Y1 = P1.Y;
    canvas.Children.Add(AnimationLine);
}


private void canvas_MouseUp(object sender, MouseButtonEventArgs e)
{
    var P2 = e.GetPosition(canvas);
    canvas.Children.Remove(AnimationLine);
    //AnimationLine = new Line();
    canvas.Children.Add
      (new Line()
      {
          X1 = P1.X,
          Y1 = P1.Y,
          X2 = P2.X,
          Y2 = P2.Y,
          StrokeThickness = 3,
          Stroke = new SolidColorBrush { Color = Colors.Blue }
      });
}

private void canvas_MouseMove(object sender, MouseEventArgs e)
{
    if(e.LeftButton == MouseButtonState.Pressed)
    { 
       var P2 = e.GetPosition(canvas);
       AnimationLine.X2 = P2.X;
       AnimationLine.Y2 = P2.Y;
    }
}

我正在尝试绘制一条线,第一个点分配给鼠标按下,第二个点分配给鼠标向上,这就是绘制线的时候,但是当拖动时我想显示动画线,动画线就像实时引导线。

为了得到它,我想画一条线,就像在微软画图中一样。

我刚刚写了上面的内容,效果很好,但这真的是这样做的方法吗?有什么内置功能可以提供帮助吗?


您的代码可以简化如下所示。特别是,您应该添加处理程序MouseLeftButtonDown and MouseLeftButtonUp事件而不是更一般的事件MouseDown and MouseUp事件。另请注意,您通常会捕获鼠标,并且拥有鼠标释放处理程序的唯一目的是释放鼠标捕获。

XAML:

<Canvas Background="Transparent"
        MouseLeftButtonDown="Canvas_MouseLeftButtonDown"
        MouseLeftButtonUp="Canvas_MouseLeftButtonUp"
        MouseMove="Canvas_MouseMove"/>

背后代码:

private void Canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    var canvas = (Canvas)sender;

    if (canvas.CaptureMouse())
    {
        var startPoint = e.GetPosition(canvas);
        var line = new Line
        {
            Stroke = Brushes.Blue,
            StrokeThickness = 3,
            X1 = startPoint.X,
            Y1 = startPoint.Y,
            X2 = startPoint.X,
            Y2 = startPoint.Y,
        };

        canvas.Children.Add(line);
    }
}

private void Canvas_MouseMove(object sender, MouseEventArgs e)
{
    var canvas = (Canvas)sender;

    if (canvas.IsMouseCaptured && e.LeftButton == MouseButtonState.Pressed)
    {
        var line = canvas.Children.OfType<Line>().LastOrDefault();

        if (line != null)
        {
            var endPoint = e.GetPosition(canvas);
            line.X2 = endPoint.X;
            line.Y2 = endPoint.Y;
        }
    }
}

private void Canvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    ((Canvas)sender).ReleaseMouseCapture();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 wpf 中绘图时对线条进行动画处理 的相关文章

随机推荐

  • 正则表达式按空格分割但不转义空格

    我想按标准空白进行分割 但没有转义空格 例如 使用字符串 my name is max 单引号所以 是字面意思 我想要得到 my name is max 我试过这个正则表达式 s 但结果是这样的 gt m name is max 这很接近
  • 如何在 Dartlang 中检索元数据?

    Dartlang教程介绍package metahttps www dartlang org docs dart up and running contents ch02 html ch02 metadata DartEditor 识别元数
  • 从字符串中提取电话号码

    我正在尝试从给定的字符串中提取java中的电话号码 即电话号码可以位于字符串中的任何位置 例如 bla bla TELEPHONE NUMBER bla bla 现在我想在另一个字符串中提取这个电话号码 在使用时 matcher match
  • 如何将保存的 localStorage Web 数据传递到 php 脚本?

    好吧 所以我在尝试找出如何将我保存在 localStorage 中的一些数据传递到我编写的 php 脚本时遇到了一些问题 这样我就可以将其发送到服务器上的数据库 我之前确实找到了一些代码 https developer mozilla or
  • 发送 Outlook 日历邀请 PHP

    该代码的目标是使用 PHP 发送约会和阻止人员日历 我这里有两页 测试 php
  • 通过缓存电子表格值提高脚本性能

    我正在尝试使用 Google Apps 脚本开发一个网络应用程序 将其嵌入到 Google 站点中 该站点仅显示 Google 表格的内容并使用一些简单的参数对其进行过滤 至少目前是这样 稍后我可能会添加更多功能 我得到了一个功能齐全的应用
  • 将密码重置发送到其他电子邮件 - Devise

    我正在使用 Ruby on Rails 5 和 devise 我需要将密码重置电子邮件发送到与我的用户表中存储的电子邮件不同的电子邮件 如何才能实现这一目标 请注意 这是非常不推荐的实现方式 它不在最佳实践的范围内 它又脏又脆弱 但如果你真
  • Apple 文件系统从照片库读取的权限

    我的 ios 应用程序中有一个 UIWebView 它将响应式网站加载到我的 webview 中 在 asp net 中开发 网站有一个按钮用于从设备照片库中选择视频 另一个按钮用于上传视频 在 ios 版本 10 2 之前 它可以成功地将
  • 在帆和水线中混合使用 AND 和 OR 子句

    如何在 Sailsjs 及其 ORM Waterline 中使用 OR 和 AND 子句 例如我有一张书表 book name author free public Book A Author 1 false true Book B Aut
  • 错误标记主机:等待条件超时 [kubernetes]

    我刚刚开始学习 Kubernetes 我已经通过 Kubernetes YUM 存储库安装了 CentOS 7 5 并禁用了 SELinux 的 kubectl kubeadm 和 kubelet 然而 当我想开始一个kubeadm ini
  • 撇号 cms - 自定义小部件中富文本的内联编辑?

    在某些情况下 我无法将富文本的内联编辑保存回数据库 请耐心等待 这里将粘贴一些代码 因为这是我描述我正在做的事情的唯一方式 我的项目中有两种自定义小部件 一种只有一个小部件实例 通常在lib modules目录 article widget
  • 依赖注入类型选择

    最近我遇到一个问题 我必须根据参数选择类型 例如 用于发送通知的类 应根据输入参数选择正确的渠道 电子邮件 短信等 我看起来像这样 public class NotificationManager IEmail email ISms sms
  • Google URLShortener API 返回 ipRefererBlocked

    我正在尝试将 Google URL 缩短 API 与 PHP 结合使用 apiKey ABC url http www stackoverflow com postData array longUrl gt url jsonData jso
  • 正则表达式匹配除空格之外的单个字符

    我需要匹配一个不是空格的单个字符 但我不知道如何使用正则表达式来做到这一点 以下应该足够了 如果您想将其扩展到除空白之外的任何内容 换行符 制表符 空格 硬空格 s or S Note this is a CAPITAL S
  • 将数据从操作传递到另一个操作

    如何通过 RedirectAction 方法将模型从 GetDate 操作传递到另一个 ProcessP 操作 这是源代码 HttpPost public ActionResult GetDate FormCollection values
  • MobileNetV2 的 Keras 和 TensorFlow Hub 版本之间的差异

    我正在研究一种迁移学习方法 并且在使用 MobileNetV2 时得到了非常不同的结果keras applications以及 TensorFlow Hub 上提供的一个 这对我来说似乎很奇怪 因为两个版本都声称here and here从
  • PHP:如何使用数组索引访问数组元素值[重复]

    这个问题在这里已经有答案了 如何使用数组索引访问数组元素值 我不知道 动态 中有什么 所以我想动态访问 pageCount 值 数组值是您正在寻找的功能 例子
  • 改进多节点集群上的 h2o DRF 运行时

    我目前正在跑步h2o的 DRF 算法是一个 3 节点 EC2 集群 h2o 服务器跨越所有 3 个节点 我的数据集有 100 万行和 41 列 40 个预测变量和 1 个响应 我用R控制集群和 RF 调用的绑定如下 model h2o ra
  • PLS-00306:调用“OUTPUT_ARRAY”时参数的数量或类型错误

    我被这个错误困住了 真的不知道如何修复它 也许我以不正确的方式传递数组 这是主要的 sql 文件 DECLARE v array length NUMBER v array length BEGIN DECLARE TYPE number
  • 在 wpf 中绘图时对线条进行动画处理

    XAML