我们现在知道 thumb ,可以让用户自行拖动其在 canvas上移动,在这个而基础上 我们可以试着往流程图方向靠近一下。
我们知道,流程图,都是一个一个的流程块,然后用线连起来的,这一个一个的流程块可能会有各种各样的形状, 比如长方形,菱形
这很简单 ,只需要设置 thumb使用不同的控件模板就ok.
 
在 界面上 放置了多个 thumb之后, 每一个都是需要响应dragDelta事件 才可以实现拖动的, 这样的话 就基本要给每一个thumb写上各自的 dragDelta处理方法。 如果这样子,那代码就开始臃肿了。
所以 针对可以拖动的滑块,可以开发子类 如下:
 
public class MoveThumb :Thumb
{
public MoveThumb()
{
this.DragDelta += MoveThumb_DragDelta;
} public void MoveThumb_DragDelta(object sender, DragDeltaEventArgs e)
{
Thumb myThumb = (Thumb )sender;
double nTop = Canvas .GetTop(myThumb) + e.VerticalChange;
double nLeft = Canvas .GetLeft(myThumb) + e.HorizontalChange;
Canvas.SetTop(myThumb, nTop);
Canvas.SetLeft(myThumb, nLeft);
}
}

前台

    <Window.Resources>
<ControlTemplate x :Key="rec">
<Rectangle Fill ="Gray" Width="70" Height="50"></ Rectangle>
</ControlTemplate>
<ControlTemplate x :Key="ell">
<Ellipse Fill ="Gray" Width="70" Height="70"></ Ellipse>
</ControlTemplate>
</Window.Resources >
<Grid >
<Canvas Background ="AliceBlue" HorizontalAlignment="Left" Height="412" Margin="10,10,0,0" VerticalAlignment="Top" Width="522">
<local: MoveThumb Canvas.Left="50" Canvas.Top="50" Template="{StaticResource rec}"></local: MoveThumb>
<local: MoveThumb Canvas.Left="140" Canvas.Top="50" Template="{StaticResource ell}"></local: MoveThumb>
<local: MoveThumb Canvas.Left="250" Canvas.Top="50" Template="{StaticResource ell}"></local: MoveThumb>
</Canvas>
</Grid >
效果如下
 是的,我们现在的这些滑块 都可以在画布上滑动了。但是 上面代码的的写法有不好的地方在于,thumb块不是内容控件,他是不可以在内部放东西的。而我们的这一系列功能是为了给以后的流程图做铺垫, 而流程图的块里面 到时候是需要实际放上我们的activity活动来作为执行的。所以我们应该 换一种写法思路来实现目前的这个效果。
我们应该改造成 让界面上的都是内容控件,而这些内容控件的controlTemplate则使用上面开发的 MoveThumb。这样一来 代码还是要有不少变动的。
页面元素变为
  <ContentControl Canvas.Left ="50" Canvas.Top="50" Template="{StaticResource thumbItemTemplate}">
<Ellipse Width ="50" Height="50" Fill="OrangeRed" IsHitTestVisible="False"></ Ellipse>
</ContentControl>
 <ControlTemplate x :Key="rawThumbTemplate" TargetType="Thumb">
<Rectangle Fill ="Transparent"></Rectangle>
</ControlTemplate>
<ControlTemplate x :Key="thumbItemTemplate" TargetType="ContentControl">
<Grid DataContext ="{Binding RelativeSource ={RelativeSource TemplatedParent}}">
<!--这里的放置顺序还是有讲究的-->
<local: MoveThumb Template="{ StaticResource rawThumbTemplate}" Cursor="SizeAll"></ local:MoveThumb >
<ContentPresenter Content ="{TemplateBinding Content}"></ContentPresenter>
</Grid>
</ControlTemplate>
注意到 我们这边绑定了 模板中 MoveThumb的datacontext为使用这个模板的元素,这样moveThumb代码修改如下
 public void MoveThumb_DragDelta( object sender, DragDeltaEventArgs e)
{
Control item = this.DataContext as Control;
if(item!= null)
{
double left = Canvas.GetLeft(item);
double top = Canvas.GetTop(item);
Canvas.SetTop(item,top+e.VerticalChange);
Canvas.SetLeft(item,left+e.HorizontalChange);
}
}
就可以通过 DataContext获取 实际需要在画板上位移的元素。 运行出来的效果是一样的。只不过我们界面上的元素成为了 contentControl,这样子以后 像其内部放东西 就成为可能。
 

WPF流程图制作系列相关基础二的更多相关文章

  1. WPF流程图制作系列相关基础一

    WPF流程图制作相关基础一   需求是要通过wpf开发流程图,这个流程图是用户自行拖动配置.   使用过流程图的话,应该大体能想象出流程图拖动配置的样子.这里主要会涉及到的技术知识点就是 wpf拖动相 ...

  2. WPF入门教程系列一——基础

    一. 前言   最近在学习WPF,学习WPF首先上的是微软的MSDN,然后再搜索了一下网络有关WPF的学习资料.为了温故而知新把学习过程记录下来,以备后查.这篇主要讲WPF的开发基础,介绍了如何使用V ...

  3. WPF入门教程系列二——Application介绍

    一.Application介绍 WPF和WinForm 很相似, WPF与WinForm一样有一个 Application对象来进行一些全局的行为和操作,并且每个 Domain (应用程序域)中仅且只 ...

  4. WPF入门教程系列二十三——DataGrid示例(三)

    DataGrid的选择模式 默认情况下,DataGrid 的选择模式为“全行选择”,并且可以同时选择多行(如下图所示),我们可以通过SelectionMode 和SelectionUnit 属性来修改 ...

  5. [WPF系列]从基础起步学习系列计划

    引言 WPF技术已经算不什么新技术,一搜一大把关于WPF基础甚至高级的内容.之前工作中一直使用winform所以一直没有深入学习WPF,这次因项目中使用了WPF技术来实现比较酷的展示界面.我在这里只是 ...

  6. WPF入门教程系列(二) 深入剖析WPF Binding的使用方法

    WPF入门教程系列(二) 深入剖析WPF Binding的使用方法 同一个对象(特指System.Windows.DependencyObject的子类)的同一种属性(特指DependencyProp ...

  7. 深入理解mysql之BDB系列(1)---BDB相关基础知识

        深入理解mysql之BDB系列(1) ---BDB相关基础知识 作者:杨万富   一:BDB体系结构 1.1.BDB体系结构 BDB总体的体系结构如图1.1所看到的,包括五个子系统(见图1.1 ...

  8. WPF编游戏系列 之二 图标效果

    原文:WPF编游戏系列 之二 图标效果        本篇将要实现图标的两个效果:1. 显示图标标签,2. 图标模糊效果.在上一篇中提到Image没有HTML <img>的Title属性( ...

  9. linux设备驱动归纳总结(二):模块的相关基础概念【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-59415.html linux设备驱动归纳总结(二):模块的相关基础概念 系统平台:Ubuntu 10 ...

随机推荐

  1. Aizu 2249Road Construction 单源最短路变形《挑战程序设计竞赛》模板题

    King Mercer is the king of ACM kingdom. There are one capital and some cities in his kingdom. Amazin ...

  2. Java并发(一)-了解线程安全

    线程不安全性 先来举例说明线程不安全是什么情况下发生的:例如一个变量可以被多个线程进行访问,那么在大量线程并发访问这个变量的情况下,线程执行的顺序会给最后的结果带来不可预估的错误. 先定义一个单例类S ...

  3. 【4】JMicro微服务-服务限流

    如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 通过配置SMethod的maxSpeed属性实现服务限流,单位是个/每秒(qps),也就是服务方法每秒允许接收的最大请求个数 ...

  4. windows 安装openssl

    参考文章:http://www.cnblogs.com/tangxin-blog/p/5724071.html 准备条件: 1.VS2012 (携带c++) 2.下载openssl 源码 3.安装Pe ...

  5. NodeJS require a global module/package in linux

    https://stackoverflow.com/questions/15636367/nodejs-require-a-global-module-package 1  export NODE_P ...

  6. Hive文件存储格式和hive数据压缩

    一.存储格式行存储和列存储 二.Hive文件存储格式 三.创建语句和压缩 一.存储格式行存储和列存储 行存储可以理解为一条记录存储一行,通过条件能够查询一整行数据. 列存储,以字段聚集存储,可以理解为 ...

  7. hibernate原生sql封装,报错信息:could not find setter for rownum_

    今天用hibernate的时候,用了一个原生态sql做了一个分页查询,结果就报错了... 找到解决方法了:http://shmily2038.iteye.com/blog/1704963

  8. C#的Equals不区分大小写

    代码:System.Windows.Forms.MessageBox.Show("abc".Equals("ABC", StringComparison.Inv ...

  9. Spring AOP 的实现

    软件152 余建强 1 使用 API 实现 AOP 新建一个用户接口:UserService package com.cqvie.aop.api; public interface UserServi ...

  10. spring cloud连载第三篇之Spring Cloud Netflix

    1. Service Discovery: Eureka Server(服务发现:eureka服务器) 1.1 依赖 <dependency> <groupId>org.spr ...