编辑为Silverlight控件模型及默认初始化
介绍
这部分是执行的一系列功能的设计时间Silverlight的工具包 。 这个职位使用默认的初始图表来说明如何实现Silverlight控件的默认初始值,并解释相关的编辑模式架构。
经验
如果您安装的Silverlight 3工具包在2009年3月发布 ,您可以拖动图表控制构件库Blend和减少表面上的设计师,你必须很好地初始化一个图表,并提出了:
你可以阅读更多关于事先后Silverlight的工具包设计的时代特点:2009年3月发布的更新 。
建筑
DefaultInitializer
它实际上是非常简单地为一个Silverlight控件的默认初始值:
- 实施一系列的子类DefaultInitializer ,并重写其InitializeDefaults功能
- 通过关联控件类的默认的初始类FeatureAttribute
下面的截图显示了DefaultInitializer抽象基类实现,和其他班级Microsoft.Windows.Design.Model命名空间,将在短期内加以讨论:
初始化工作是在InitializeDefaults覆盖,并把结果的XAML序列化。 因此,在实施默认初始化的第一步是确定所需的XAML来产生。
编辑模式
一旦结果XAML中定义,我想有一个更高的层次抽象/方法,只是采取的XAML。 但不幸的是,我们必须使用低得多的水平(从而更加灵活和强大)必须API调用编辑模式,三等像ModelItem , ModelProperty , ModelEvent , ModelFactory和ModelService 。 在MSDN页面编辑模型体系给出了一个基本的概述:
您的设计时间与执行交互的编程接口,但所谓的编辑模式运行时的控制。 正在设计的对象被称为可编辑的对象。
您的控件是指在可扩展应用程序标记语言(XAML)。 您更新您的控件编程使用的XAML编辑模式。
模型,包装,并查看
编辑模式包括三个功能亚基:一个模型,一个公众包装,抽象模型,并认为代表了用户界面的模型(用户界面)。 该模型和视图是独立的,但包装和模型是密切相关的。 下面的插图显示了这三个亚基的关系。
该设计环境使用ModelItem打字沟通与基本模式。 所有改变都是向ModelItem包装,影响了基本模式。 这使得这个模型很简单。 该ModelItem包装处理复杂的事务支持,如设计功能,撤消跟踪和变更通知。
下面的类图可能有助于解释其中的编辑模型的核心课程的相互关系:
下面的例子使用的XAML:
xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml" x:Class ="ModelTest.Page" Width ="640" Height ="480" > < Grid x:Name ="LayoutRoot" Background ="White" > < Button x:Name ="Button" > < Rectangle x:Name ="Rectangle" /> </ Button > </ Grid > </ UserControl > <UserControl的 xmlns =“http://schemas.microsoft.com/winfx/2006/xaml/presentation”xmlns:x =“http://schemas.microsoft.com/winfx/2006/xaml的”X: 类 =“ModelTest 。页“ 宽度 =”640“ 高度 =”480“> < 电网 谢:名称 =”LayoutRoot“ 背景 =”白“> <” 按钮 谢:名称 =“按钮”> < 矩形 谢:名称 =“矩形”/> </ 按钮 “> </ 网格 > </ UserControl的 >
- ModelItem:假设变量项以上ModelItem的按钮控制,
- 名称是坚持为x:Name属性在XAML:item.Name =“按钮”是在XAML中坚持为x:名称=“按钮”。
- ItemType为基础的控制类型的对象,并决定:item.PropertyType XAML中使用的标记== tyepof(巴顿)和XAML的标记<Button />。
- 属性是属性的集合,包裹在ModelProperty类型的基本控制。 例如: 项目[“ClickMode”] = ClickMode.Release将坚持在XAML作为ClickMode =“释放”。
- 内容代表的Content属性ContentControl定义(和其子类继承):item.Content是ModelItem代表矩形对象。
- 来源:当ModelItem代表一个元素的另一个元素的属性,来源是该财产ModelProperty包装。 例如,item.Content.Value.Source == item.Content / /矩形 。
- 事件代表了底层控制的事件收集,ModelEvent型包装。 从我的调试经验,它始终是零,因此它似乎事件属性尚未对Silverlight3尚未Blend3支持。
- 家长是底层控制逻辑的父母,在ModelItem型包装。 例如:item.Parent是电网ModelItem。
- 根是根ModelItem视觉包装,例如:item.Root代表的UserControl。
- ModelProperty:假设变量支柱是Button.Content ModelProperty的,即支撑= item.Content,
- 名称是底层控件的属性名称。 这是坚持以XAML的属性名称。 例如:prop.Name ==“内容”。
- PropertyType是底层控制这种ModelProperty对象代表房产类型的对象。 例如:prop.PropertyType = typeof运算(对象)。
- AttachedOwnerType是控制,首先界定了产权这个ModelProperty对象代表类型对象。 例如:prop.AttachedOwnerType == typeof运算(ContentControl)/ /注:不扣。
- 值是底层控制的财产的价值,ModelItem型包装。 例如:prop.Value是ModelItem代表矩形对象。
- 家长为对照组,在ModelItem类型,该财产属于包裹。 例如:prop.Parent ==项目 。
- ModelEvent:如上所述,item.Events总是空,因此它不似乎ModelEvent是Blend3支持Silverlight3呢。 但是,假设它的作品,和变量极值理论是在 EVT ModelEvent为Button.Click,即= item.Events [“点击”],
- 名称是该事件的名称。 例如:evt.Name ==“点击”。
- EventType是委托类型的事件,例如:evt.EventType == typeof运算(RoutedEventHandler)。
- 处理程序是,前字符串集合事件处理程序:evt.Handlers =新的String [](“Button_Click”)将坚持以点击=“Button_Click”。 注:这是纯粹的猜测,因为ModelEvent尚不支持,我不知道是否/何时/如何将Silverlight的支持。
- 家长为对照组,在ModelItem类型,其中此事件属于包裹。 例如:evt.Parent ==项目 。
执行
图表默认初始化类ChartDefaultInitializer是实施ChartDefaultInitializer.cs,并在ChartMetadata.cs注册。 这两个文件是在Silverlight.Controls.Design.sln Controls.DataVisualization.Toolkit.Design.csproj。 邮寄前请阅读在Silverlight工具包实现设计时功能的更多信息。
结果XAML中
作为第一步,定义的XAML是由ChartDefaultInitializer产生的结果:
Title ="Chart Title" > < 图表:图表 标题 =“图表标题”> > < 图表:Chart.DataContext> > <PointCollection> X ="1" Y ="10" /> < 点 x =“1” 为Y =“10”/> X ="2" Y ="20" /> < 点 x =“2” 为Y =“20”/> X ="3" Y ="30" /> < 点 x =“3” 为Y =“30”/> X ="4" Y ="40" /> < 点 x =“4” 为Y =“40”/> > </ PointCollection> > < 图表:Chart.Series> ItemsSource ="{Binding}" < 图表:ColumnSeries 的ItemsSource =“()绑定” DependentValuePath =的“X” IndependentValuePath =“Y”型/> > </ 制图:Chart.Series> > </ 制图:Chart.DataContext> > </ 图表:图表 >
注册
在ChartMetadata.cs完成与下面的代码:
(ChartDefaultInitializer))); b.AddCustomAttributes( 新FeatureAttribute(typeof运算 (ChartDefaultInitializer)));
参考资料
见下面的截图:
即使DefaultInitializer界定版本Microsoft.Windows.Design.Interaction.dll 3.5(在%devenvdir%\ PublicAssemblies,即C:在32位的Windows \ Program Files文件\微软的Visual Studio 9.0 \ Common7 \ IDE中\ PublicAssemblies),它是不支持Blend2或Visual Studio 2008的Silverlight。 这是支持Blend3和Visual Studio 2010,但它们都切换到新的Microsoft.Windows.Design *. dll文件(3预览的共混,共混3为3.7和4.0的RTM版本的Visual Studio 2010),因此我们需要对链接新版本的MWDs。 邮寄前,请参阅如何为所有设计师设计时间编写Silverlight:Visual Studio 2008中,混合2,配方3,和Visual Studio 2010的更多信息。
另请注意,到Silverlight的System.Windows.dll引用别名,而PointCollection专门出动是Silverlight的一个,而不是WPF的。 由于WPF和Silverlight共享命名空间的很多班级一样, 重要的是,Silverlight的类型,而不是WPF的,用于创建Silverlight控件ModelItem和ModelProperty在默认初始值 。
收藏
请注意下面的截图中,虽然所有的其他财产的价值可以设置通过ModelProperty.SetValue:
Chart.Series是集合类型(集<Series>),因此它的价值,必须首先创建一个ModelItem通过ModelFactory.CreateItem的值,然后通过添加设置创建ModelProperty.Collection.Add ModelItem。 否则,即使正确的XAML可能会生成,配方不会刷新使图表控制正确,你必须重新加载页面有它正确呈现。
ChartDefaultInitializer.cs
/ /(c)版权所有微软公司。 / /此源是受微软公共许可证(女士特等)。 / /请参阅详情http://go.microsoft.com/fwlink/?LinkID=131993的。 / /保留所有其他权利。 Silverlight的外部别名; 使用 System.Windows.Controls.DataVisualization.Charting; 使用 System.Windows.Controls.Design.Common; 使用 Microsoft.Windows.Design.Metadata; 使用 Microsoft.Windows.Design.Model; 使用 Silverlight的社工=::System.Windows; Silverlight的使用 SSWD =::System.Windows.Data; Silverlight的使用 SSWM =::System.Windows.Media; 命名空间 System.Windows.Controls.DataVisualization.Design ( / / / <summary> / / /默认初始化为图表。 / / / </摘要> 内部类 ChartDefaultInitializer:DefaultInitializer ( / / / <summary> / / /设置默认属性值的图表。 / / / </摘要> / / / <param name="item">图ModelItem。</帕拉姆库马拉> 公共重写无效 InitializeDefaults(ModelItem项目) ( 字符串 propertyName的; / / <Charting:Chart Title="Chart Title"> propertyName的= Extensions.GetMemberName <Chart>(十=>“x.Title); item.Properties [propertyName的]。setValue方法(Properties.Resources.ChartTitle); / / <Charting:Chart.DataContext> / / <PointCollection> / / <Point X="1" Y="10" /> / / <Point X="2" Y="20" /> / / <Point X="3" Y="30" /> / / <Point X="4" Y="40" /> / / </ PointCollection> / / </制图:Chart.DataContext> SSWM::PointCollection defaultItemsSource = 新 SSWM::PointCollection(); i = 1; i <= 4; i++) 为(int i = 1;我<= 4;我+ +) ( defaultItemsSource.Add( 新社工::点(一,10 * i)段); ) propertyName的= Extensions.GetMemberName <Chart>(十=>“x.DataContext); item.Properties [propertyName的]。setValue方法(defaultItemsSource); / / <Charting:Chart.Series> / / <制图:ColumnSeries的ItemsSource =“()绑定” / / DependentValuePath =的“X” / / IndependentValuePath =“Y”型/> / / </制图:Chart.Series> ModelItem columnSeries = ModelFactory.CreateItem(item.Context,typeof运算 (ColumnSeries)); propertyName的= Extensions.GetMemberName <ColumnSeries>(十=>“x.ItemsSource); columnSeries.Properties [propertyName的]。setValue方法(ModelFactory.CreateItem(columnSeries.Context,typeof运算 (SSWD::装订))); propertyName的= Extensions.GetMemberName <ColumnSeries>(十=>“x.DependentValuePath); columnSeries.Properties [propertyName的]。setValue方法(“X”号 ); propertyName的= Extensions.GetMemberName <ColumnSeries>(十=>“x.IndependentValuePath); columnSeries.Properties [propertyName的]。setValue方法(“Y”型 ); propertyName的= Extensions.GetMemberName <Chart>(十=>“x.Series); item.Properties [propertyName的]。Collection.Add(columnSeries); ) ) )

.png)








你的任何方式,为与DefaultInitializer(冗长的行动用户反馈我的意思是想显示一个进度栏知道的东西)?
问题是,我可以在一开始就显示进度栏和隐藏的InitializeDefaults在方法的末尾,但是,这个方法仅消耗1生成所需的时间上稍有控制的一部分。
伟大的帖子!
@米罗Paskov
您好米罗斯拉夫,
在最新的版本(RTM和工具包的Silverlight 3 2009年7月),您已经可以与手风琴,树视图,扩展,DataPicker对象等项目1:选定的项目将显示。 我有一个博客贴子,说明如何做到这一点,但没有得到解决,以完成它。 至于上下文菜单等,等待下一个工具包发布。 我想我已经执行了所有Silverlight的TabControl的设计时行为,你在WPF中看到的。 我将博客关于它一旦它的释放。
谢谢,
宁
嗨宁
伟大的帖子! 请让他们来。 我一直在寻找进入配方可扩展性和我有几个问题:
1。 如何实现默认的TabControl的互动? 用户可以通过选择开关用鼠标他们TabItems。 看来,这是可能的,甚至在Blend 2。
2。 我们怎么能添加上下文菜单,类似于“添加TabControl的TabItem”? 同样,这似乎是混合2可用。
米罗