WPF InkCanvas基本操作方法详解

作者:有个家伙喜欢代码 时间:2023-07-29 06:26:59 

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

效果图

WPF InkCanvas基本操作方法详解

xaml代码


<Window x:Class="WPF_InkCanvas.MainWindow"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
   xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
   xmlns:local="clr-namespace:WPF_InkCanvas"
   mc:Ignorable="d"
   Title="MainWindow" Height="450" Width="800">
 <Grid>
   <Grid.RowDefinitions>
     <RowDefinition/>
     <RowDefinition Height="auto"/>
     <RowDefinition Height="auto"/>
   </Grid.RowDefinitions>
   <Image Name="imgMeasure" HorizontalAlignment="Center" Stretch="Uniform"/>
   <InkCanvas Name="inkCanvasMeasure" EditingMode="None" Background="Transparent" HorizontalAlignment="Center"
         Width="{Binding ElementName=imgMeasure, Path=ActualWidth}" Height="{Binding ElementName=imgMeasure, Path=ActualHeight}"
         >
     <!--MouseDown="InkCanvasMeasure_MouseDown" MouseMove="InkCanvasMeasure_MouseMove"-->
     <Label Content="{Binding MeaInfo}" Background="Transparent" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="10"
         FontSize="18" Foreground="Red" IsHitTestVisible="False"/>
   </InkCanvas>
   <Grid Grid.Row="1">
     <Grid.ColumnDefinitions>
       <ColumnDefinition/>
       <ColumnDefinition/>
       <ColumnDefinition/>
       <ColumnDefinition/>
       <ColumnDefinition/>
     </Grid.ColumnDefinitions>
     <RadioButton Grid.Column="0" Content="绘制墨迹" Click="RadioButton_Click"/>
     <RadioButton Grid.Column="1" Content="按点擦除" Click="RadioButton_Click"/>
     <RadioButton Grid.Column="2" Content="按线擦除" Click="RadioButton_Click"/>
     <RadioButton Grid.Column="3" Content="选中墨迹" Click="RadioButton_Click"/>
     <RadioButton Grid.Column="4" Content="停止操作" Click="RadioButton_Click"/>
   </Grid>
   <StackPanel Grid.Row="2" Orientation="Horizontal">
     <Button Content="OpenFile" Margin="5" HorizontalAlignment="Left" FontSize="20" Click="OpenFile_Click"/>
     <Button Content="SaveInkCanvas" Margin="5" HorizontalAlignment="Left" FontSize="20" Click="SaveInkCanvas_Click"/>
     <Button Content="LoadInkCanvas" Margin="5" HorizontalAlignment="Left" FontSize="20" Click="LoadInkCanvas_Click"/>
     <Button Content="CopyInkCanvas" Margin="5" HorizontalAlignment="Left" FontSize="20" Click="CopyInkCanvas_Click"/>
     <Button Content="PasteInkCanvas" Margin="5" HorizontalAlignment="Left" FontSize="20" Click="PasteInkCanvas_Click"/>
   </StackPanel>
 </Grid>
</Window>

后台代码


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
{
 /// <summary>
 /// MainWindow.xaml 的交互逻辑
 /// </summary>
 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",不然点击事件就没办法触发了。

来源:https://blog.csdn.net/u012366767/article/details/81265922

标签:WPF,InkCanvas
0
投稿

猜你喜欢

  • 通过springboot+mybatis+druid配置动态数据源

    2023-06-20 16:48:30
  • 详解C#实现MD5加密的示例代码

    2023-11-28 21:01:54
  • Android之FanLayout制作圆弧滑动效果

    2023-01-14 16:58:29
  • 详解Android中的MVP架构分解和实现

    2022-11-30 08:06:29
  • elasticsearch集群发现zendiscovery的Ping机制分析

    2021-05-25 05:40:55
  • C# winform分页查询的实现示例

    2021-12-25 04:56:12
  • java复制文件的4种方式及拷贝文件到另一个目录下的实例代码

    2023-05-15 16:03:25
  • Java中获取泛型类型信息的方法

    2022-06-30 16:06:34
  • Android基于ListView实现类似Market分页加载效果示例

    2021-10-01 10:44:32
  • C#实现图书管理系统

    2023-03-24 04:30:35
  • Android设置Activity背景为透明style的简单方法(必看)

    2021-08-13 14:20:18
  • Android Studio常用快捷键功能说明

    2023-02-20 04:44:17
  • Winform应用程序如何使用自定义的鼠标图片

    2021-07-09 16:01:24
  • C#中加载dll并调用其函数的实现方法

    2022-06-27 17:14:08
  • Android进阶CoordinatorLayout协调者布局实现吸顶效果

    2022-11-04 21:45:48
  • 解析C#彩色图像灰度化算法的实现代码详解

    2022-01-26 07:34:55
  • springboot2中session超时,退到登录页面方式

    2022-12-23 03:30:14
  • Java 实战练手项目之校园超市管理系统的实现流程

    2023-07-09 08:46:55
  • C#利用QrCode.Net生成二维码(Qr码)的方法

    2023-11-30 17:37:38
  • SpringCloud用Zookeeper搭建配置中心的方法

    2022-12-17 18:16:18
  • asp之家 软件编程 m.aspxhome.com