WF,WPF,Silverlight的DependencyProperty 附加属性
WF,WPF,Silverlight的DependencyProperty 附加属性
注意,是DependencyProperty 附加属性,而不是绑定属性
例子: http://files.cnblogs.com/foundation/Projects.rar
首先看一个假设,
在不修改一个类的前提下,如何扩展一个类的成员(继承也不可以)
这在传统的OO设计中是无法完成的,但在NET3.0(C#3.0,VB.NET9.0)中提供了扩展方法开实现这一功能
看下例:
场景:我经常要用得到数字除2的结果,如何方便的实现
class Program { static void Main(string[] args) { double v1 = 123; double p1 = v1.zzzzz(); System.Console.WriteLine(p1); //-- double p2=(1234567890.123).zzzzz(); System.Console.WriteLine(p2); } } static class myExtension { public static double zzzzz(this double d) { return d/2 ; } } |
这就是扩展方法,在不修改的结构的情况下,为[ double ]添加了[zzzzz]这个方法
linq 用的就是这种方式
方法可以这样做,那属性哪?
升级一下需求,我想一个对象在一个环境中自动多出某几个属性,在另外一个环境中又自动多出另外几个属性
如何做,
先看一下Silverlight
场景:提供一个容器,容器分两排,放入容器内的件意控件都可设置附加属性[myTag]的属性,[myTag]属性设为[a]的在左边,设为[b]的在右边
容器
public class wxdPanel : StackPanel { StackPanel p1 = new StackPanel(); StackPanel p2 = new StackPanel(); public wxdPanel() : base() { p1.Width = 200; p2.Width = 200; p1.Background = new System.Windows.Media.SolidColorBrush(new Color() { R = 0, G=255, B=0 , A=255}); p2.Background = new System.Windows.Media.SolidColorBrush(new Color() { R = 0, G = 0, B = 255, A = 255 }); this.Orientation = Orientation.Horizontal; this.Children.Add(p1); this.Children.Add(p2); this.Loaded += new RoutedEventHandler(wxdPanel_Loaded); } List<FrameworkElement> list = new List<FrameworkElement>(); void wxdPanel_Loaded(object sender, RoutedEventArgs e) { foreach (var p in this.Children) { if (p is StackPanel) { } else { list.Add((FrameworkElement)p); } } foreach (var v in list) { this.Children.Remove(v); if (wxdPanel.GetmyTag(v) == "a") { p1.Children.Add(v); } if (wxdPanel.GetmyTag(v) == "b") { p2.Children.Add(v); } } } public static string GetmyTag(DependencyObject obj) { return (string )obj.GetValue(myTagProperty); } public static void SetmyTag(DependencyObject obj, string value) { obj.SetValue(myTagProperty, value); } public static readonly DependencyProperty myTagProperty = DependencyProperty.RegisterAttached("myTag", typeof(string ), typeof(wxdPanel),new PropertyMetadata("")); } |
使用
<UserControl x:Class="SilverlightApplication1.Page" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="400" Height="300" xmlns:mytype="clr-namespace:SilverlightApplication1"> <mytype:wxdPanel > <Button Name="Button1" mytype:wxdPanel.myTag="a" Height="53" Width="75" Content="Button1" /> <TextBox Name="TextBox1" mytype:wxdPanel.myTag="a" Height="23" Width="120" Text="TextBox1"/> <Button Name="Button2" mytype:wxdPanel.myTag="a" Height="53" Width="75" Content="Button2" /> <TextBox Name="TextBox2" mytype:wxdPanel.myTag="b" Height="23" Width="120" Text="TextBox2" /> <Button Name="Button3" mytype:wxdPanel.myTag="a" Height="53" Width="75" Content="Button3" /> <TextBox Name="TextBox3" mytype:wxdPanel.myTag="b" Height="23" Width="120" Text="TextBox3"/> </mytype:wxdPanel> </UserControl> |
效果
WPF的实现
与Silverlight 相同
再看一下WF的实现
场景:提供一个容器,放入容器内的件意Activity会多出一个明为[myTag]的属性,[myTag]属性设为[a]的执行,设为[b]的不执行
先创建这个容器Activity
[Designer(typeof(myDesigner), typeof(IDesigner))] public partial class myContainer : System.Workflow.ComponentModel.CompositeActivity { //- public static string GetmyTag(object obj) { DependencyObject dObject = obj as DependencyObject; object value = dObject.GetValue(myTagProperty); return value.ToString(); } public static void SetmyTag(object obj, string value) { DependencyObject dObject = obj as DependencyObject; dObject.SetValue(myTagProperty, value); } public static readonly DependencyProperty myTagProperty = DependencyProperty.RegisterAttached("myTag", typeof(string), typeof(myContainer), new PropertyMetadata("")); public static string GetleftValue(object obj) { DependencyObject dObject = obj as DependencyObject; object value = dObject.GetValue(leftValueProperty); return value.ToString(); } public static void SetleftValue(object obj, object value) { DependencyObject dObject = obj as DependencyObject; dObject.SetValue(leftValueProperty, value); } public static readonly DependencyProperty leftValueProperty = DependencyProperty.RegisterAttached("leftValue", typeof(string), typeof(myContainer), new PropertyMetadata("")); int n = 0; protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext) { n = this.EnabledActivities.Count; if (n == 0) { return ActivityExecutionStatus.Closed; } foreach (Activity activity in this.EnabledActivities) { n = n - 1; string l = myContainer.GetmyTag(activity); if (l == "a") { activity.Closed += new EventHandler<ActivityExecutionStatusChangedEventArgs>(activity_Closed); executionContext.ExecuteActivity(activity); } } return ActivityExecutionStatus.Executing; } void activity_Closed(object sender, ActivityExecutionStatusChangedEventArgs e) { ActivityExecutionContext executionContext = sender as ActivityExecutionContext; if (n == 0) { executionContext.CloseActivity(); } } } [ProvideProperty("myTag", typeof(Activity))] public class myExtenderProvider : IExtenderProvider { public bool CanExtend(object extendee) { return (((extendee != this) && (extendee is Activity)) && (((Activity)extendee).Parent is myContainer)); } //- public string GetmyTag(Activity activity) { if (activity.Parent is myContainer) { return activity.GetValue(myContainer.myTagProperty).ToString(); } return null; } public void SetmyTag(Activity activity, string value) { if (activity.Parent is myContainer) { activity.SetValue(myContainer.myTagProperty, value); } } } public class myDesigner : SequenceDesigner { protected override void Initialize(Activity activity) { base.Initialize(activity); IExtenderListService service = (IExtenderListService)base.GetService(typeof(IExtenderListService)); if (service != null) { bool tag = false; foreach (IExtenderProvider provider in service.GetExtenderProviders()) { if (provider.GetType() == typeof(myExtenderProvider)) { tag = true; } } if (!tag) { IExtenderProviderService tempService = (IExtenderProviderService)base.GetService(typeof(IExtenderProviderService)); if (tempService != null) { tempService.AddExtenderProvider(new myExtenderProvider()); } } } } } |
然后设计工作流
运行结果
WF,WPF,Silverlight的DependencyProperty 附加属性相关推荐
- C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(十八) 完美精灵之八面玲珑(WPF Only)②...
紧接着上一节,首先得解释一下为什么需要将这272张图片合成为一张大图.因为如果游戏中还有装备.坐骑等其他设置,那么我们就需要对图片源进行时时的合成:同时对272张甚至更多的图片进行合成效率高还是对2张 ...
- C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(四十九) 落雷!治疗!陷阱!连锁闪电!多段群伤!魔法之终极五重奏②...
本节,我将完成本教程示例游戏的最终两个魔法:传说中的连锁闪电与暴风雪.如此经典与华丽的家伙无论在哪款好游戏中都少不了它们的踪影. 首先是连锁闪电,在<英雄无敌>中体现得尤为出色,击中一个怪 ...
- C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(三十二) 雷、混、冰、毒、火、风 - 幻化中的魔法魅力!...
魔法的魅力不仅仅因为其华丽的外表,更深层次的,它们的额外附加属性效果使得游戏世界更加幻化多彩!无论是中式的金木水火土5行,还是欧式的水火风雷,异或是日式的风林火山等等,在目前的网游世界中无处不得到体现 ...
- WPF/Silverlight深度解决方案:(七)HLSL自定义渲染特效之完美攻略(中)
通过上一节的解说,大家是否已经对HLSL有了较深刻的认识和理解,HLSL的渲染不仅仅局限于静态处理,通过时时更新HLSL代码的各全局变量值同样可以实现动画形式的渲染,非常Cool对吧~.那么本节我将向 ...
- wpf 依赖属性和附加属性
原文:wpf 依赖属性和附加属性 1.依赖属性 解释:依赖属性是配合binding出现的产物,功能主要是配合binding. 作用: 一.当自定义usercontrol时,需要与宿主(父窗体)双向绑定 ...
- WPF/Silverlight Layout 系统概述——Measure(转)
前言 在WPF/Silverlight当中,如果已经存在的Element无法满足你特殊的需求,你可能想自定义Element,那么就有可能会面临重写MeasureOverride和ArrangeOver ...
- WPF/Silverlight深度解决方案:(十六)传值实现
许多开发者在从.NET网站开发向Silverlight转型过程中往往都会经历一个比较郁闷的过度期:Silverlight作为镶嵌在网页中的插件,如何能像传统ASP.NET网页一样实现页面切换及参数传递 ...
- C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(二十五)完美捕捉精灵之神器 -- HitTest...
怪物们都出现了,如何选中自己心仪的怪是主角目前首要做的事. 为了进行鼠标状态区别,我首先对鼠标变化规则进行约束:当鼠标在屏幕上空旷地图区域移动时,鼠标光标形态表现为默认光标 (0号光标图片),当鼠标经 ...
- C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(十)斜度α地图的构造及算法...
在当前的网络游戏中,地图基本都是采取一定斜度的拼装地图,这其中存在两种斜度地图的构造方式: 第一种我称之为伪斜度地图:该类型地图表现层图片为斜度的,但地图基底障碍物等的构造则实为正方形,如下图: 其实 ...
最新文章
- 混合云备份利用自定义Workflow保护MySQL的实践
- 最终一致性,一致只会迟到,但绝不会缺席
- 右左法则----复杂指针解析
- godaddy 管理mysql_在godaddy上使用MySQL和Entity Framework的安全例...
- java poi 设置公式_poi公式处理
- Apache-Shiro-权限缓存
- hbase scala 实例_scala操作HBase2.0
- 那些适用于跨境电商的ERP系统
- python反编译exe
- 如何放大缩小地图 和 移动拖动 地图 (一张的那种,厂区地图非世界地图)
- 如何用数据驱动的广告效果
- 怎么控制人物行走动画与移动
- SPSS 25.0中文版安装教程【001期】
- Web攻防之业务安全指南(网盘下载)
- 每日干货——每日分享技术干货App
- 软件测试的新技术和方法
- Spring boot——Actuator 详解
- some 和 every的区别和用法
- 大视频,经典电影想与海外亲人共享吗?酷达为您解难题
- 不使用函数实现字符串拼接函数strcat