怎么在c#项目中自定义MarkupExtension

  介绍

这篇文章给大家介绍怎么在c#项目中自定义MarkupExtension,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

标记扩展,顾名思义,就是对xaml的扩展,在xaml中,规定如果属性以{}开始及结束,就是标记扩展标记扩展指的是继承于MarkupExtension的类,首先我们通过一张图来看看WPF中有哪些已知的标记扩展。

怎么在c#项目中自定义MarkupExtension

看了这张图片之后是不是对这个MarkupExtension有一个常规的认识,你会发现这个在WPF中实在是太重要了,通过这个MarkupExtension我们能够实现绑定,资源等等一系列的操作,在介绍完这个之后,我们来看看,这个抽象的MarkupExtension基类到底是什么?里面包含些什么?怎么去使用它?

# region 程序集,WindowsBase.dll, v3.0.0.0//,C: \ Program 微软文件\参考文档组件\ \ \ v3.0 \ WindowsBase.dll框架   # endregion      using 系统;      namespace  System.Windows.Markup   {   ,//摘要:   ,//,为所有,XAML 标记扩展提供基类。   ,public  abstract  class  MarkupExtension   ,{//,才能摘要://,才能,初始化从,System.Windows.Markup.MarkupExtension 派生的类的新实例。   protected 才能MarkupExtension ();//,才能摘要:   ,,//,在派生类中实现时,返回一个对象,此对象被设置为此标记扩展的目标属性的值。   ,////才能,参数://才能,serviceProvider://,,,,可以为标记扩展提供服务的对象。   ,////,才能返回结果:   ,,//,将在扩展应用到的属性上设置的对象值。   public 才能abstract  object  ProvideValue (IServiceProvider  serviceProvider);   ,}   }

,其实看看里面的内容,仅仅提供了一个抽象的方法ProvideValue,我们在继承这个抽象类后需要去重载这个抽象方法,然后来实现自己的逻辑。

在对整个MarkupExtension介绍之后,我们可以对它进行一个总结,那就是:

XAML标记扩展语法格式:

& lt;元素对象对象属性="{扩展标记扩展标记属性=扩展属性值}"/祝辞
,,,这个是不是很熟悉,如果还是不够直观的话,我们可以通过代码来进行说明:,,,,,,

& lt; TextBox 文本=" {Binding 路径=ProductName} "/祝辞

再来一个复杂一些的例子吧

& lt; Popup  IsOpen=皗Binding 路径=IsSubmenuOpen, RelativeSource={RelativeSource  TemplatedParent}}“,位置=癛ight", x: Name=癝ubMenuPopup", Focusable=癴alse", AllowsTransparency=皌rue", PopupAnimation=皗DynamicResource  {x: Static  SystemParameters.MenuPopupAnimationKey}},/在

类似的这种我们在WPF中见到的是在是太多了,那么既然基类是一个抽象方法那么我们是不是可以通过重载这种方式来写自己的MarkupExtension呢?这个当然是可以的,我们可以通过下面的几个例子来进行相应的说明。

示例1:通过MarkupExtension绑定菜单项的图标属性。

我们知道,菜单项的图标属性可以通过下面的方式进行设置:

& lt; MenuItem 头=癗ew"比;   & lt;才能MenuItem.Icon>   ,,,& lt; Image 源=笆?cat.png"/比;   & lt;才能/MenuItem.Icon>   & lt;/MenuItem>

这个是MSDN介绍的常规方式,在这里我们可以通过三种不同的方式来达到这个目的,具体来看看是怎么实现的吧?

& lt; Menu  Grid.Column=?”;在   ,,,,,,,,,,& lt; MenuItem 头=拔谋尽氨?   ,,,,,,,,,,,,,,& lt; MenuItem 头=爸刈觥氨?   ,,,,,,,,,,,,,,,,,,& lt; MenuItem.Icon>   ,,,,,,,,,,,,,,,,,,,,,,& lt; Image 拉伸=癠niform",源=皗扩展:ImageBinding 重做}“祝辞& lt;/Image>   ,,,,,,,,,,,,,,,,,,& lt;/MenuItem.Icon>   ,,,,,,,,,,,,,,& lt;/MenuItem>   ,,,,,,,,,,,,,,& lt; MenuItem 头=俺废氨?   ,,,,,,,,,,,,,,,,,,& lt; MenuItem.Icon>   ,,,,,,,,,,,,,,,,,,,,,,& lt; Image 拉伸=癠niform",源=皗扩展:ImageBinding 撤销}“祝辞& lt;/Image>   ,,,,,,,,,,,,,,,,,,& lt;/MenuItem.Icon>   ,,,,,,,,,,,,,,& lt;/MenuItem>   ,,,,,,,,,,,,,,& lt; MenuItem 头=氨4嫠小氨?   ,,,,,,,,,,,,,,,,,,& lt; MenuItem.Icon>   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

怎么在c#项目中自定义MarkupExtension