基于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
Get Microsoft Silverlight
基于Cairngorm的Silverlight开发 - part2

转载于:https://www.cnblogs.com/nasa/archive/2009/03/15/Cairngorm-Silverligh-part3.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423514.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

时间复杂度空间复杂度分析

转发:https://blog.csdn.net/LF_2016/article/details/52453212 时间复杂度: 一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数f(n),进而分析f(n)随n的变化情况并确定T(n)的数量级。这里用"O"来表示数量级&#xff…

github(5):GitHub的注册与使用(详细图解)

首先,你需要注册一个 github账号,最好取一个有意义的名字,比如姓名全拼,昵称全拼,如果被占用,可以加上有意义的数字. 本文中假设用户名为 chuaaqiCSDN(我的博客名的全拼) 一、gihub账号注册与仓库创建 1. 注册账号: 地址: https…

Hive分区和桶的概念

Hive 已是目前业界最为通用、廉价的构建大数据时代数据仓库的解决方案了,虽然也有 Impala 等后起之秀,但目前从功能、稳定性等方面来说,Hive 的地位尚不可撼动。 其实这篇博文主要是想聊聊 SMB join 的,Join 是整个 MR/Hive 最为…

剧情介绍:“肖申克的救赎”

故事发生在1947年,银行家安迪因为妻子有婚外情,用枪杀死了她和她的情人,因此他被指控枪杀了妻子及其情人,安迪被判无期徙刑,这意味着他将在肖恩克监狱中渡过余生。  阿瑞1927年因谋杀罪被判无期徙刑,数次…

Spring Boot----Dubbo

概述 治理和维护各个分系统 参考官网:http://dubbo.apache.org/zh-cn/docs/user/references/registry/introduction.html (可中英文切换) 下载安装Zookeeper linux 使用docker部署 windows: 参考(https://blog.csdn.net/ring300/a…

git学习(7):创建ssh key时遇到“Bad escape character ‘ygen’.”

问题: 创建ssh key时遇到“Bad escape character ‘ygen’.” image.png $ ssh -keygen -t rsa -C "" Bad escape character ygen. 分析原因:ssh -keygen之间出现了空格,正确命令是没有空格的

用小程序·云开发打造运动圈小程序丨实战

乒乓圈小程序 和朋友合伙写了一个小程序,写了一个以共享乒乓信息和交流的平台———乒乓圈。我们使用了微信的云开发来完成数据和后台的作用。免去了租赁服务器。 我主要负责的是数据库的设计和云函数实现数据获取和触发器的功能和简单的两个页面。 正文 功能展示 页…

BeanUtil使用例子:解析并转化HttpServletRequest到Bean的全面测试

在Web表单提交后解析表单时,一般框架都提供了某种方式可以自动从表单映射到我们的POJO类里面。属性会被自动填充的。 但如果我们在某个需求里,真的需要用程序来解析的话,那么如果有几百个属性,可就是一个噩梦了。 我们可以用java的…

【vue开发】vue导出Excel表格教程demo

前端工作量最多的就是需求,需求就是一直在变,比如当前端数据写完之后,需要用Excel把数据下载出来;再比如前端在没有数据库想写些demo玩时,也是很好的选择。 第一步安装依赖包,修改配置 1、装依赖: cnpm ins…

git学习(10):Git的使用--如何将本地项目上传到Github(两种简单、方便的方法)

将本地项目上传到Github(两种简单、方便的方法) 一、第一种方法: 首先你需要一个github账号,所有还没有的话先去注册吧! https://github.com/ 我们使用git需要先安装git工具,这里给出下载地址&#xff0…

.NET中栈和堆的比较1

原文出处: http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_memory01122006130034PM/csharp_memory.aspx 尽管在.NET framework下我们并不需要担心内存管理和垃圾回收(Garbage Collection),但是我们还是应该了解它们,以优化我们的…

前端学习(1):HTML和CSS导学

最近为什么捡起前端,主要工作太忙,有时间就会抓一下后端,前端是我以前啃得比较多的 再来一次呢,工作在忙也不能停止学习勒 第一部分 第二部分 第三部分 第四部分 如何学习

Spring Boot----Dubbo原理分析

环境:需要创建一个dubbo.xml 通过ImportResource()导入xml: 1、首先spring启动解析配置文件的每一个标签的总接口是 org.springframework.beans.factory.xml.BeanDefinitionParser 2、DubboBeanDefinitionParser是它的一个实现类,通过调用par…

前端学习(2):什么是html和css

什么是HTML? W3C:万维网联盟,是目前web技术领域最具权威和影响力的标准机构,目前为止,W3C已发布了200多项影响深远的web技术标准及实施指南。 Hypertext markup language:超文本标记语言,该语言书写的代码通…

基于小程序·云开发构建高考查分小程序丨实战

2019高考报名人数达到了 1031 万的新高,作为一名三年前参考高考的准程序猿,赶在高考前,加班加点从零开始做了一款高考查分小程序,算是一名老学长送给学弟学妹们的高考礼。上线仅 1 个月,用户数就突破了 1k,…

前端学习(3):vs code编辑器

下载地址 https://code.visualstudio.com 下载安装教程 变成中文 在编辑器中运行我们的网页 open in browser view in browser 选中文件----首选项----设置 常用快捷键

QuickPart应用系列

在上一篇解决方案包部署与收回篇章中,我只是稍微提了下QuickPart.也许刚接触这块内容的朋友,可能还不是很清楚,QuickPart具体的功能能实现什么。首先要告诉你的是QuickPart的人性化之处,那就是给开发人员开发webpart提供更简洁的方…

前端学习(4):chome浏览器

一、认识浏览器 浏览器是网页显示、运行的平台,常用的浏览器有IE、火狐(Firefox)、谷歌(Chrome)、Safari和Opera等。我们平时称为五大浏览器。IE最新版为Edge。 常用浏览器 二、浏览器市场份额 可以通过百度的统计网…

实战 IE8 开发人员工具

今天整理我收藏的漫画的时候发现 风云3 少了两集(486、487),这对于收藏者来说基本是不可忍受的; 从风云一到三,应该一集也不能少的; 决定上网去找找,不过溜达一圈常去的分享论坛,由于…

前端学习(6):javascript简介

我们需要思考以下六个问题: 1、javaScript是什么? 2、javaScript的用途是什么? 3、javaScript和ECMAScript的关系是什么? 4、javaScript由哪几部分组成? 5、javaScript的执行原理是怎样的? 6、在页面…