WPF 之 自定义Shape

摘要:
12#Region“X1DependencyProperty”3'''<7PublicSharedReadOnlyX1PropertyAsDependencyProperty=_8DependencyProperty.Register(9“X1”;

AMindMap需要一个Line,用以连接父ANode和子ANode,

简单说,就是一头大一头小的线,Wpf自带的Line是没这个功能。

Path可以画,不过,我的想法仍旧是绑定。那只能自己做咯。

图例

image

正文

既然Line,Rectangle等都是继承自Shape的,直接新建一个类继承自Sharp.

1 Public Class ALine 2 Inherits Shape 3 4 Protected Overrides ReadOnly Property DefiningGeometry As System.Windows.Media.Geometry 5 Get 6 7 End Get 8 End Property 9 End Class 10

继承完Shape,ALine中自动添加了一个需要重写的只读属性,从字面上就可以理解

为自定义shape的内容了。返回一个Geometry,那岂不是嗯嗯嗯?

ALine的属性

一头大一头小的Line也是Line,那就要有两个端点,并且,端点的数值是需要被

绑定的,大声一起说,“DependencyProperty”

1 2 #Region " X1 DependencyProperty " 3 ''' <summary> 4 ''' PropertyComment 5 ''' </summary> 6 ''' <remarks></remarks> 7 Public Shared ReadOnly X1Property As DependencyProperty = _ 8 DependencyProperty.Register( 9 "X1", GetType(Double), GetType(ALine), New FrameworkPropertyMetadata( _ 10 0.0, FrameworkPropertyMetadataOptions.AffectsMeasure)) 11 12 Public Property X1() As Double 13 Get 14 Return GetValue(X1Property) 15 End Get 16 Set(ByVal Value As Double) 17 SetValue(X1Property, Value) 18 End Set 19 End Property 20 #End Region 21 22 #Region " Y1 DependencyProperty " 23 ''' <summary> 24 ''' PropertyComment 25 ''' </summary> 26 ''' <remarks></remarks> 27 Public Shared ReadOnly Y1Property As DependencyProperty = _ 28 DependencyProperty.Register( 29 "Y1", GetType(Double), GetType(ALine), New FrameworkPropertyMetadata( _ 30 0.0, FrameworkPropertyMetadataOptions.AffectsMeasure)) 31 32 Public Property Y1() As Double 33 Get 34 Return GetValue(Y1Property) 35 End Get 36 Set(ByVal Value As Double) 37 SetValue(Y1Property, Value) 38 End Set 39 End Property 40 41 #End Region 42 43 #Region " X2 DependencyProperty " 44 ''' <summary> 45 ''' PropertyComment 46 ''' </summary> 47 ''' <remarks></remarks> 48 Public Shared ReadOnly X2Property As DependencyProperty = _ 49 DependencyProperty.Register( 50 "X2", GetType(Double), GetType(ALine), New FrameworkPropertyMetadata( _ 51 0.0, FrameworkPropertyMetadataOptions.AffectsMeasure)) 52 53 Public Property X2() As Double 54 Get 55 Return GetValue(X2Property) 56 End Get 57 Set(ByVal Value As Double) 58 SetValue(X2Property, Value) 59 End Set 60 End Property 61 62 #End Region 63 64 #Region " Y2 DependencyProperty " 65 ''' <summary> 66 ''' PropertyComment 67 ''' </summary> 68 ''' <remarks></remarks> 69 Public Shared ReadOnly Y2Property As DependencyProperty = _ 70 DependencyProperty.Register( 71 "Y2", GetType(Double), GetType(ALine), New FrameworkPropertyMetadata( _ 72 0.0, FrameworkPropertyMetadataOptions.AffectsMeasure)) 73 74 Public Property Y2() As Double 75 Get 76 Return GetValue(Y2Property) 77 End Get 78 Set(ByVal Value As Double) 79 SetValue(Y2Property, Value) 80 End Set 81 End Property 82 83 #End Region 84 85 #Region " TailWidth DependencyProperty " 86 ''' <summary> 87 ''' PropertyComment 88 ''' </summary> 89 ''' <remarks></remarks> 90 Public Shared ReadOnly TailWidthProperty As DependencyProperty = _ 91 DependencyProperty.Register( 92 "TailWidth", GetType(Double), GetType(ALine), New FrameworkPropertyMetadata( _ 93 3.0, FrameworkPropertyMetadataOptions.AffectsMeasure)) 94 Public Property TailWidth() As Double 95 Get 96 Return GetValue(TailWidthProperty) 97 End Get 98 Set(ByVal Value As Double) 99 SetValue(TailWidthProperty, Value) 100 End Set 101 End Property 102 103 #End Region

这里定义了X1,Y1,X2,Y2,TailWidth,这些属性足够说明,线的位置和尾部粗细。

ALine的内容

一个楔形是怎么画的呢?这只是一个几何问题,还是画一张图说明吧。

image

Sorry哈,反正就是Atan,sin,cos一通算,画图太费劲了,我就歇了哈。

代码 强制重载的DefiningGeometry
1 2 Protected Overrides ReadOnly Property DefiningGeometry As System.Windows.Media.Geometry 3 Get 4 Dim mGeometry As New StreamGeometry 5 mGeometry.FillRule = FillRule.EvenOdd 6 7 Using context As StreamGeometryContext = mGeometry.Open 8 DrawLineGeometry(context) 9 End Using 10 mGeometry.Freeze() 11 Return mGeometry 12 End Get 13 End Property 14 15 Private Sub DrawLineGeometry(ByVal context As StreamGeometryContext) 16 Dim theta As Double = Math.Atan2(Y1 - Y2, X1 - X2) 17 Dim sint As Double = Math.Sin(theta) 18 Dim cost As Double = Math.Cos(theta) 19 Dim pt1 As Point = New Point(X2, Y2) 20 Dim pt2 As Point = New Point(X1 - TailWidth * sint, Y1 + TailWidth * cost) 21 Dim pt3 As Point = New Point(X1 + TailWidth * sint, Y1 - TailWidth * cost) 22 context.BeginFigure(pt1, True, True) 23 context.LineTo(pt2, True, True) 24 context.LineTo(pt3, True, True) 25 End Sub
实例

在一个空白窗口中,像使用Line一样。

1 <local:ALine X1="10" Y1="10" X2="100" Y2="100" TailWidth="10" 2 Fill="LightBlue" 3 Canvas.Left="93" Canvas.Top="76" 4 > 5 </local:ALine>

就这个效果

image

我不得不说,这个思路是在网上找到的,既然找到了,给大家分享一下,是一件好事儿。

免责声明:文章转载自《WPF 之 自定义Shape》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Centos7 使用ssh进行x11图形界面转发inline-block元素水平居中问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Oracle字段转字符串/多行记录合并/连接/聚合字符串的几种方法

原文:http://czjxdm.iteye.com/blog/466948 Oracle字段转字符串/多行记录合并/连接/聚合字符串的几种方法 博客分类:技术文章 OracleSQL  怎么合并多行记录的字符串,一直是oracle新手喜欢问的SQL问题之一,关于这个问题的帖子我看过不下30个了,现在就对这个问题,进行一个总结。    什么是合并多...

CKEditor扩展插件:自动排版功能

CKEditor是新一代的FCKeditor,是一个重新开发的版本。CKEditor是全球最优秀的网页在线文字编辑器之一,因其惊人的性能与可扩展性而广泛的被运用于各大网站。 如果还没接触过的可以看看,在线演示地址:http://ckeditor.com/demo 当然了,今天我们的主要目的还不是介绍。 还未下载CKEditor的同学可以点击下载:http:...

highcharts图表

<!--图表例子--> <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Highcharts Example...

前端通信、跨域

首先了解什么是同源策略: 限制一个源加载的文档或脚本与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的关键的安全机制。(来自MDN的解释) 源包括三个部分:协议、域名、端口(HTTP协议的默认端口是80)。如果其中有任何一个部分不同,则源不同。即为跨域。 限制:这个源的文档没有权利去操作另一个源的文档。这个限制体现在: Cookie、Llocal...

解决JS文件页面加载时的阻塞

关于页面加载时的时间消费,许多书中都做出了介绍,也提出了很多种方法。本文章就详细介绍XHR注入。 概述:JS分拆的方法 1.XHR注入:就是用ajax异步请求同域包含脚本的文件,然后将返回的字符串转化为脚本使用,该方法不会造成页面渲染和onload事件的阻塞,因为是异步处理,推荐使用。 2.iframe注入:加载一个iframe框架,通过使用iframe框...

关于Gradle配置的小结

前言 使用 Android Studio 来开发 Android 工程的过程中,接触 Gradle 是不可避免的,比如配置签名、引入依赖等。那么 Gradle 到底是什么东西呢? Gradle 是一个基于 Apache Ant 和 Apache Maven 概念的项目自动化建构工具。它使用一种基于 Groovy 的特定领域语言 (DSL) 来声明项目...