亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > 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久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲女人被黑人巨大进入al| 久久精品亚洲精品| 欧美性猛交丰臀xxxxx网站| 一区二区在线视频播放| 欧美大码xxxx| 日韩有码片在线观看| 亚洲国产天堂久久综合| 美女999久久久精品视频| 日韩欧美在线视频观看| 深夜成人在线观看| 成人精品网站在线观看| 成人欧美一区二区三区在线| 黑人欧美xxxx| 97av在线视频免费播放| 久久人91精品久久久久久不卡| 亚洲欧美日韩一区在线| 亚洲成人黄色网址| yellow中文字幕久久| 亚洲国产天堂网精品网站| 欧美在线xxx| 精品高清美女精品国产区| 国产一区二区三区视频在线观看| 亚洲美女免费精品视频在线观看| 午夜精品国产精品大乳美女| 日韩黄在线观看| 久久精品国产2020观看福利| 韩曰欧美视频免费观看| 日韩免费精品视频| 欧美日韩国内自拍| 在线观看精品自拍私拍| 欧美性资源免费| 精品久久久一区| 久久久这里只有精品视频| 国产精品久久91| 久久久在线免费观看| 久热精品视频在线观看一区| 精品日本美女福利在线观看| 136fldh精品导航福利| 日韩视频免费看| 欧美成人免费网| 亚洲国产一区二区三区四区| 国产精品一区二区三区在线播放| 久久国产一区二区三区| 欧美极品少妇与黑人| 亚洲精品小视频在线观看| 亚洲欧美色图片| 欧美激情videos| 精品久久久久久中文字幕一区奶水| 国产深夜精品福利| 性金发美女69hd大尺寸| 精品国内产的精品视频在线观看| 在线观看中文字幕亚洲| 97精品国产91久久久久久| 91高清免费视频| 亚洲色图偷窥自拍| 亚洲天堂av在线免费观看| 亚洲日韩欧美视频| 亚洲伊人一本大道中文字幕| 人人做人人澡人人爽欧美| 日韩视频在线观看免费| 国产精品久久久久高潮| 日韩美女免费视频| 欧美激情极品视频| 亚洲成人久久久| 色阁综合伊人av| 欧美一性一乱一交一视频| 亚洲精品99999| 日本成人在线视频网址| 日韩在线视频导航| 一区二区亚洲精品国产| 久久精品国产一区二区三区| 91夜夜揉人人捏人人添红杏| 亚洲一区二区日本| 国产精品美女久久久免费| 久久久久久久一区二区| 两个人的视频www国产精品| 亚洲国产精品久久久久秋霞不卡| 日韩在线观看免费av| 97精品久久久中文字幕免费| 亚洲色图av在线| 欧美日韩裸体免费视频| 日韩在线播放av| 岛国av一区二区在线在线观看| 69久久夜色精品国产7777| 久久全球大尺度高清视频| 日韩av在线精品| 国产精品三级在线| 国产精品va在线播放我和闺蜜| 中文字幕亚洲无线码a| 深夜福利一区二区| 91视频免费在线| 精品视频—区二区三区免费| 亚洲视频axxx| 国产精品女人久久久久久| 亚洲图片欧美日产| 国产精品久久久久久久久粉嫩av| 亚洲成**性毛茸茸| 亚洲精品wwww| 亚洲色图校园春色| 亚洲免费精彩视频| 亚洲国产日韩欧美在线动漫| 日韩精品中文字幕在线| 日韩国产高清视频在线| 97香蕉超级碰碰久久免费软件| 夜夜嗨av色综合久久久综合网| 日韩电影第一页| 欧美精品第一页在线播放| 国产精品久久婷婷六月丁香| 97国产精品视频人人做人人爱| 欧美性极品xxxx娇小| 亚洲激情视频在线播放| 午夜伦理精品一区| 精品日韩视频在线观看| 久久久久久久国产| 国产欧美在线播放| 中文字幕欧美精品日韩中文字幕| 亚洲va欧美va国产综合久久| 日韩电影中文字幕一区| 最近2019中文字幕一页二页| 精品久久久久久久久久| 91在线观看免费高清| 欧美精品激情blacked18| 伊是香蕉大人久久| 18性欧美xxxⅹ性满足| 亚洲影视中文字幕| 国产欧美日韩中文| 91视频国产一区| 一本一本久久a久久精品综合小说| 国产日韩欧美电影在线观看| 国产精品极品尤物在线观看| 国产精品盗摄久久久| 96国产粉嫩美女| 在线播放国产一区中文字幕剧情欧美| 欧美在线观看日本一区| 操91在线视频| 亚洲国产日韩欧美在线动漫| 亲子乱一区二区三区电影| 日韩美女写真福利在线观看| 91久久久久久国产精品| 中文字幕一区二区精品| 成人国内精品久久久久一区| 亚洲嫩模很污视频| 中文字幕亚洲无线码在线一区| 裸体女人亚洲精品一区| 精品国产一区二区三区久久久| 最近2019年中文视频免费在线观看| 日本精品性网站在线观看| 日本国产欧美一区二区三区| 久久成人av网站| 国产女人18毛片水18精品| 91中文在线观看| 国产成人97精品免费看片| 国产欧美日韩91| 日本精品免费观看| 日韩成人在线电影网| 91精品久久久久久久久中文字幕| 91在线观看免费高清| 国产精品日韩精品| 久久影院中文字幕| 中文字幕日韩欧美精品在线观看| 欧美高清在线播放| 国产亚洲精品va在线观看| 亚洲free嫩bbb| 亚洲第一网站免费视频|