基于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…

HDU 1284 钱币兑换问题 (动态规划 背包方案数)

钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 15134 Accepted Submission(s): 9117 Problem Description 在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很…

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

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

Hive分区和桶的概念

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

git学习(6):删除github镜像

怎样删除GitHub上的项目 第一步:双击GitHub的项目workhard(举例) 第二步:确认项目可以删除,双击settings 第三步:找到 Delete this repository按钮并单击 第四步:在弹出的模态框框中输入需要删除的项目名字&#xff…

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

故事发生在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…

hadoop join

在介绍这个实例之前,请各位参考:http://bjyjtdj.iteye.com/blog/1453410。 reduce side join是一种最简单的join方式,其主要思想如下: 在map阶段,map函数同时读取两个文件File1和File2,为了区分两种来源的…

git学习(8):windows系统下VI编辑器的基本使用

vi编辑器是Linux系统下标准的编辑器.而且不逊色于其他任何最新的编辑器.但是在windows系统中如何使用VI编辑器呢? 下面给大家介绍在git环境下的vi编辑器的简单用法和部分命令. 工具原料:git2.7.2, 下载地址:https://git-for-windows.githu…

BUUOJ misc 二维码

一个二维码,扫一下是提示:secret is here 用binwalk看一下: binwalk QR_code.pngDECIMAL HEXADECIMAL DESCRIPTION -------------------------------------------------------------------------------- 0 0x0 …

IXMLDOMDocument中的load方法返回值有BUG

IXMLDOMDocument中的load方法返回值是否有BUG IXMLDOMDocument中load一个xml文件时,返回值和msdn上说的不符MSDN上说的是:Return ValuesS_OK The value returned if successful. S_FALSE The value returned if the load fails. E_INVALIDARG The val…

hadoop join之map side join

在本例中,我们仍然采用上一例中的数据文件。之所以存在reduce side join,是因为在map阶段不能获取所有需要的join字段,即:同一个key对应的字段可能位于不同map中。Reduce side join是非常低效的,因为shuffle阶段要进行…

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之间出现了空格,正确命令是没有空格的

Web中的鼠标自动移动

其实只是一个模拟,思路是这样的:让鼠标消失,再用一个跟鼠标一样的图片跟随鼠标移动,这样我们就可以控制这个图片的移动了。。。囧~ 怎样让鼠标消失呢,就是做一个高宽1px的透明cur文件,并把其设置…

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

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

hadoop join之semi join

SemiJoin,也叫半连接,是从分布式数据库中借鉴过来的方法。它的产生动机是:对于reduce side join,跨机器的数据传输量非常大,这成了join操作的一个瓶颈,如果能够在map端过滤掉不会参加join操作的数据&#x…

git学习(9):git 添加 ssh keys 出现如下错误

git 添加 ssh keys 出现如下错误: Key is invalid. It must begin with ssh-ed25519, ssh-rsa, ssh-dss, ecdsa-sha2-nistp256, ends 在终端输入如下命令 $ ssh-keygen -t rsa -b 4096 -C "809753922qq.com" 最后得到 id_rsa.pub $ cd ~/.ssh $ vi id…

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…