首页 > 设计时Silverlight的 >编辑模式与Silverlight的控件的默认初始化为

编辑为Silverlight控件模型及默认初始化

介绍

这部分是执行的一系列功能的设计时间Silverlight的工具包 这个职位使用默认的初始图表来说明如何实现Silverlight控件的默认初始值,并解释相关的编辑模式架构。

经验

如果您安装的Silverlight 3工具包2009年3月发布 ,您可以拖动图表控制构件库Blend和减少表面上的设计师,你必须很好地初始化一个图表,并提出了:

Chart default initializer

你可以阅读更多关于事先后Silverlight的工具包设计的时代特点:2009年3月发布的更新

建筑

DefaultInitializer

它实际上是非常简单地为一个Silverlight控件的默认初始值:

下面的截图显示了DefaultInitializer抽象基类实现,和其他班级Microsoft.Windows.Design.Model命名空间,将在短期内加以讨论:

DefaultInitializer

初始化工作是在InitializeDefaults覆盖,并把结果的XAML序列化。 因此,在实施默认初始化的第一步是确定所需的XAML来产生。

编辑模式

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

您的设计时间与执行交互的编程接口,但所谓的编辑模式运行时的控制。 正在设计的对象被称为可编辑的对象。

您的控件是指在可扩展应用程序标记语言(XAML)。 您更新您的控件编程使用的XAML编辑模式。

模型,包装,并查看

编辑模式包括三个功能亚基:一个模型,一个公众包装,抽象模型,并认为代表了用户界面的模型(用户界面)。 该模型和视图是独立的,但包装和模型是密切相关的。 下面的插图显示了这三个亚基的关系。

模型,ModelItem,并查看关系

该设计环境使用ModelItem打字沟通与基本模式。 所有改变都是向ModelItem包装,影响了基本模式。 这使得这个模型很简单。 ModelItem包装处理复杂的事务支持,如设计功能,撤消跟踪和变更通知。

下面的类图可能有助于解释其中的编辑模型的核心课程的相互关系:

Editing Model Class Diagram

下面的例子使用的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))); 

参考资料

见下面的截图:

References

即使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:

ChartDefaultInitializer

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);
        
    
 

分享和欣赏:

  • Print
  • email
  • RSS
  • Twitter
  • TwitThis
  • del.icio.us
  • LinkedIn
  • Technorati
  • Facebook
  • Google Bookmarks
  • Live
  • MySpace
  • QQ书签
  1. 鲍里斯拉夫伊万诺夫
    2010年7月19日在07:09 | #1

    你的任何方式,为与DefaultInitializer(冗长的行动用户反馈我的意思是想显示一个进度栏知道的东西)?

    问题是,我可以在一开始就显示进度栏和隐藏的InitializeDefaults在方法的末尾,但是,这个方法仅消耗1生成所需的时间上稍有控制的一部分。

  2. 海员
    2010年3月15日在07:25 | #2

    伟大的帖子!

  3. 2009年8月1日在15:07 | #3

    @米罗Paskov
    您好米罗斯拉夫,

    在最新的版本(RTM和工具包的Silverlight 3 2009年7月),您已经可以与手风琴,树视图,扩展,DataPicker对象等项目1:选定的项目将显示。 我有一个博客贴子,说明如何做到这一点,但没有得到解决,以完成它。 至于上下文菜单等,等待下一个工具包发布。 我想我已经执行了所有Silverlight的TabControl的设计时行为,你在WPF中看到的。 我将博客关于它一旦它的释放。

    谢谢,

  4. 米罗斯拉夫Paskov
    2009年6月4日在02:28 | #4

    嗨宁

    伟大的帖子! 请让他们来。 我一直在寻找进入配方可扩展性和我有几个问题:

    1。 如何实现默认的TabControl的互动? 用户可以通过选择开关用鼠标他们TabItems。 看来,这是可能的,甚至在Blend 2。

    2。 我们怎么能添加上下文菜单,类似于“添加TabControl的TabItem”? 同样,这似乎是混合2可用。

    米罗

  1. 还没有引用。