代码改变世界

Silverlight中,很多实例可以使用Xaml的方式进行配置实现的注意事项和原理

2012-10-09 14:00  爱车龟速兔  阅读(375)  评论(1编辑  收藏  举报

    Silverlight中,很多实例可以使用Xaml的方式进行配置实现,但是应该怎么配置呢?

    实际上,就像实例化一个对象一样, 需要声明民名空间,对象的属性等等. 下面有一个例子:

    Prism中配置module可以使用Xaml来配置, 实际上就是配置的一个ModuleCatalog的实例,和我们一般在Xaml页面中什么一个对象是一样的.

<Modularity:ModuleCatalog xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        xmlns:sys="clr-namespace:System;assembly=mscorlib"      

        xmlns:Modularity="clr-namespace:Microsoft.Practices.Prism.Modularity;assembly=Microsoft.Practices.Prism">

    <Modularity:ModuleInfo Ref="ModuleA.xap" ModuleName="ModuleA"

        ModuleType="ModuleA.ModuleA, ModuleA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />

    <Modularity:ModuleInfo Ref="ModuleB.xap" ModuleName="ModuleB" InitializationMode="OnDemand"

        ModuleType="ModuleB.ModuleB, ModuleB, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />

    <Modularity:ModuleInfo Ref="ModuleC.xap" ModuleName="ModuleC" InitializationMode="OnDemand"

        ModuleType="ModuleC.ModuleC, ModuleC, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">

        <Modularity:ModuleInfo.DependsOn>

            <sys:String>ModuleB</sys:String>

        </Modularity:ModuleInfo.DependsOn>

    </Modularity:ModuleInfo>

</Modularity:ModuleCatalog>

然后再代码中这样加载:

  Microsoft.Practices.Prism.Modularity.ModuleCatalog.CreateFromXaml(

                new Uri("/PrismModule;component/ModuleCatalog.xaml", UriKind.Relative));

为什么可以这样呢: 实际上内部是调用了silverlight提供的XamlReader的Load方法将Xaml转换成对象的.

 

对应的使用代码版本什么的是这样的:

       Type typeA = typeof(ModuleA.ModuleA);

        ModuleInfo moduleA = new ModuleInfo

        {   //  ModuleA没有设置InitializationMode,默认为WhenAvailable

            ModuleName = typeA.Name,

            ModuleType = typeA.AssemblyQualifiedName,

        };

        Type typeB = typeof(ModuleB.ModuleB);

        ModuleInfo moduleB = new ModuleInfo

        {

            ModuleName = typeB.Name,

            ModuleType = typeB.AssemblyQualifiedName,

            InitializationMode = InitializationMode.OnDemand,

        };

        Type typeC = typeof(ModuleC.ModuleC);

        ModuleInfo moduleC = new ModuleInfo

        {

            ModuleName = typeC.Name,

            ModuleType = typeC.AssemblyQualifiedName,

            InitializationMode = InitializationMode.OnDemand,

            //  ModuleC依赖于ModuleB

            DependsOn = new Collection<string> { moduleB.ModuleName },

        };

        this.ModuleCatalog.AddModule(moduleA);

        this.ModuleCatalog.AddModule(moduleB);

        this.ModuleCatalog.AddModule(moduleC);