麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > 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#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 在线免费观看欧美 | 亚洲九九色 | 日韩视频www | lutube成人福利在线观看污 | 久久久久久久久久91 | 爱看久久| 日韩精品中文字幕在线播放 | 国产美女精品视频 | av之家在线观看 | 黄色电影免费网址 | 日本看片一区二区三区高清 | 一级毛片真人免费播放视频 | 亚洲精品成人久久 | 日韩理论电影网 | 亚洲成人在线免费观看 | 国产精品久久久久久久久久 | 免费的性生活视频 | 狠狠久久伊人中文字幕 | 午夜视频久久久 | 亚洲成在人 | 日本中文字幕高清 | 丰满年轻岳中文字幕一区二区 | 国内精品久久久久久久久久久久 | 精品一区二区三区日本 | 国产精品野外av久久久 | 哪里可以看免费的av | 成年人黄色免费电影 | 91久久国产综合精品女同国语 | 亚洲一区二区不卡视频 | 看av网址 | 日韩黄色片免费看 | 久久免费视频一区二区三区 | 法国极品成人h版 | 一级免费 | 久久国产亚洲视频 | 久草在线高清 | 欧美激情精品久久久久久久久久 | 强伦女教师视频 | 性盈盈盈影院 | 久久精品亚洲一区二区三区观看模式 | 精品国产一区二区三区久久久 |