好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

WPF InkCanvas绘制矩形和椭圆

前面说到了inkcanvas的基本操作,这里用一个实例来说明具体应用:绘制矩形和椭圆。

效果图

xaml代码

?

< window x:class = "wpf_inkcanvas.roi_inkcanvas"

     xmlns = "http://schemas.microsoft测试数据/winfx/2006/xaml/presentation"

     xmlns:x = "http://schemas.microsoft测试数据/winfx/2006/xaml"

     xmlns:d = "http://schemas.microsoft测试数据/expression/blend/2008"

     xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"

     xmlns:local = "clr-namespace:wpf_inkcanvas"

     mc:ignorable = "d"

     title = "roi_inkcanvas" height = "450" width = "800" >

   < grid >

     < grid.rowdefinitions >

       < rowdefinition />

       < rowdefinition height = "auto" />

     </ grid.rowdefinitions >

     < image name = "imgmeasure" horizontalalignment = "center" stretch = "uniform" />

     < inkcanvas name = "inkcanvasmeasure" editingmode = "none" background = "transparent" strokes = "{binding inkstrokes, mode=twoway}" 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 >

     < stackpanel grid.row = "1" orientation = "horizontal" >

       < button content = "openfile" margin = "5" horizontalalignment = "left" fontsize = "20" click = "openfile_click" />

       < togglebutton name = "btnsquare" content = "draw square" margin = "5" horizontalalignment = "left" fontsize = "20" click = "drawsquare_click" />

       < togglebutton name = "btnellipse" content = "draw ellipse" margin = "5" horizontalalignment = "left" fontsize = "20" click = "drawellipse_click" />

     </ stackpanel >

   </ grid >

</ window >

后台代码

?

using microsoft.win32;

using system;

using system.collections.generic;

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.shapes;

 

namespace wpf_inkcanvas

{

   /// <summary>

   /// roi_inkcanvas.xaml 的交互逻辑

   /// </summary>

   public partial class roi_inkcanvas : window

   {

     private viewmodel viewmodel;

     private system.windows.point inip;

     public roi_inkcanvas()

     {

       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 = "测试······" ,

         inkstrokes = new strokecollection(),

       };

 

       datacontext = viewmodel;

     }

 

     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 drawsquare_click( object sender, routedeventargs e)

     {

       if (btnsquare.ischecked == true )

       {

         btnellipse.ischecked = false ;

       }

     }

 

     private void drawellipse_click( object sender, routedeventargs e)

     {

       if (btnellipse.ischecked == true )

       {

         btnsquare.ischecked = false ;

       }

     }

 

     private list<system.windows.point> generateeclipsegeometry(system.windows.point st, system.windows.point ed)

     {

       double a = 0.5 * (ed.x - st.x);

       double b = 0.5 * (ed.y - st.y);

       list<system.windows.point> pointlist = new list<system.windows.point>();

       for ( double r = 0; r <= 2 * math.pi; r = r + 0.01)

       {

         pointlist.add( new system.windows.point(0.5 * (st.x + ed.x) + a * math.cos(r), 0.5 * (st.y + ed.y) + b * math.sin(r)));

       }

       return pointlist;

     }

     private void inkcanvasmeasure_mousedown( object sender, mousebuttoneventargs e)

     {

       if (e.leftbutton == mousebuttonstate.pressed)

       {

         inip = e.getposition(inkcanvasmeasure);

       }

     }

 

     private void inkcanvasmeasure_mousemove( object sender, mouseeventargs e)

     {

       if (e.leftbutton == mousebuttonstate.pressed)

       {

         // draw square

         if (btnsquare.ischecked == true )

         {

           system.windows.point endp = e.getposition(inkcanvasmeasure);

           list<system.windows.point> pointlist = new list<system.windows.point>

           {

             new system.windows.point(inip.x, inip.y),

             new system.windows.point(inip.x, endp.y),

             new system.windows.point(endp.x, endp.y),

             new system.windows.point(endp.x, inip.y),

             new system.windows.point(inip.x, inip.y),

           };

           styluspointcollection point = new styluspointcollection(pointlist);

           stroke stroke = new stroke(point)

           {

             drawingattributes = inkcanvasmeasure.defaultdrawingattributes.clone()

           };

           viewmodel.inkstrokes.clear();

           viewmodel.inkstrokes.add(stroke);

         }

         // draw eclipse

         else if (btnellipse.ischecked == true )

         {

           system.windows.point endp = e.getposition(inkcanvasmeasure);

           list<system.windows.point> pointlist = generateeclipsegeometry(inip, endp);

           styluspointcollection point = new styluspointcollection(pointlist);

           stroke stroke = new stroke(point)

           {

             drawingattributes = inkcanvasmeasure.defaultdrawingattributes.clone()

           };

           viewmodel.inkstrokes.clear();

           viewmodel.inkstrokes.add(stroke);

         }

       }

     }

   }

}

viewmodel.cs代码

?

using system;

using system.collections.generic;

using system测试数据ponentmodel;

using system.linq;

using system.text;

using system.threading.tasks;

using system.windows.ink;

 

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" );

       }

     }

 

     private strokecollection inkstrokes;

     public strokecollection inkstrokes

     {

       get { return inkstrokes; }

       set

       {

         inkstrokes = value;

         onpropertychanged( "inkstrokes" );

       }

     }

   }

}

补充说明: 为什么要注释掉画笔属性//fittocurve = true,可以自行体会下不注释会是个什么效果;将inkcanvas的strokes绑定到变量有好处,在别的窗口也能获取到这个对象的哦,因为它是在viewmodel里的,传viewmodel参数就可以了;椭圆绘制完成后设置inkcanvas的edittingmode为select就可以修改大小和形状。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/u012366767/article/details/81266406

dy("nrwz");

查看更多关于WPF InkCanvas绘制矩形和椭圆的详细内容...

  阅读:44次