一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - C# - WPF InkCanvas繪制矩形和橢圓

WPF InkCanvas繪制矩形和橢圓

2022-03-06 13:24有個家伙喜歡代碼 C#

這篇文章主要為大家詳細(xì)介紹了WPF InkCanvas繪制矩形和橢圓,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

前面說到了inkcanvas的基本操作,這里用一個實(shí)例來說明具體應(yīng)用:繪制矩形和橢圓。

效果圖

WPF InkCanvas繪制矩形和橢圓

xaml代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<window x:class="wpf_inkcanvas.roi_inkcanvas"
    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"
    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>

后臺代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
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代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
using system;
using system.collections.generic;
using system.componentmodel;
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");
      }
    }
  }
}

補(bǔ)充說明:為什么要注釋掉畫筆屬性//fittocurve = true,可以自行體會下不注釋會是個什么效果;將inkcanvas的strokes綁定到變量有好處,在別的窗口也能獲取到這個對象的哦,因?yàn)樗窃趘iewmodel里的,傳viewmodel參數(shù)就可以了;橢圓繪制完成后設(shè)置inkcanvas的edittingmode為select就可以修改大小和形狀。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚1洲二区三区四区免费 | 国产1区精品 | 免费看一级a一片毛片 | 亚洲AV无码专区国产精品麻豆 | 交换性关系中文字幕6 | 四虎成人免费视频 | 91天堂在线视频 | 国产成人精品999在线 | 肥胖女人一级毛片 | 天堂精品高清1区2区3区 | 99久久精品免费看国产 | 日韩毛片免费 | 国产成人青草视频 | 91精品国产品国语在线不卡 | 色婷在线 | 欧美日韩精品一区二区三区视频播放 | 40分钟在线观看免费 | 羞羞色男人的天堂伊人久久 | 日本三级香港三级久久99 | 欧乱色国产精品兔费视频 | 国产欧美一区二区三区久久 | 毛片网站大全 | 成人看的羞羞视频免费观看 | 国产成人精品实拍在线 | 香蕉免费一区二区三区 | 日本 视频 在线 | 婚前试爱免费观看 | 车上小婕子系列辣文小说 | 亚洲乱码尤物193yw在线播放 | 97porm国内自拍视频 | 国产福利一区二区精品视频 | 国产高清视频免费最新在线 | 性做久久久久免费观看 | 多人群p全肉小说 | 亚洲第一综合天堂另类专 | 大又大又黄又爽免费毛片 | 天天操天天干天天舔 | 国产啪精品视频网给免丝袜 | 青草园网站在线观看 | 男男双性生子产乳高辣h | 天堂激情网 |