WPF标记扩展的笔记

纪翰
2023-12-01

命名空间:http://schemas.microsoft.com/winfx/2006/xaml

语法: {}, 左右大括号

从System.Windows.Markup.MarkupExtension继承的类

 

 

X:Key, 保证唯一性,类似Dictionary的key, 一般用在ResourceDictionary里, 即用x:key定义ResourceDictionary的子项

 

 

X:Name,保证唯一性, 可以通过RuntimeNamePropertyAttribute把某个类型的Property映射到x:Name上。 典型的例子就是FrameworkElement的Name属性就是通过RuntimeNamePropertyAttribute映射到x:Name上的。

 

 

X:Type, 等于C#中的typeof()

 

 

X:Static, 用来引用Enum、Static、Const等变量

 

 

X:Null, 等于C#中的Nullable属性的值设置为null。

 

 

X:Array,用于构造数组, Type属性指定Array里的Template是什么类型

 

 

 

StaticResource用于xaml加载时使用ResourceDictionary中x:Key定义的资源,必须先定义再使用,不然会抛出异常。类似:“在“System.Windows.StaticResourceExtension”上提供值时引发了异常。”,行号为“7”,行位置为“14”。

无法找到名为“xxx”的资源。资源名称区分大小写。

 

 

DynamicResource同样是使用ResourceDictionary中x:key定义的资源,只不是系统编译时先用表达式占位符占位延迟加载,等真正使用时才会用实际值替换占位符。另外,DynamicResource支持嵌套引用追溯。FindResource方法的逻辑和它一样。但使用DynamicResource需要满足3者中的一个:

1.FrameworkElement或FrameworkContentElement上的DependencyProperty

2.Style中的Setter

3.FrameworkElement或者FrameworkContentElement类上的Freezable的Property,或者Setter值

所谓向前引用的意思就是说引用时尚未定义。

 

 

TemplateBinding类似{Binding RelativeSource={RelativeSource TemplatedParent}}, 或者{Binding RelativeSource={x:Static RelativeSource.TemplatedParent}} ,

 

 

ComponentResourceKey用在2个地方。1.公共资源供其他模块使用。2.重新模版化控件时,用到以前模版的的值。注意的是:a.必须是DynamicResource。b.ResourceId定义的key必须在程序集的Themes文件夹下的Generic.xaml里。c.TypeInTargetAssembly指定的类型只是为了确定是哪个程序集,并没有实际意义,类中可以不写任何逻辑。

 

Windows有5种主题:Aero,Classic,Luna,Royale, 以及Generic默认主题。 默认的wpf控件的theme 在C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\下,有PresentationFramework.Aero.dll、PresentationFramework.Classic.dll等 这些dll定义了控件的默认style。当系统没有在主题对应的xaml中找到定义时, 会去generic.xaml里查找。另外,程序集的AssemblyInfo.cs中的ThemeInfo用来指定Theme和Generic主题的来源位置。

 

 

ThemeDictionary,当控件被创建时,它的系统主题要么在它关联的xxx.Aero.dll\xxx.Classic.dll等AssemblyName.ThemeName.dll命名的dll中,要么在本身程序集AssemblyName.dll中。 如果我们需要更改这些已创建控件的系统默认主题行为,就需要新创建dll并包含你想要的Themes/ThemeName.xaml,这个dll就是重定义控件的主题行为。而要使用这个新dll,就要用到ThemeDictionary。

举个例子:比如Button在Aero主题的外观定义在FrameworkElement.Aero.dll中,现在需要重定义Button在Aero下的默认外观, 我们创建一个CustomButtonTheme.dll, 在这个dll的根节点创建Themes文件夹,然后在文件夹中创建Aero.NormalColor.xaml。继续在xaml中重新Button的Style。

我们的工程使用时,只需在ResourceDictionary.MergedDictionaries中添加<ResourceDictionarySource="{ThemeDictionary AssemblyName=CustomButtonTheme}"></ResourceDictionary>

 类似资料: