国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > 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#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 鄂州市| 昌都县| 宿迁市| 恭城| 云龙县| 云阳县| 资阳市| 项城市| 鲁山县| 昭通市| 天津市| 江门市| 惠州市| 延安市| 砀山县| 昌图县| 宁安市| 忻州市| 闸北区| 乌恰县| 南丹县| 霍山县| 饶平县| 阳城县| 子洲县| 当雄县| 南皮县| 石台县| 莱州市| 师宗县| 三原县| 达日县| 西盟| 西乡县| 肇庆市| 北宁市| 任丘市| 秭归县| 雅江县| 宜君县| 武义县|