Silverlight并没有象flash那样直接提供画线、画圆、画曲线的方法,只能用Path来生成贝塞尔曲线。

下面是示例代码:

XAML部分:

<UserControl x:Class="SLCurveSample.MainPage"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"mc:Ignorable="d"d:DesignHeight="400" d:DesignWidth="400"><Canvas x:Name="LayoutRoot" Background="White"><Ellipse Width="10" Height="10" StrokeThickness="1" Stroke="Red" x:Name="point1"></Ellipse><TextBlock Text="Left Point" Name="tbLeftPoint" Visibility="Collapsed"></TextBlock><Ellipse Width="10" Height="10" StrokeThickness="1" Stroke="Red" x:Name="point2"></Ellipse><TextBlock Text="Right Point" Name="tbRightPoint" Visibility="Collapsed"></TextBlock><Path Stroke="Red" StrokeThickness="1" x:Name="p" ><Path.Data><PathGeometry><PathGeometry.Figures><PathFigure><PathFigure.Segments><BezierSegment />                              </PathFigure.Segments></PathFigure></PathGeometry.Figures></PathGeometry></Path.Data></Path></Canvas>
</UserControl>

Xaml.cs部分:

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;namespace SLCurveSample
{public partial class MainPage : UserControl{Point _leftPoint = new Point();Point _rightPoint = new Point();BezierSegment seg = null;public MainPage(){InitializeComponent();this.Loaded += PageLoaded;}void PageLoaded(object sender, RoutedEventArgs e){this.SizeChanged += PageSizeChanged;this.MouseMove += PageMouseMove;this.Loaded -= PageLoaded;}void PageMouseMove(object sender, MouseEventArgs e){Point mousePos = e.GetPosition(this);//根据鼠标的位置对线条粗细、左右圈圈大小做一些交互double scale = Math.Abs(_leftPoint.Y - mousePos.Y) / _leftPoint.Y;point1.Width = point1.Height = 10 + 40 * scale;point2.Width = point2.Height = point1.Width;p.StrokeThickness = 3 - 2 * scale;//重绘Draw();//计算二个控制点的位置Point ctlPoint1 = new Point() { X = (mousePos.X + _leftPoint.X) * 0.5, Y = (mousePos.Y + _leftPoint.Y) * 0.5 };Point ctlPoint2 = new Point() { X = (mousePos.X + _rightPoint.X) * 0.5, Y = (mousePos.Y + _rightPoint.Y) * 0.5 };if (seg != null){seg.Point1 = ctlPoint1;//贝兹曲线的第一个控制点seg.Point2 = ctlPoint2;//贝兹曲线的第二个控制点}}void PageSizeChanged(object sender, SizeChangedEventArgs e){Draw();}void Draw(){double _stageWidth = this.ActualWidth;double _stageHeight = this.ActualHeight;double _margin = 80;//将二个小圈定位于左右二侧point1.SetValue(Canvas.TopProperty, _stageHeight * 0.5);point1.SetValue(Canvas.LeftProperty, _margin);point2.SetValue(Canvas.TopProperty, _stageHeight * 0.5);point2.SetValue(Canvas.LeftProperty, _stageWidth - _margin);//计算左侧小圈的中心_leftPoint.X = (double)point1.GetValue(Canvas.LeftProperty) + point1.Width * 0.5;_leftPoint.Y = (double)point1.GetValue(Canvas.TopProperty) + point1.Height * 0.5;tbLeftPoint.SetValue(Canvas.LeftProperty, _leftPoint.X - 20);tbLeftPoint.SetValue(Canvas.TopProperty, _leftPoint.Y + 10);//计算右侧小圈的中心_rightPoint.X = (double)point2.GetValue(Canvas.LeftProperty) + point2.Width * 0.5;_rightPoint.Y = (double)point2.GetValue(Canvas.TopProperty) + point2.Height * 0.5;tbRightPoint.SetValue(Canvas.LeftProperty, _rightPoint.X - 20);tbRightPoint.SetValue(Canvas.TopProperty, _rightPoint.Y + 10);PathFigure figure = (p.Data as PathGeometry).Figures[0];figure.StartPoint = _leftPoint;//设置(贝兹曲线的)起点seg = figure.Segments[0] as BezierSegment;seg.Point3 = _rightPoint;//贝兹曲线的终点}}
}

以上的代码,先在Canvas中放置了一段Path,然后在后台去动态修改贝塞尔曲线的控制点,并加入了与鼠标的一些简单交互。更详细的原理也可参见我之前记录的Flash/Flex学习笔记(20):贝塞尔曲线

运行截图:

转载于:https://www.cnblogs.com/yjmyzz/archive/2012/02/10/2346143.html

silverlight:贝塞尔曲线相关推荐

  1. 在Silverlight中绘制贝塞尔曲线

    在Silverlight中绘制贝塞尔曲线 我以前的流程设计器使用的都是曲线,而且不能调扭曲,朋友们意见很大,后来我升级了设计器,这里贴出我实现扭曲的思路 代码下载: http://files.cnbl ...

  2. php 贝瑟尔曲线,贝塞尔曲线的应用详解

    简介 贝塞尔曲线是可以做出很多复杂的效果来的,比如弹跳球的复杂动画效果,首先加速下降,停止,然后弹起时逐渐减速的效果. 使用贝塞尔曲线常用的两个网址如下: 缓动函数: cubic-bezier: 如何 ...

  3. 贝塞尔曲线动画demo(仿美人相机效果)

    效果如图: 仿美人相机,手势滑动隐藏顶部view.为了方便讲解,将屏幕分为几个区域,如图: 在拖动过程中: 1.拖动距离小于minMoveDistance,贝赛尔曲线发生形变 2.拖动大于minMov ...

  4. 自定义View合辑(8)-跳跃的小球(贝塞尔曲线)

    为了加强对自定义 View 的认知以及开发能力,我计划这段时间陆续来完成几个难度从易到难的自定义 View,并简单的写几篇博客来进行介绍,所有的代码也都会开源,也希望读者能给个 star 哈 GitH ...

  5. Bézier曲线 和 Bézier曲面 ( 贝塞尔曲线 和 贝塞尔曲面 )

    Bézier曲线 定义 给定空间n+1个点的位置矢量Pi(i=0,1,2-),则Bezier参数曲线上各点坐标的插值公式是:P(t)=∑i=0nPiBi,n(t),t∈[0,1]P(t)=\sum_{ ...

  6. cic曲线是什么_贝塞尔曲线基本用法

    使用UIBezierPath可以创建基于矢量的路径,此类是Core Graphics框架关于路径的封装.使用此类可以定义简单的形状,如椭圆.矩形或者有多个直线和曲线段组成的形状等. UIBezierP ...

  7. android离散点贝塞尔曲线,离散点拟合曲线贝塞尔曲线B样条.ppt

    离散点拟合曲线贝塞尔曲线B样条 第三章 离散点绘制平面曲线;;不规则曲线(拟合曲线):指已知平面一些离散点的坐标,但曲线方程未知,需要人为设计曲线方程对这些点进行拟合形成的曲线.; 在用拟合方法建立曲 ...

  8. android 贝塞尔曲线点击区域,白话经典贝塞尔曲线及其在 Android 中的应用

    一.前言 谈到贝塞尔曲线可能不少人会浮现它高大上的数学公式.然而,在实际应用中,并不需要我们去完全理解或者推导出公式才能应用得上.实际情况是,即使真的只是一个学渣,我们应该也能很轻松的掌握贝塞尔曲线的 ...

  9. canvas贝塞尔曲线爱心_canvas实现高阶贝塞尔曲线(N阶贝塞尔曲线生成器)

    写在最前 由于原生的Canvas最高只支持到三阶贝塞尔曲线,那么我想添加多个控制点怎么办呢?(即便大部分复杂曲线都可以用3阶贝塞尔来模拟)与此同时,关于贝塞尔控制点的位置我们很难非常直观的清楚到底将控 ...

  10. 用html5的canvas画布绘制贝塞尔曲线

    查看效果:http://keleyi.com/keleyi/phtml/html5/7.htm 完整代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHT ...

最新文章

  1. 深度解析VC中的消息(上)
  2. 《网站设计 开发 维护 推广 从入门到精通》——2.3 页面设计创意思维
  3. sed替换每行最后一个字符
  4. python安卓版汉化版-手机随时随地写Python,还可以开发安卓APP,太厉害了!
  5. 完美/兼容版添加事件以及删除事件
  6. 推荐周立功先生的一本书
  7. Leetcode: Divide Two Integers
  8. centos6.4 搭建JDK环境
  9. 写日历的程序员,你必须弄懂的中国农历算法。
  10. 【Elasticsearch】Elasticsearch之别名
  11. Windows多线程应用程序的编译和链接
  12. python2.7安装pyqt4及转换ui文件为py文件
  13. Quoit Design
  14. 网上预约订餐系统(联网可用)
  15. vulhub Tomcat8漏洞复现
  16. mcgscom口针脚定义_各种接口针脚定义
  17. Mac技巧|如何快速显示Mac桌面?Mac桌面快捷操作方式
  18. 实用工具证件照制作微信小程序源码
  19. 服务器合租速度的决定因素
  20. 给定一个不多于5位的正整数,判断它是几位数,并输出。 输入

热门文章

  1. 管理感悟:要想到自己脖子后面有灰
  2. 百度地图与高德地图比较
  3. python爬虫好学不_python爬虫难学吗
  4. java连接oracle sid_jdbc连接数据库使用sid和service_name的区别
  5. mysql查询bween_MySQL常用查询语句(23个)
  6. VS C++ sprintf 格式
  7. 电子科大考研计算机考研经验,电子科技大学
  8. 学生网上评教系统php,学生评教系统设计与实现.doc
  9. JBPM4.4_jBPM4.4的流程定义语言(设计流程)
  10. 文件系统挂载、卸载及相关的工具 ⑨