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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏marsggbo

博客园自定义皮肤扁平化设计

博客园自定义皮肤设计 效果抢先看 ? 眼见为实!!!戳戳戳》》》marsggbo的博客园 1. 博客皮肤 首先将博客皮肤选为BlackLowKey 2. ...

3225
来自专栏葡萄城控件技术团队

Xamarin.Forms入门-使用 Xamarin.Forms 来创建跨平台的用户界面

Xamarin.Forms 是一个跨平台的、基于原生控件的UI工具包,开发人员可以轻松的创建适用于 Android,iOS 以及 Windows Phone的用...

4527
来自专栏林德熙的博客

win 10 UWP 标签

本文主要翻译:http://visuallylocated.com/post/2015/02/20/Creating-a-WrapPanel-for-your-...

1002
来自专栏林德熙的博客

WPF 弹出 popup 里面的 TextBox 无法输入汉字

这是一个 wpf 的bug,在弹出Popup之后,如果 Popup 里面有 TextBox ,这时无法在里面输入文字。

2413
来自专栏菩提树下的杨过

WPF:自动执行"机器人"程序若干注意事项

企业应用中,经常会遇到一些需要定时自动执行的程序来完成某些功能,比如:自动定时从第三方web service取回数据、定时对历史数据进行清理、定时向ftp上传业...

1998
来自专栏林德熙的博客

WPF 使用 Edge 浏览器

本文告诉大家如何使用 Windows Community Toolkit 的新控件,在 WPF 使用 Edge 浏览器

1761
来自专栏逍遥剑客的游戏开发

UE4中Lambda的一些用法

3787
来自专栏ASP.NET MVC5 后台权限管理系统

ASP.NET MVC5+EF6+EasyUI 后台管理系统(54)-工作流设计-所有流程监控

先补充一个平面化登陆页面代码,自己更换喜欢的颜色背景 @using Apps.Common; @{ Layout = null; } <!DOCT...

2769
来自专栏王大锤

IOS开发中滑动页面时NSTimer停止的问题

3779
来自专栏deepcc

Sublime Text 快捷键

1002

扫码关注云+社区