当前位置:文档之家› 元数据驱动的用户界面

元数据驱动的用户界面

数据驱动的用户界面John deVadoss (微软公司)用于:企业体系结构/用户界面概述:本文解释了如何由元数据动态创建Windows窗体,以及当考虑到客户端逻辑定制时如何执行窗体。

目录介绍阅读前提设计要素设计时实现运行时实现结论介绍因为客户之间、用户之间需求的变化,很多业务应用程序需要用户界面可护展,用户界面的客户端业务逻辑也需要根据个别用户的需要定制。

一个用户与另一个用的屏幕布局可能不同,这可能包括控件位置,可见性等等,或者可能因为设备不同而界面不同,就象智能电话,平板设备或个人数字助理。

客户端业务逻辑定制也包括:定制有效性规则,更改控件属性,以及其他修正。

例如:为了删除及移动文件,经理比下属拥有不同的特权。

有很多技术能够实现业务应用程序的可护展、可定制,大多数应用程序通过将可定制项,如用户界面布局及客户端业务逻辑作为元数据存储在仓储中解决。

元数据因而可由运行时引擎解释,从而为用户显示屏幕,以及当用户在屏幕完成动作时执行客户端业务逻辑。

这种方式的优点是双重的:第一,当表示层相关组件在中心仓储完成定制时,不需要重新部署;第二,仅需要非常轻的客户端安装,也就是仅需将运行时引擎部署到客户端机器上。

本文描述了利用微软.NET Framework实现的此技术,为此,本文解释了如何由元数据创建Windows窗体,以及考虑到客户端逻辑定制时如何运行窗体。

阅读前提●了解关于编写Visual Studio Add-Ins的知识●DTE对象模型的用途设计要素实现元数据驱动的用户界面,本质上有三个设计要素。

●首先是设计元数据架构并决定仓储机制。

仓储可以是关系数据库,如SQL Server或任何其他存储,如XML。

本文我们使用XML文件作为元数据仓储。

●当我们确定元数据架构后,我们实现一个设计时环境,在此环境中用户(通常为开发者或定制人)能创建及修改特定屏幕。

本文将跨在微软Visual Studio Windows Forms Designer(窗体设计器)之上来实现设计时环境。

●最后,我们设计并实现运行时引擎。

仓储结构首先,我们要决定能以元数据存储的内容。

如上述所提,元数据应该包含所有可定制的项目。

例如,如果客户想定制屏幕布局及客户端验证逻辑,那么元数据应该包含有关界面布局信息,包括放置在屏幕的控件,他们的属性,放置位置,元数据也应该包括客户端业务逻辑。

以下是一个包括界面信息的XML文件例子。

<?xml version="1.0" encoding="utf-8"?><form xmlns:xsd=/2001/XMLSchemaxmlns:xsi="/2001/XMLSchema-instance" name="Form1" xmlns="/MetadataForm.xsd"><controls><control type="System.Windows.Forms.Form"><position><height>224</height><width>300</width><top>13</top><left>13</left></position><controls><control type="System.Windows.Forms.Button"><position><height>23</height><width>75</width><top>144</top><left>160</left></position><controls /><name>button2</name><text>button2</text><tabIndex>2</tabIndex><event-handlers /></control><control type="System.Windows.Forms.Button"> <position><height>23</height><width>75</width><top>144</top><left>64</left></position><controls /><name>button1</name><text>button1</text><tabIndex>1</tabIndex><event-handlers><eventInfo eventName="Click" eventHandler="button1_Click" /><eventInfo eventName="EnabledChanged" eventHandler="button1_EnabledChanged" /></event-handlers></control><control type="System.Windows.Forms.TabControl"><position><height>100</height><width>200</width><top>24</top><left>48</left></position><controls><control type="System.Windows.Forms.TabPage"><position><height>74</height><width>192</width><top>22</top><left>4</left></position><controls><control type="System.Windows.Forms.Button"> <position><height>23</height><width>56</width><top>24</top><left>112</left></position><controls /><name>button3</name><text>button3</text><tabIndex>2</tabIndex><event-handlers><eventInfo eventName= "Click" eventHandler="button3_Click" /></event-handlers></control><controltype="System.Windows.Forms.TextBox"><position><height>20</height> <width>64</width><top>40</top><left>16</left></position><controls /><name>textBox2</name><text>textBox2</text><tabIndex>1</tabIndex><event-handlers /></control><controltype="System.Windows.Forms.TextBox"><position><height>20</height><width>64</width><top>8</top><left>16</left></position><controls /><name>textBox1</name><text>textBox1</text><tabIndex>0</tabIndex><event-handlers /></control></controls><name>tabPage1</name><text>tabPage1</text><tabIndex>0</tabIndex><event-handlers /></control><control type="System.Windows.Forms.TabPage"> <position><height>74</height><width>192</width><top>22</top><left>4</left></position><controls><controltype="System.Windows.Forms.LinkLabel"><position><height>23</height> <width>120</width> <top>24</top><left>24</left></position><controls /><name>linkLabel1</name> <text>linkLabel1</text> <visible>false</visible> <tabIndex>0</tabIndex><event-handlers><eventInfoeventName="LinkClicked" eventHandler="linkLabel1_LinkClicked" /></event-handlers></control></controls><name>tabPage2</name><text>tabPage2</text><visible>false</visible><tabIndex>1</tabIndex><event-handlers /></control></controls><name>tabControl1</name><text /><tabIndex>0</tabIndex><event-handlers /></control></controls><name>Form1</name><text>Form1</text><tabIndex>0</tabIndex><event-handlers><eventInfo eventName="Load" eventHandler="Form1_Load" /> </event-handlers></control></controls><script><events eventHandler="linkLabel1_LinkClicked"><content> private void linkLabel1_LinkClicked(object sender, System.Windows.Forms.LinkLabelLinkClickedEventArgs e){}</content><type>text</type></events><events eventHandler="Form1_Load"><content> private void Form1_Load(object sender, System.EventArgs e){textBox1.Text = " " ;textBox2.Text = " " ;}</content><type>text</type></events><events eventHandler="button1_Click"><content> private void button1_Click(object sender, System.EventArgs e){textBox1.Text = "Button 1 Clicked" ;}</content><type>text</type></events><events eventHandler="button1_EnabledChanged"><content> private void button1_EnabledChanged(object sender, System.EventArgs e){}</content><type>text</type></events><events eventHandler="button3_Click"><content> private void button3_Click(object sender, System.EventArgs e){Button3.Enabled = true ;textBox1.Text = "Button 3 Clicked" ;}</content><type>text</type></events></script></form>让我们看看XML文件的内容。

相关主题