Welcome

首页 / 软件开发 / .NET编程技术 / Visual Studio DSL入门 7---DSL的图形表示2

Visual Studio DSL入门 7---DSL的图形表示22011-02-09 博客园 孤独侠客模型元素由形状来表示,而域关系则用连接器(Connectors)来表示.图形映射定义了模型元素通过形状可视化表示出来,而连接器映射定义了链接如何通过连接器可视化表示出来.

形状映射

我们先来看一下形状映射,接着打开我们的LanguageSm项目中的Dsl文件. 选中域类ExampleElement与图形ExampleShape之间的线,可看下面的Dsl details:

这个窗口有两个tab,General tab主要是定义域类和图形间的连接, 可以选择形状,域类,设置他们之间的映射关系,Parent element path(父元素路径)指出了引用的域类的逻辑父元素,以及当前形状应当以哪个图表元素作为父亲.

为什么需要指定父元素路径呢?因为设计器在运行时,所有的图表元素(除了图表本身),都必须有父图表元素(可以是图表或形状),这样这个图表才能够知道自己放在哪里,所以我们在这里需要指定形状被创建后哪个图表元素将作为它的父亲.

父元素路径使用简单的路径语法来表示整个元素和链接结构,在我们这个例子中,它指出了从ExampleElement出发顺着 ExampleModelHasElements.ExampleModel/!ExampleModel这条中径得到的元素对对应的图表元素,就是形状的父元素所在的图表,在这个例子里,也就是图表本身ExampleModel元素,因为我们的ExampleShape是直接放在图形上的。

另外两个可设置的项,具有自定义的父形状(Has custome Parent Shape),具有自定义的父元素(Has custom parent element),当选中时,生成的代码会添加自定义的代码段,你必须实现对应的方法才能够编译通过,在指定的方法里,你可以自已返回父元素和父形状.

隐藏行号 复制代码 ?

if(element is global::Company.LanguageSm.ExampleElement)
{
// Method:
// private DslDiagrams::NodeShape CreateShapeForExampleElement(ExampleElement newElement)
// {
// }
// must be implemented in a partial class of LanguageSmDiagram. Given an instance of ExampleElement,
// the method should return a new shape or connector instance that should be associated with this element. If no shape or connector should be created, the method should return null.
DslDiagrams::NodeShape newShape = CreateShapeForExampleElement((global::Company.LanguageSm.ExampleElement)element);
if(newShape != null) newShape.Size = newShape.DefaultSize; // set default shape size
return newShape;
}

你必须在LanguageSmDiagram的partial类里面实现这个GetShapForExampleElement方法才能够编译通过.

装饰器映射

我们再来看一下Decorator tab,这里主要是映射属性和装饰器,在某些情况下,装饰器的外观可能会需要随着模型信息的更改而动态更改,装饰器映射主要是来定义这一行为。