原文:Silverlight中的Path

在Silverlight中Path可能由直线、曲线、或者其他简单的图形对象组成。这篇文章旨在介绍如何使用XAML和C#来创建Path.

废话先行

Path可能由直线、曲线、简单图形对象(包括矩形、椭圆、和文本)组成。Path作为一个独立的图形对象来工作,所以对Path进行的操作,会影响到组成它的所有部分。例如,假设一个Path由一个直线、矩形和椭圆组成,我们通过红色画笔来创建Path,那么组成Path的部分(直线、矩形和椭圆)都将会使用红色画笔。

一个Path对象代表一个Path形状并绘制出该Path.Path可以是封闭式和开放式两种。封闭式Path有相同的起点和终点,开放式Path则会有不同的起点和终点。

如下代码:

 <Path Stroke="Black" StrokeThickness="4"  Data="M 80,200 A 100,50 45 1 0 100,50" />

Stroke属性设置Path线的颜色、StrokeThickness为线的宽度。Data属性可以定义一个图形、或者利用GeometryGroup来定义多个对象。

上述代码输出如下:

Path 基础语法

 <Path Stroke="Black" StrokeThickness="4"  Data="M 80,200 A 100,50 45 1 0 100,50" />

这里对Data做一下简单的解释,Silverlight提供了一种称之为“迷你语言”的属性句法,来描述如何画出轨迹形状,包括M(移动命令,起始点)、L(直线,结束点)、H(水平线)、V(垂直线)、C(三次贝塞尔曲线)、Q(两次贝塞尔曲线)、A(椭圆弧曲线)、Z(结束命令),具体大家可以参考MSDN。

一、在Path中使用Silverlight中的图形

LineGeometry代表一个Line图形,它定义的StartPoint和EndPoint属性,分别代表Line的起点和终点。下面代码创建一个LineGeometry

 <LineGeometry StartPoint="20,200" EndPoint="300,200" />

RectangleGeometry代表一个矩形图形。属性Rect中分别定义开始的点,和矩形的宽度和高度。下面代码创建一个RectangleGeometry

 <RectangleGeometry Rect="80,167 150 30"/>

EllipseGeometry 代表一个椭圆图形。属性Center定义了椭圆的中心点,RadiusX和RadiusY分别定义了椭圆的宽和高。

 <EllipseGeometry Center="80,150" RadiusX="50" RadiusY="50" />

GeometryGroup通过把上述标签组合起来,来创建一个复杂几何图形。下面代码就是通过GeometryGroup把上面三个标签组合起来,并放到Path.Data中。

        <Path Stroke="Black" StrokeThickness="3" Fill="Blue" >
            <Path.Data>
                <GeometryGroup >
                    <LineGeometry StartPoint="20,200" EndPoint="300,200" />
                    <EllipseGeometry Center="80,150" RadiusX="50" RadiusY="50" />
                    <RectangleGeometry Rect="80,167 150 30"/>
                </GeometryGroup>
            </Path.Data>
        </Path>

输出如下:

 

GeometryGroup 的FillRule属性指定了在GeometryGroup中交叉部分的状态。有两种状态值,EvenOdd和ZonZero。默认为EvenOdd,交叉部分不填充,如果设置成NonZero则交叉部分填充(下图为FillRule设置成NonZero的状态)。

二、动态创建Path

下面代码为在cs代码中动态创建Path的代码,很简单不解释。

        public void CreateAPath()
        {
            // Create a blue and a black Brush
            SolidColorBrush blueBrush = new SolidColorBrush();
            blueBrush.Color = Colors.Blue;
            SolidColorBrush blackBrush = new SolidColorBrush();
            blackBrush.Color = Colors.Black;
            // Create a Path with black brush and blue fill
            Path bluePath = new Path();
            bluePath.Stroke = blackBrush;
            bluePath.StrokeThickness = 3;
            bluePath.Fill = blueBrush;
            // Create a line geometry
            LineGeometry blackLineGeometry = new LineGeometry();
            blackLineGeometry.StartPoint = new Point(20, 200);
            blackLineGeometry.EndPoint = new Point(300, 200);
            // Create an ellipse geometry 
            EllipseGeometry blackEllipseGeometry = new EllipseGeometry();
            blackEllipseGeometry.Center = new Point(80, 150);
            blackEllipseGeometry.RadiusX = 50;
            blackEllipseGeometry.RadiusY = 50;
            // Create a rectangle geometry 
            RectangleGeometry blackRectGeometry = new RectangleGeometry();
            Rect rct = new Rect();
            rct.X = 80;
            rct.Y = 167;
            rct.Width = 150;
            rct.Height = 30;
            blackRectGeometry.Rect = rct;
            // Add all the geometries to a GeometryGroup.
            GeometryGroup blueGeometryGroup = new GeometryGroup();
            blueGeometryGroup.Children.Add(blackLineGeometry);
            blueGeometryGroup.Children.Add(blackEllipseGeometry);
            blueGeometryGroup.Children.Add(blackRectGeometry);
            // Set Path.Data
            bluePath.Data = blueGeometryGroup;
            LayoutRoot.Children.Add(bluePath);
        }
 

如果Path只有一个图形则不需要用GeometryGroup。直接设置Path的Data就行,Like thisO(∩_∩)O~:

        <Path Stroke="Black" StrokeThickness="3" Fill="Blue" >
            <Path.Data>
                <EllipseGeometry Center="80,150" RadiusX="50" RadiusY="50" />
            </Path.Data>
        </Path>

三、格式化Path

可以使用Path的Fill属性来填充Path,Fill属性值可以为任意的画刷(solid brush, linear gradient brush, radial gradient brush, image brush),例如:

        <Path Stroke="Black" StrokeThickness="3"  >
            <Path.Data>
                <GeometryGroup >
                    <LineGeometry StartPoint="20,200" EndPoint="300,200" />
                    <EllipseGeometry Center="80,150" RadiusX="50" RadiusY="50" />
                    <RectangleGeometry Rect="80,167 150 30"/>
                </GeometryGroup>
            </Path.Data>
            <Path.Fill>
                <LinearGradientBrush StartPoint="0,0" EndPoint="1,1" >
                    <GradientStop Color="Blue" Offset="0.25" />
                    <GradientStop Color="Orange" Offset="0.50" />
                    <GradientStop Color="Green" Offset="0.65" />
                    <GradientStop Color="Red" Offset="0.80" />
                </LinearGradientBrush>
            </Path.Fill>
        </Path>


输出如下图形:

四、使用图形画刷来填充Path的背景

直接看范例:

            <Path.Fill >
                <ImageBrush ImageSource="dock.jpg" />
            </Path.Fill >

五、半透明的 Path

Opacity属性和其它的一样,范围0-1,1为不透明,0为全部透明。

        <Path Stroke="Black" StrokeThickness="3"  Opacity="0.5" >
            <Path.Data>
                <GeometryGroup >
                    <LineGeometry StartPoint="20,200" EndPoint="300,200" />
                    <EllipseGeometry Center="80,150" RadiusX="50" RadiusY="50" />
                    <RectangleGeometry Rect="80,167 150 30"/>
                </GeometryGroup>
            </Path.Data>
            <Path.Fill >
                <ImageBrush ImageSource="dock.jpg" />
            </Path.Fill >
        </Path>

效果如下:

总结:

在这篇文章中,我讨论了如何在design_time使用XAML和在run_time通过C#来创建Path。我们也知道了如何通过通过Fill属性来格式化Path。最后我们知道了如何给Path设置背景颜色和透明度。

Silverlight中的Path的更多相关文章

  1. Silverlight中的TabControl如何绑定数据?重写tabcontrol和tabItem 解决绑定友好问题。可以绑定对象集合

    在 WPF 中,TabControl 可以直接将 ItemsSource 绑定数据源,见 将 TabControl 绑定到数据的示例 http://msdn.microsoft.com/zh-cn/l ...

  2. Silverlight实用窍门系列:47.Silverlight中元素到元素的绑定,以及ObservableCollection和List的使用区别

    问题一:在某一些情况下,我们使用MVVM模式的时候,对于某一个字段(AgeField)需要在前台的很多个控件(A.B.C.D.E)进行绑定,但是如何能够让我们后台字段名改变的时候能够非常方便的改变所有 ...

  3. Silverlight 中 TreeView 的数据绑定

    方法一:Silverlight使用XAML标记语言来编写,如果不使用XAML强大的绑定功能,实在是罪过.通过使用绑定,可以将UI与视图模型层分离,有利于系统的维护.作为Silverlight中比较有代 ...

  4. Silverlight中使用MVVM(1)--基础

    Silverlight中使用MVVM(1)--基础 Silverlight中使用MVVM(2)—提高 Silverlight中使用MVVM(3)—进阶 Silverlight中使用MVVM(4)—演练 ...

  5. Silverlight实用窍门系列:57.Silverlight中的Binding使用(二)-数据验证

    本文将简单讲述Silverlight中的Binding数据时的数据验证. NotifyOnValidationError:是否在出现异常/错误信息的时候激发BindingValidationError ...

  6. Silverlight中使用MVVM(1)

    Silverlight中使用MVVM(1)   Silverlight中使用MVVM(1)--基础 Silverlight中使用MVVM(2)—提高 Silverlight中使用MVVM(3)—进阶 ...

  7. java项目中build path的设置

    右键点击项目新建文件libs 添加jtds  jar包引用本地动态链接库(dll)的设置方法 配置LibraryJRE的添加和更换  Java项目中build path的设置总结,包括JRE的添加和更 ...

  8. Silverlight中文本框添加回车事件后,换行无法清除的解决方法

    在开发Silverlight的项目中,为了更好的用户体验,我们常要给一些控件添加一些快捷键.然而,在Silverlight中当用户回车提交后,光标停留在文本框的第二行怎么也清除不掉,经过一段时间研究, ...

  9. SharePoint 2013 Silverlight中使用Net客户端对象模型

    1.创建Silverlight时,选择Silverlight 4,不要选择版本5,试了很久版本5都调用不了,自己也不知道什么原因,谷歌也没找到答案,后来尝试版本4,可以调用: 至于Host the S ...

随机推荐

  1. OAuth做webapi认证

    OAuth做webapi认证 看到园子里面有人写的OAuth,就想把自己实现的OAuth也分享一下,关于OAuth协议这里就不再赘述. 一.作为认证服务器,首先需要提供一个可以通过appid/apps ...

  2. 【转】Android HTTP协议

    前言 说到HTTP协议,那必须要说说WWW了,WWW是环球信息网(World Wide Web )的缩写,也可以简称为Web,中文名字为“万维网”.简单来说,WWW是以Internet作为传输媒介的一 ...

  3. (hdu step 6.3.7)Cat vs. Dog(当施工方规则:建边当观众和其他观众最喜爱的东西冲突,求最大独立集)

    称号: Cat vs. Dog Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...

  4. MVC5个人用户账户身份验证集成google和facebook的OAuth2登陆

    最终效果 官方文档:MVC 5 App with Facebook, Twitter, LinkedIn and Google OAuth2 Sign-on 内容简介:上面传送门的博客中讲解了如何在M ...

  5. SQL Server 优化存储过程的七种方法

    原文:SQL Server 优化存储过程的七种方法 优化存储过程有很多种方法,下面介绍最常用的7种. 1.使用SET NOCOUNT ON选项 我们使用SELECT语句时,除了返回对应的结果集外,还会 ...

  6. SQL开发中容易忽视的一些小地方(一)

    原文:SQL开发中容易忽视的一些小地方(一) 写此系列文章缘由: 做开发三年来(B/S),发现基于web 架构的项目技术主要分两大方面: 第一:C#,它是程序的基础,也可是其它开发语言,没有开发语言也 ...

  7. SQL开发中容易忽视的一些小地方(二)

    原文:SQL开发中容易忽视的一些小地方(二) 目的:继上一篇:SQL开发中容易忽视的一些小地方(一) 总结SQL中的null用法后,本文我将说说表联接查询. 为了说明问题,我创建了两个表,分别是学生信 ...

  8. java 正则表达式提取html纯文本

    本文来自我的个人博客: java 正则表达式提取html纯文本 做内容的大家都知道,从html中直接提取纯文本是一个非常大的问题.现将我做的正则匹配贴上: import java.util.regex ...

  9. 无插件,直接加参数,chrome它可以模拟手机浏览器

    在目标出现,加上一些参数即可:--user-agent="mozilla/5.0 (linux; u; android 2.3.3; en-us; sdk build/ gri34) app ...

  10. 一个由proguard与fastJson引起的血案(转)

    更新微信sdk导致ComposeData中的内部类ComposeDataSender方法被混淆 根本原因,fastjson使用姿势不对. 问题描述: 一个发件人列表里,应当呈现的数据(这里命名为Com ...