a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C# > 正文

WPF InkCanvas基本操作方法詳解

2019-10-29 19:41:17
字體:
來源:轉載
供稿:網友

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"  <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",      };      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",不然點擊事件就沒辦法觸發了。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 国产精品免费av | 曰逼视频 | 国产精品视频在线观看 | 爱爱视频免费在线观看 | 91啦| 精品国产一区二区三区日日嗨 | 超碰在线网址 | 精品国产乱码久久久久久1区2区 | 日韩精品视频免费 | 欧美日韩亚洲视频 | 亚洲精品视频国产 | 国产在线二区 | 国产成人精品无人区一区 | 久久午夜影院 | 国产精品99久久久久久大便 | 中文字幕第一页在线 | 天堂久久一区 | 亚洲一区二区三区免费视频 | 国产成人精品午夜 | 成人看片在线 | 国产精品一区二区三区免费看 | 欧美在线看片 | 欧美日韩不卡在线 | 国产真实精品久久二三区 | 在线免费观看激情视频 | 日本一区二区不卡视频 | 国产精品欧美日韩 | 国产精品美腿一区在线看 | 精品九九九九 | 操操日| 国产一区二区在线播放 | 精品在线看 | 亚洲精品一区二区三区 | 欧美精品一区二区三区蜜桃视频 | 欧美黄视频在线观看 | a级在线观看免费 | 一级免费黄色免费片 | 久久久美女 | japan国产精选videos| 精品自拍视频 | 色干综合 |