我们现在知道 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. .Net后台获取客户端信息

    1.获取浏览器版本号 /// <summary> /// 获取浏览器版本号 /// </summary> /// <returns></returns> ...

  2. 【学习笔记】dsu on tree

    我也不知道为啥这要起这名,完完全全没看到并查集的影子啊…… 实际上原理就是一个树上的启发式合并. 特点是可以在$O(nlogn)$的时间复杂度内完成对无修改的子树的统计,复杂度优于莫队算法. 局限性也 ...

  3. linux 中定时执行python脚本

    一.让Python随Linux开机自动运行 准备好要自启的脚本auto.py 用root权限编辑以下文件 sudo vim /ect/rc.local 在exit 0上面编辑启动脚本的命令(编辑rc. ...

  4. day 51 cooike 与 session

    前情提要: cooike 和session 一:cooike 一.会话跟踪技术   1.什么是会话跟踪技术  我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可 ...

  5. cobbler koan自动重装系统

    介绍 koan是kickstart-over-a-network的缩写,它是cobbler的客户端帮助程序,koan允许你通过网络提供虚拟机,也允许你重装已经存在的客户端.当运行时,koan会从远端的 ...

  6. phpqrcode 分别生成普通、带logo、带背景带logo二维码

    前提:下载好 phpqrcode 类库 1.生成普通二维码 //引入类库 include('phpqrcode/phpqrcode.php'); //二维码里面的链接地址 $url="htt ...

  7. ANR触发原理(what triggers ANR?)

    Ref: http://developer.android.com/training/articles/perf-anr.html http://stackoverflow.com/questions ...

  8. 剑指offer四十七之求1+2+3+...+n

    一.题目 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 二.思路 1.需利用逻辑与的短路特性实现递归终 ...

  9. C# 对象相等性判断和同一性判断

    在日常开发中经常需要编写代码比较不同的对象.例如,有时需要将对象都放到一个集合中,并编写代码对集合中的对象进行排序.搜索或者比较. System.Object类有两个Equals方法,如下: 1.实例 ...

  10. Tomcat性能调优-让小猫飞奔

    一.总结前一天的学习 从“第三天”的性能测试一节中,我们得知了决定性能测试的几个重要指标,它们是: ü   吞吐量 ü   Responsetime ü   Cpuload ü   MemoryUsa ...