canvas教程

WPF:从WPF Diagram Designer Part 1学习控件模板、移动、改变大

字号+ 作者:H5之家 来源:H5之家 2017-08-07 18:01 我要评论( )

由于上周主要做了项目组产品架构、给公司新员工培训以及其他会议等事情,在OpenExpressApp对建模支持的初步计划中我列了一些建模任务还没有开展,其中参考部分在以前的blog中都已经介绍了( MetaModelEngine:元模型引擎开发思路、DSM:使用MetaEdit+编写Fam

  由于上周主要做了项目组产品架构、给公司新员工培训以及其他会议等事情,在OpenExpressApp对建模支持的初步计划中我列了一些建模任务还没有开展,其中参考部分在以前的blog中都已经介绍了(MetaModelEngine:元模型引擎开发思路、DSM:使用MetaEdit+编写Family Tree Modeling Language、读书笔记:Visual Studio DSL工具特定领域开发指南)。今天手头上没有其他重要事情了,可以开始进行学习WPF的图形设计器了,这也就是我在WPF - 图形设计器(Diagram Designer)中介绍的一个有源码的设计器,以前看过,觉得它已经实现了图形设计器的一些基本功能,只要先学会它就应该可以编写出自己的一个简易设计器。这个系列分为四部分,每部分都是在原有基础上扩展一些设计器功能,我也将分为四篇blog把从中学到的内容整理一下,对WPF和设计器感兴趣的可以看看。

WPF Diagram Designer: Part 1

这篇文章介绍了通过WPF的控件模板以及Thumb来实现图形设计器的移动Drag、改变大小resize和旋转rotate这三个几本功能,示例代码界面如下:

控件模板

  以往我们在使用Window下的控件时,都是通过控件本身提供的很多属性来更改外观,而在WPF下,你会发现控件并没有提供太多的定制属性,这是因为WPF把外观和内容隔离开来,通过控件模板的概念让我们可以更方便、更有想象力的来定制我们需要的界面。模板可以允许我们用任何东西来完全替代一个元素的可视树,但控件本身的其他功能并不受影响。WPF中的每个Control的默认外观都是在模板中定义的,大家可以通过我以前说的这个工具来查看WPF - 模板查看工具:Show Me The Template及如何查看第三方主题

  控件模板由ControlTemplate类来表示,它派生自FrameworkTemplate抽象类,它的重要部分是它的VisualTree内容属性,它包含了定义想要的外观的可视树。通过以下方式可以定义一个控件模板类:

 

x:Content

 

 

Thumb

  在WPF中有一个Thumb的控件,在MSDN文档中是这么写的: " ...represents a control that lets the user drag and resize controls." 从字面上来看这个是一个用来处理拖放和设置大小的控件,正好应该在图形设计器中来处理移动和改变大小等动作。在以下介绍的Move、Resize和Rotate这三个功能都是使用Thumb来做的。

移动(Move)

MoveThumb 是从Thumb继承下来,我们实现了DragDelta事件来处理移动操作,

 

代码

实现代码中假定DataContext为我们需要操作的图形控件,这个可以在控件模板中看到:

 

 

 

  • RelativeSource

  • PreviousData 列表的前一个数据项
  • 命中测试 IsHitTestVisible
    如果我们现在拖动一个圆形,那么界面如下:


    我们现在拖动时会发现,只能在灰色部分才允许拖动,在圆形区域由于捕获的不是MoveThumb而不能拖动。这时候我们只需要简单的设置IsHitTest为false即可

  • Resize

    更改大小仍旧使用的是Thumb,我们建立了一个控件模板:

     

     

     

    设置了这个样式的Control界面如下图所示:

    对于改变大小,我们只要按照MoveThumb一样,从Thumb继承一个ResizeThumb来处理改变大小的动作,对于控件模板,我们只要把上面的Thumb替换成ResizeThumb即可

     

    代码

     

     

  • 加入到DesignerItemTemplate控件模板

     

  • Rotate

    我们实现旋转功能,仍旧是通过从Thumb继承下来一个RotateThumb,具体实现代码如下:

    代码

    样式如下:

    代码

    加入移动、大小和旋转功能的DesignerItemStyle

     

     

    装饰Adorner

      

     


    WPF支持Adorner来修饰WPF控件,在改变大小等情况下我们可以根据需要来显示,有些建模工具支持选中控件后显示快捷工具条,这个就可以通过使用Adorner来实现。
    本篇通过建立一个装饰类DesignerItemDecorator控件,加入DesignerItemTemplate中,由DesignerItemDecorator控件来控制是否显示以及如何显示装饰部分。

  • 控件模板

     

  • 实现  class DesignerItemDecorator : Control

     

  • 1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    • 用canvas制作酷炫射击游戏--part2

      用canvas制作酷炫射击游戏--part2

      2017-07-31 16:01

    • Particles.js基于Canvas画布创建粒子原子颗粒效果

      Particles.js基于Canvas画布创建粒子原子颗粒效果

      2017-06-29 15:00

    • JParticles是一款基于 Canvas 的轻量级 JavaScript 粒子运动特效

      JParticles是一款基于 Canvas 的轻量级 JavaScript 粒子运动特效

      2017-06-29 15:00

    • Web 版 powerdesigner (Canvas) 技术分享

      Web 版 powerdesigner (Canvas) 技术分享

      2017-06-27 18:01

    网友点评