热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

WPFInkCanvas基本操作方法详解

这篇文章主要为大家详细介绍了WPFInkCanvas基本的操作方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

WPF的InkCanvas就是一个画板,可以在上面随意涂鸦,每写上一笔,InkCanvas的Strokes集合里就新增一个涂鸦对象,下面的代码演示了基本的操作。

效果图


xaml代码


  
    
      
      
      
    
    
    
      
      
    
      
        
        
        
        
        
      
      
      
      
      
      
    
    
      

后台代码

using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
 
namespace WPF_InkCanvas
{
  /// 
  /// MainWindow.xaml 的交互逻辑
  /// 
  public partial class MainWindow : Window
  {
    ViewModel viewModel;
    public MainWindow()
    {
      InitializeComponent();
 
      DrawingAttributes drawingAttributes = new DrawingAttributes
      {
        Color = Colors.Red,
        Width = 2,
        Height = 2,
        StylusTip = StylusTip.Rectangle,
        FitToCurve = true,
        IsHighlighter = false,
        IgnorePressure = true,
 
      };
      inkCanvasMeasure.DefaultDrawingAttributes = drawingAttributes;
 
      viewModel = new ViewModel
      {
        MeaInfo = "测试······",
      };
 
      DataCOntext= viewModel;
    }
 
    private void InkCanvasMeasure_MouseDown(object sender, MouseButtonEventArgs e)
    {
 
    }
 
    private void InkCanvasMeasure_MouseMove(object sender, MouseEventArgs e)
    {
 
    }
 
    private void OpenFile_Click(object sender, RoutedEventArgs e)
    {
      OpenFileDialog openDialog = new OpenFileDialog
      {
        Filter = "Image Files (*.jpg)|*.jpg|Image Files (*.png)|*.png|Image Files (*.bmp)|*.bmp",
        Title = "Open Image File"
      };
      if (openDialog.ShowDialog() == true)
      {
        BitmapImage image = new BitmapImage();
        image.BeginInit();
        image.UriSource = new Uri(openDialog.FileName, UriKind.RelativeOrAbsolute);
        image.EndInit();
        imgMeasure.Source = image;
      }
    }
 
    private void RadioButton_Click(object sender, RoutedEventArgs e)
    {
      if ((sender as RadioButton).Content.ToString() == "绘制墨迹")
      {
        inkCanvasMeasure.EditingMode = InkCanvasEditingMode.Ink;
      }
 
      else if ((sender as RadioButton).Content.ToString() == "按点擦除")
      {
        inkCanvasMeasure.EditingMode = InkCanvasEditingMode.EraseByPoint;
      }
 
      else if ((sender as RadioButton).Content.ToString() == "按线擦除")
      {
        inkCanvasMeasure.EditingMode = InkCanvasEditingMode.EraseByStroke;
      }
 
      else if ((sender as RadioButton).Content.ToString() == "选中墨迹")
      {
        inkCanvasMeasure.EditingMode = InkCanvasEditingMode.Select;
      }
 
      else if ((sender as RadioButton).Content.ToString() == "停止操作")
      {
        inkCanvasMeasure.EditingMode = InkCanvasEditingMode.None;
      }
    }
 
    private void SaveInkCanvas_Click(object sender, RoutedEventArgs e)
    {
      FileStream fileStream = new FileStream("inkCanvas.isf", FileMode.Create, FileAccess.ReadWrite);
      inkCanvasMeasure.Strokes.Save(fileStream);
      fileStream.Close();
    }
 
    private void LoadInkCanvas_Click(object sender, RoutedEventArgs e)
    {
      FileStream fileStream = new FileStream("inkCanvas.isf", FileMode.Open, FileAccess.Read);
      inkCanvasMeasure.Strokes = new StrokeCollection(fileStream);
      fileStream.Close();
    }
 
    private void CopyInkCanvas_Click(object sender, RoutedEventArgs e)
    {
      inkCanvasMeasure.CopySelection();
    }
    private void PasteInkCanvas_Click(object sender, RoutedEventArgs e)
    {
      inkCanvasMeasure.Paste();
    }
  }
}

ViewModel.cs代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace WPF_InkCanvas
{
  class ViewModel : INotifyPropertyChanged
  {
    public event PropertyChangedEventHandler PropertyChanged;
 
    protected virtual void OnPropertyChanged(string propertyName = null)
    {
      if (PropertyChanged != null)
        PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
 
    private string meaInfo;
    public string MeaInfo
    {
      get => meaInfo;
      set
      {
        meaInfo = value;
        OnPropertyChanged("MeaInfo");
      }
    }
  }
}

补充说明:将Image和InkCanvas放到一个Grid里,并且将InkCanvas的长宽绑定到Image,这样Image和InkCanvas的位置就是对应的,方便我后续在InkCanvas上提取Image的感兴趣区域;InkCanvas里加了一个Label可以实现类似图片上添加文字说明的功能,要设置Label的IsHitTestVisible="False",不然点击事件就没办法触发了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • windows便签快捷键_用了windows十几年,没想到竟然这么好用!隐藏的功能你知道吗?
    本文介绍了使用windows操作系统时的一些隐藏功能,包括便签快捷键、截图功能等。同时探讨了windows和macOS操作系统之间的优劣比较,以及人们对于这两个系统的不同看法。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文是一位90后程序员分享的职业发展经验,从年薪3w到30w的薪资增长过程。文章回顾了自己的青春时光,包括与朋友一起玩DOTA的回忆,并附上了一段纪念DOTA青春的视频链接。作者还提到了一些与程序员相关的名词和团队,如Pis、蛛丝马迹、B神、LGD、EHOME等。通过分享自己的经验,作者希望能够给其他程序员提供一些职业发展的思路和启示。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • win10系统搭建Java开发环境的操作方法
    本文介绍了win10系统搭建Java开发环境的详细操作方法,包括下载Windows10系统和Java SE,安装Java开发环境,设置变量等步骤。操作简单,只需按照指导进行即可。 ... [详细]
  • 本文介绍了在Win10上安装WinPythonHadoop的详细步骤,包括安装Python环境、安装JDK8、安装pyspark、安装Hadoop和Spark、设置环境变量、下载winutils.exe等。同时提醒注意Hadoop版本与pyspark版本的一致性,并建议重启电脑以确保安装成功。 ... [详细]
author-avatar
每天还贷的飞鱼
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有