存档

帖子标记'DefaultInitializer“

型号及预设编辑Silverlight控件初始化

5月11日, 2009年 4意见

简介

这是Silverlight工具包系列在设计时功能的实现的一部分。 这篇文章使用图表的默认初始化来说明如何实现Silverlight控件默认的初始化,并解释基本的编辑模型架构。

经验

如果您安装在2009年3月发布 的Silverlight 3工具包 ,您可以拖动图表控件从混合资产库和拖放到设计器图面,和你有很好的初始化和呈现的图表:

Chart default initializer

你可以阅读更多关于它在事先后的Silverlight工具包的设计时功能:2009年3月版本更新。

架构

DefaultInitializer

它实际上是非常简单的Silverlight控件提供一个默认的初始化:

  • 实施一系列的子 DefaultInitializer,并覆盖 InitializeDefaults功能
  • 关联与控制类的默认通过一个初始化程序 FeatureAttribute

下面的截图显示DefaultInitializer抽象基类,Microsoft.Windows.Design.Model命名空间中的其他类不久将要讨论的实施:

DefaultInitializer

初始化完成InitializeDefaults覆盖,结果是XAML序列化。 因此,在实施一个默认的初始化的第一步是定义要生产所需的XAML。

编辑模型

一旦结果XAML定义,我希望有一个更高层次的抽象/方法,只是采取的XAML。 但不幸的是,我们必须使用低得多的水平(从而更灵活和强大的)势在必行API调用编辑模式,包括像类ModelItemModelPropertyModelEventModelFactoryModelService MSDN页面编辑模型体系结构 ,给出了一个基本的概述:

你的设计时实现交互,虽然编程接口编辑模型与运行时间控制。 正在设计中的对象被称为可编辑对象。

您的控件定义的扩展应用程序标记语言(XAML)。 您更新您的控制,以编程方式使用编辑模型的XAML。

型号,包装,并查看

编辑模型由三个功能亚基:一个模型,一个公共的抽象模型的包装,,代表模型的用户界面(UI)的一种观点认为,。 模型和视图是分开的,但包装和模型密切相关。 下图显示了三个亚基之间的关系。

型号,ModelItem和浏览的关系,

设计环境使用ModelItem类型的沟通与底层模型。 所有更改都ModelItem包装,从而影响底层模型。 这使得简单的模型来。 ModelItem包装处理复杂的设计功能,如事务支持,撤消,跟踪和变更通知。

下面的类图可能有助于解释的编辑模式的核心类之间的交互:

Editing Model Class Diagram

下面的XAML使用作为一个例子:

  • ModelItem:假设变是上面的按钮控制ModelItem,
    • 名称是坚持为x:Name属性在XAML:item.Name =“按钮”是坚持在XAML中为x:名称=“按钮”。
    • 的ItemType的底层控制的类型对象,并决定在XAML中使用的标签:item.PropertyType == tyepof(按钮),和XAML标记是<Button /> 。
    • 属性是属性的集合,包裹在ModelProperty类型的底层控制。 例如: 项目[“ClickMode”] = ClickMode.Release将在XAML中坚持ClickMode =“释放”。
    • 内容代表在ContentControl中(和它的子类继承)定义的内容属性:item.Content是ModelItem Rectangle对象。
    • 来源:ModelItem代表的另一个元素的属性的元素时,来源是该属性的ModelProperty的包装。 例如,item.Content.Value.Source == item.Content / /矩形
    • 活动收集底层控制的事件,包裹在ModelEvent类型。 从我的调试经验,它始终是空的,所以,似乎活动属性尚未Blend3支持Silverlight3尚未。
    • 家长是底层控制的逻辑父,包裹在ModelItem类型。 例如:item.Parent电网ModelItem。
    • 根是根视觉,当然ModelItem包装:item.Root代表的UserControl。
  • ModelProperty:假设变量道具 Button.Content ModelProperty,即托= item.Content,
    • 名称是底层控制的财产的名称。 这是坚持在XAML中的属性名称。 例如:prop.Name ==“内容”。
    • PropertyType是Type对象,该ModelProperty对象表示的底层控制的财产。 例如:prop.PropertyType = typeof运算(对象)。
    • AttachedOwnerType是控制,首先定义该ModelProperty对象表示的属性的类型对象。 例如:prop.AttachedOwnerType == typeof运算(ContentControl的)/ /注意:不是按钮。
    • 价值是包裹在ModelItem类型的底层控制,财产的价值。 例如:prop.Value是ModelItem Rectangle对象。
    • 母公司控制,包裹在ModelItem类型,其中财产属于。 例如:prop.Parent ==项目
  • ModelEvent:如上所述,item.Events总是空的,所以它似乎并不为Silverlight3 ModelEvent在Blend3支持。 但假设它的工作原理,和变量EVT通过点击,即ModelEvent,EVT = item.Events [“按”],
    • 名称是事件的名称。 例如:evt.Name ==“点击”。
    • 事件类型的事件的委托,当然类型: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 < 图表:图表 标题 =“图 

注册

完成在下面的代码ChartMetadata.cs:

  (ChartDefaultInitializer))); b.AddCustomAttributes( 新FeatureAttribute(typeof运算 (ChartDefaultInitializer))); 

参考文献

见下面的截图:

References

即使DefaultInitializer是在3.5版本的Microsoft.Windows.Design.Interaction.dll定义(在%devenvdir%\ PublicAssemblies,即C:\ Program Files文件\微软Visual Studio 9.0 \ Common7 \ IDE \ 32位Windows PublicAssemblies),这是为Silverlight Blend2或Visual Studio 2008不支持。 这是Blend3和Visual Studio 2010的支持,但他们都(Blend 3的预览,Blend 3的RTM和Visual Studio 2010 4.0 3.7)切换到较新的Microsoft.Windows.Design *. DLL版本,所以我们需要链接较新版本的MWDs。 请参阅之前后如何撰写所有设计师的Silverlight设计时间:Visual Studio 2008中,混合2; Blend 3中,和Visual Studio 2010的更多信息。

也请参考Silverlight的System.Windows.dll别名,PointCollection特别是所谓的Silverlight之一,而不是WPF的。 很多相同的命名空间中的类,由于WPF和Silverlight 的市场份额,重要的是,Silverlight的类型,而不是WPF的,用来创建Silverlight控件在默认的初始化ModelItem和ModelProperty。

集合

,而所有其他的属性值可以通过ModelProperty.SetValue设置在下面的截图,请注意:

ChartDefaultInitializer

Chart.Series是集合类型(集合<Series>),因此它的价值必须首先创建一个通过ModelFactory.CreateItem值ModelItem,然后添加通过ModelProperty.Collection.Add创建ModelItem。 否则,即使可能会产生正确的XAML,Blend会不会刷新正确呈现图表控件,你必须重新载入页面,正确呈现。

ChartDefaultInitializer.cs

 alias / /版权所有(C)微软公司。/ /此源是受微软公共许可协议(MS - PL)/ / /详情请参阅http://go.microsoft.com/fwlink/?LinkID=131993。 /保留所有其他权利。extern别名  SSWM = Silverlight::System.Windows.Media; namespace System.Windows.Controls.DataVisualization.Design { /// <summary> /// Default initializer for chart. /// </summary> internal class ChartDefaultInitializer : DefaultInitializer { /// <summary> /// Sets the default property values for chart. /// </summary> /// <param name="item">Chart ModelItem.</param> public override void InitializeDefaults(ModelItem item) { string propertyName; // <Charting:Chart Title="Chart Title"> propertyName = Extensions.GetMemberName<Chart>(x => 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> // </Charting:Chart.DataContext> SSWM::PointCollection defaultItemsSource = new SSWM::PointCollection(); for ( int i = 1; i <= 4; i++) { defaultItemsSource.Add( new SSW::Point(i, 10 * i)); } propertyName = Extensions.GetMemberName<Chart>(x => x.DataContext); item.Properties[propertyName].SetValue(defaultItemsSource); // <Charting:Chart.Series> // <Charting:ColumnSeries ItemsSource="{Binding}" // DependentValuePath="X" // IndependentValuePath="Y" /> // </Charting:Chart.Series> ModelItem columnSeries = ModelFactory.CreateItem(item.Context, typeof (ColumnSeries)); propertyName = Extensions.GetMemberName<ColumnSeries>(x => x.ItemsSource); =的Silverlight:System.Windows; 使用 SSWD =的Silverlight:System.Windows.Data; 使用 SSWM =的Silverlight:System.Windows.Media 命名空间 System.Windows.Controls.DataVisualization.Design {/ / / <summary> / / / / </摘要> 内部类 ChartDefaultInitializer:/ /默认的初始化为图表。DefaultInitializer {/ / / <summary> / / /设置图表的默认属性值/ / / </摘要> / / / <参数名称=“项目”>图ModelItem </ PARAM> 覆盖公共无效 InitializeDefaults(ModelItem项目){ 字符串的propertyName; / / <Charting:Chart Title="Chart Title">的propertyName = Extensions.GetMemberName <Chart>(X => X标题); 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();(INT I = 1;我<= 4; I + +){defaultItemsSource.Add( 西南偏南: :点(I,10 * I));}的propertyName = Extensions.GetMemberName <Chart>(X => x.DataContext); item.Properties [propertyName的]的SetValue(defaultItemsSource); / / <Charting:Chart.Series>。 / / <Charting:ColumnSeries ItemsSource="{Binding}" // DependentValuePath="X" // IndependentValuePath="Y" /> / / </图表:Chart.Series> ModelItem columnSeries = ModelFactory.CreateItem(item.Context typeof运算 (ColumnSeries));的propertyName = Extensions.GetMemberName <ColumnSeries>(X => x.ItemsSource);  ); propertyName = Extensions.GetMemberName<Chart>(x => x.Series); item.Properties[propertyName].Collection.Add(columnSeries); } } } propertyName的= Extensions.GetMemberName <ColumnSeries>(X => x.DependentValuePath); columnSeries.Properties [propertyName的]的SetValue(“X”的 );的propertyName = Extensions.GetMemberName <ColumnSeries>(X => x.IndependentValuePath); columnSeries。属性的propertyName]的SetValue(“Y”型 );的propertyName = Extensions.GetMemberName <Chart>(X => x.Series); item.Properties的propertyName] Collection.Add(columnSeries);}}} 

Technorati