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 附加属性相关推荐

  1. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(十八) 完美精灵之八面玲珑(WPF Only)②...

    紧接着上一节,首先得解释一下为什么需要将这272张图片合成为一张大图.因为如果游戏中还有装备.坐骑等其他设置,那么我们就需要对图片源进行时时的合成:同时对272张甚至更多的图片进行合成效率高还是对2张 ...

  2. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(四十九) 落雷!治疗!陷阱!连锁闪电!多段群伤!魔法之终极五重奏②...

    本节,我将完成本教程示例游戏的最终两个魔法:传说中的连锁闪电与暴风雪.如此经典与华丽的家伙无论在哪款好游戏中都少不了它们的踪影. 首先是连锁闪电,在<英雄无敌>中体现得尤为出色,击中一个怪 ...

  3. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(三十二) 雷、混、冰、毒、火、风 - 幻化中的魔法魅力!...

    魔法的魅力不仅仅因为其华丽的外表,更深层次的,它们的额外附加属性效果使得游戏世界更加幻化多彩!无论是中式的金木水火土5行,还是欧式的水火风雷,异或是日式的风林火山等等,在目前的网游世界中无处不得到体现 ...

  4. WPF/Silverlight深度解决方案:(七)HLSL自定义渲染特效之完美攻略(中)

    通过上一节的解说,大家是否已经对HLSL有了较深刻的认识和理解,HLSL的渲染不仅仅局限于静态处理,通过时时更新HLSL代码的各全局变量值同样可以实现动画形式的渲染,非常Cool对吧~.那么本节我将向 ...

  5. wpf 依赖属性和附加属性

    原文:wpf 依赖属性和附加属性 1.依赖属性 解释:依赖属性是配合binding出现的产物,功能主要是配合binding. 作用: 一.当自定义usercontrol时,需要与宿主(父窗体)双向绑定 ...

  6. WPF/Silverlight Layout 系统概述——Measure(转)

    前言 在WPF/Silverlight当中,如果已经存在的Element无法满足你特殊的需求,你可能想自定义Element,那么就有可能会面临重写MeasureOverride和ArrangeOver ...

  7. WPF/Silverlight深度解决方案:(十六)传值实现

    许多开发者在从.NET网站开发向Silverlight转型过程中往往都会经历一个比较郁闷的过度期:Silverlight作为镶嵌在网页中的插件,如何能像传统ASP.NET网页一样实现页面切换及参数传递 ...

  8. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(二十五)完美捕捉精灵之神器 -- HitTest...

    怪物们都出现了,如何选中自己心仪的怪是主角目前首要做的事. 为了进行鼠标状态区别,我首先对鼠标变化规则进行约束:当鼠标在屏幕上空旷地图区域移动时,鼠标光标形态表现为默认光标 (0号光标图片),当鼠标经 ...

  9. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(十)斜度α地图的构造及算法...

    在当前的网络游戏中,地图基本都是采取一定斜度的拼装地图,这其中存在两种斜度地图的构造方式: 第一种我称之为伪斜度地图:该类型地图表现层图片为斜度的,但地图基底障碍物等的构造则实为正方形,如下图: 其实 ...

最新文章

  1. 混合云备份利用自定义Workflow保护MySQL的实践
  2. 最终一致性,一致只会迟到,但绝不会缺席
  3. 右左法则----复杂指针解析
  4. godaddy 管理mysql_在godaddy上使用MySQL和Entity Framework的安全例...
  5. java poi 设置公式_poi公式处理
  6. Apache-Shiro-权限缓存
  7. hbase scala 实例_scala操作HBase2.0
  8. 那些适用于跨境电商的ERP系统
  9. python反编译exe
  10. 如何放大缩小地图 和 移动拖动 地图 (一张的那种,厂区地图非世界地图)
  11. 如何用数据驱动的广告效果
  12. 怎么控制人物行走动画与移动
  13. SPSS 25.0中文版安装教程【001期】
  14. Web攻防之业务安全指南(网盘下载)
  15. 每日干货——每日分享技术干货App
  16. 软件测试的新技术和方法
  17. Spring boot——Actuator 详解
  18. some 和 every的区别和用法
  19. 大视频,经典电影想与海外亲人共享吗?酷达为您解难题
  20. 不使用函数实现字符串拼接函数strcat

热门文章

  1. Java 一维数组作为参数和返回值
  2. 五步让你玩转CocoaPods
  3. 曼昆《经济学原理》(第五版)习题解答 第三章 相互依存性与贸易的好处
  4. js笔记 - ajax中的get和post说明
  5. SQL取出每个产品的Top n 条记录
  6. 【Caffe实践】基于Caffe的人脸识别实现
  7. MySQL应用异常问题解决
  8. 让dwz 的表格或者表单显示竖滚动条的代码
  9. java编程点滴(3)--ubuntu下jdk的配置
  10. 18.DataGrid内绑定ComboBox和ListBox以及取值