基于Cairngorm的Silverlight开发 - part3

使用ModelLocator来管理视图

之前只是简单的介绍了一下ModelLocator的用法,在这里要把模型和视图结合起来,通过模型来来控制视图。在Silverlight中我们可以看到所有新建立的xaml都是继承自UserControl,所以在这里更新欢称视图为控件。

至此给出一个项目的结构图出来。这里我是习惯把从网上下载的第三方类库放在项目中一个Lib的目录下,如果有源码的话直接加入解决方案中也是可以的。

所有的用户控件都是创建在Controls目录下。这里提到了创建用户控件,所以就不得不提一下控件的DependencyProperty属性,他是控件的一个静态的属性,主要用来做数据绑定。

为控件创建DependencyProperty属性

创建了DependencyProperty后能更方便的和ModelLocator进行绑定。处理一些界面上的动画效果也能更加的灵活。
这里给出一个标准的代码

        // Using a DependencyProperty as the backing store for TheName.  
        // This enables animation, styling, binding, etc
        public static readonly DependencyProperty TheNameProperty =
            DependencyProperty.Register("TheName",
                                        typeof(string),
                                        typeof(Page),
                                        new PropertyMetadata("",
                                          new PropertyChangedCallback(
                                            OnTheNameChanged)));

        static void OnTheNameChanged(object sender,
                                     DependencyPropertyChangedEventArgs args)
        {
            // Get reference to self
            Page source = (Page)sender;

            // Add Handling Code
            string newValue = (string)args.NewValue;
        }

更多关于创建自定义用户控件的请查看winter-cn 前辈的《Silverlight 2 Customized Control 开发》 ,写的非常的详细。(我这里就不再去重复的发明轮子了)

创建一个会变色的控件

这里先看Demo

学习是一个温故知新的过程,之前我写过一篇《动态创建Storyboard》这里就用上他再结合DependencyProperty做一个会变色的控件。

运用DependencyProperty结合Storyboard创建控件

    public partial class BackGorund : UserControl
    {

        public byte R
        {
            get { return (byte)GetValue(RProperty); }
            set { SetValue(RProperty, value); }
        }

        // Using a DependencyProperty as the backing store for R.  
        // This enables animation, styling, binding, etc
        public static readonly DependencyProperty RProperty =
            DependencyProperty.Register("R",
                                        typeof(byte),
                                        typeof(BackGorund),
                                        new PropertyMetadata((byte)0,
                                            new PropertyChangedCallback(OnRChanged)));

        static void OnRChanged(object sender, DependencyPropertyChangedEventArgs args)
        {
            // Get reference to self
            BackGorund source = (BackGorund)sender;

            source.changeColor();
        }

        public byte G
        {
            get { return (byte)GetValue(GProperty); }
            set { SetValue(GProperty, value); }
        }

        // Using a DependencyProperty as the backing store for G.  
        // This enables animation, styling, binding, etc
        public static readonly DependencyProperty GProperty =
            DependencyProperty.Register("G",
                                        typeof(byte),
                                        typeof(BackGorund),
                                        new PropertyMetadata((byte)0,
                                            new PropertyChangedCallback(OnGChanged)));

        static void OnGChanged(object sender, DependencyPropertyChangedEventArgs args)
        {
            // Get reference to self
            BackGorund source = (BackGorund)sender;

            source.changeColor();
        }

        public byte B
        {
            get { return (byte)GetValue(BProperty); }
            set { SetValue(BProperty, value); }
        }

        // Using a DependencyProperty as the backing store for B.  
        // This enables animation, styling, binding, etc
        public static readonly DependencyProperty BProperty =
            DependencyProperty.Register("B",
                                        typeof(byte),
                                        typeof(BackGorund),
                                        new PropertyMetadata((byte)0,
                                            new PropertyChangedCallback(OnBChanged)));

        static void OnBChanged(object sender, DependencyPropertyChangedEventArgs args)
        {
            // Get reference to self
            BackGorund source = (BackGorund)sender;

            source.changeColor();
        }

        public void changeColor()
        {
            colorAnim.To = Color.FromArgb(255, R, G, B);
            storyboard.Begin();
        }

        private ColorAnimation colorAnim;
        private Storyboard storyboard;

        public BackGorund()
        {
            InitializeComponent();

            storyboard = new Storyboard();

            Brush br = this.LayoutRoot.Background;
            colorAnim = new ColorAnimation();
            colorAnim.To = Color.FromArgb(255, R, G, B);
            colorAnim.Duration = TimeSpan.FromSeconds(1);
            colorAnim.RepeatBehavior = new RepeatBehavior(1);
            colorAnim.AutoReverse = false;
            Storyboard.SetTarget(colorAnim, br);
            Storyboard.SetTargetProperty(colorAnim, new PropertyPath("Color"));
            storyboard.Children.Add(colorAnim);
            Resources.Add("colorsb", storyboard);

            this.Loaded += new RoutedEventHandler(BackGorund_Loaded);
        }
    }

创建ModelLocator

    public class BackGroundModel : ModelLocator
    {
        

        private static readonly BackGroundModel _instance = new BackGroundModel();

        public static BackGroundModel Instance { get { return _instance; } }

        static BackGroundModel()
        {

        }
        private BackGroundModel()
            : base()
        {

        }

        private byte _R = (byte)0;
        public byte R
        {
            get { return _R; }
            set
            {
                _R = value;
                NotifyPropertyChanged("R");
            }
        }

        private byte _G = (byte)0;
        public byte G
        {
            get { return _G; }
            set
            {
                _G = value;
                NotifyPropertyChanged("G");
            }
        }

        private byte _B = (byte)0;
        public byte B
        {
            get { return _B; }
            set
            {
                _B = value;
                NotifyPropertyChanged("B");
            }
        }

    }

控件Load时绑定属性,通过模型来控制视图

        void BackGorund_Loaded(object sender, RoutedEventArgs e)
        {
            this.DataContext = BackGroundModel.Instance;
            Binding bindR = new Binding("R");
            bindR.Mode = BindingMode.TwoWay;
            this.SetBinding(RProperty, bindR);
            Binding bindG = new Binding("G");
            bindG.Mode = BindingMode.TwoWay;
            this.SetBinding(GProperty, bindG);
            Binding bindB = new Binding("B");
            bindB.Mode = BindingMode.TwoWay;
            this.SetBinding(BProperty, bindB);
        }

 

提高效率

Shawn Wildermuth 写了一个Code Snippets能帮我们快速的创建DependencyProperty属性,具体用法与下载地址请访问这里 。我自己写了一个快速创建ModelLocator的Code Snippets,用法都是一样,点击这里 下载。

送上视频 :) ViewManagerP1.wmv

基于Cairngorm的Silverlight开发 - part2

时间: 2024-09-20 06:06:04

基于Cairngorm的Silverlight开发 - part3的相关文章

基于Cairngorm的Silverlight开发 - part4

通过绑定用视图来管理ModelLocator   由于绑定是双向的,所以在绑定到一些可以操作其自身属性的的控件时,对ModelLocator也是有影响的.这里把上边事例中的颜色的RGB值分别绑定到三个Slider控件上.         public ColorConfig()         {             InitializeComponent();             this.Loaded += new RoutedEventHandler(ColorConfig_Loa

基于Cairngorm的Silverlight开发系列

  最近做了几个silverlight的项目都用到了MVC的开发架构,在silverlight中,MVC.MVVM等架构都很多.各个第三方的公司在推出自己的架构的同时也专门会发布一个for silverlight的版本(如CSLA .NET 3.6支持Silverlight 2 ).  我在做项目时选用了Cairngorm这个MVC框架,因为之前我做flex开发时就用的是他,silverlight中对这个框架进行了移植,用法.思路都是一致的,这里总结了一下自己的开发经验共享出来.   两个用Ca

基于Cairngorm的Silverlight开发 - part2

  搭建架构   由浅入深的来搭建架构. 从ModelLocator开始 ModelLocator只是Cairngorm中的一个部分,要使用它并不一定要把Cairngorm所有的架构都搭建起来,ModelLocator是可以单独来使用的. ModelLocator是Silverlight程序中的一个数据的容器,所有的数据都存在于一个类中"singleton class".这个类有且仅有一个实例.他使用的是设计模式中的单件模式.(这里我也不多说了,李老师已经说的很清楚了.ModelLoc

基于Cairngorm的Silverlight开发 - part1

基于Cairngorm的Silverlight开发 - part1 概述 简单的说Cairngorm是在Silverlight开发中的一个轻量级的MVC开发框架. 和flash.flex开发中的Cairngorm框架一样,Cairngorm是能将程序代码按照逻辑功能(数据.视图.控制)分块的一种开发模型,这个模型被称为MVC(Model模型.View视图.Control控制)模型. 获取 请访问项目网站 的下载页面 . Cairngorm的各个部分 ModelLocator模型:一个储存程序中所

基于Cairngorm的Silverlight开发 - part5

搭建完整的Cairngorm项目 到这里已经都知道了如何独立的运用Cairngorm中两个特殊的部分,ModelLocator模型和View视图,现在需要的就是建立一个完成的Cairngorm项目了.之前只用到了一种设计模式ModelLocator的单件模式,现在要用到了另一种设计模式命令模式,这个模式也是Cairngorm的核心部分. 一个Cairngorm项目一般是这个样子: 一个Page.xaml -(***.xaml.cs这里我就都不提了)程序的入口 一个App.xaml -用来存放Si

Sculpture:基于MDD的集成开发平台

Sculpture是一个基于模型驱动的集成开发平台,目前已经发布了2.1版本. 相信大家对模型驱动,领域设计这些概念已经并不陌生,模型驱动能够极大的提高开发效率,当然这也和项目的类型有关,有所为有所不为,一定要因地制宜. 对于开发系统产品来说,一般是分三个方向: 1.一种是开发出一个功能全面的产品,功能可配置化,客户根据自己的需求进行功能的配置.如SAP 2.另外一种是根据客户的需求直接在平台上进行二次开发,开发完再提交给客户. 如U9 ,EasyBridge.Net 3.还有一种就是拿一个案例

SQL Server 2008空间数据应用系列七:基于Bing Maps(Silverlight) 的空间数据展现

原文:SQL Server 2008空间数据应用系列七:基于Bing Maps(Silverlight) 的空间数据展现 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测. 2.具备 Transact-SQL 编程经验和使用 SQL Server Management Studio 的经验. 3.具有使用 Microsoft Visual Studio 进行 Microsoft .NET Framework开发的经验. 4.具

SQL Server 2008空间数据应用系列八:基于Bing Maps(Silverlight)的空间数据存储

原文:SQL Server 2008空间数据应用系列八:基于Bing Maps(Silverlight)的空间数据存储 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测. 2.具备 Transact-SQL 编程经验和使用 SQL Server Management Studio 的经验. 3.具有使用 Microsoft Visual Studio 进行 Microsoft .NET Framework开发的经验. 4.具有

silverlight开发的程序能在手机上浏览吗

问题描述 请教各位大虾:silverlight开发的程序能在手机上浏览吗?或者说需要怎样做,才能在手机上浏览 解决方案 解决方案二:wp7的开发好像是基于silverlight的.解决方案三:不能就算WP7也要重新构建程序,然后发布到应用商店