如何编写 WPF 的标记扩展 MarkupExtension,即便在 ControlTemplate/DataTemplate 中也能生效 发布于 2018-05-29...利用自定义的标记扩展,我们能够为 XAML 中的属性提供各种各样种类的值,而不仅限于自带的那一些。...只要赋值的那个属性接受 Brush 类型,就不会出错。 然而……有小伙伴写了更加复杂的标记扩展,在标记扩展中还通过 serviceProvider 拿到了目标控件的一些属性。...中,XAML 标记扩展也是立即执行的,这就意味着当标记扩展中的 ProvideValue 执行时,还没有根据模板创建控件呢,那创建的是什么呢?...:流畅设计 Fluent Design System 中的光照效果 RevealBrush,WPF 也能模拟实现啦!。
的实现中,可以拿到 父菜单 的实例,可以订阅其 Loaded 事件,在这里更新 Visibility 属性。...重点说明 使用 MarkupExtension 的好处时,里面可以拿到操作的实例,属性等上下文信息,而如果只是写普通的 Converter,有些数据拿不到,使用 MarkupExtension 更灵活。...其它玩法 在 MarkupExtension.ProvideValue 中,除了返回属性对应的值,还可以返回 Binding,相当于在 XAML 中直接写 Binding,但好处是,这里可以拿到更多的上下文信息...下面这里例子,就是一个更复杂的写法(实际中没有必要)。...- 博客园 如何编写 WPF 的标记扩展 MarkupExtension,即便在 ControlTemplate/DataTemplate 中也能生效_walter lv 的博客 - CSDN 博客
如果你写了一个 MarkupExtension 在 XAML 当中使用,你会发现你在 MarkupExtension 中定时的属性是无法使用 XAML 绑定的,因为 MarkupExtension...问题 下面是一个很简单的 MarkupExtension,用户设置了什么值,就返回什么值。拿这么简单的类型只是为了避免额外引入复杂的理解难度。...非依赖对象中不能定义依赖属性,于是我们定义附加属性。 // 注意:这一段代码实际上是无效的。...在 Value 的 set 方法中得到的 value 值是一个 Binding 对象,而不是正常依赖属性中得到的绑定的结果;这意味着我们无法直接使用 Value 的值。...构造函数中的 attachedProperty 参数是需要定义的附加属性。
UWP 自定义标记扩展,也就是定义了一个可以在 xaml 使用的标记的方法 定义一个标记扩展需要满足下面条件 继承 MarkupExtension 类 重写 ProvideValue 返回值 在类上面添加...MarkupExtensionReturnTypeAttribute 指定返回的类 命名后缀是 Extension 字符串 有没有参数的构造函数 下面我简单写一个多语言支持的标记扩展,在界面使用多语言的时候我期望使用这个方式写多语言...MarkupExtension 多语言返回的是字符串,所以标记 MarkupExtensionReturnTypeAttribute 同时设置返回的类 [MarkupExtensionReturnType...(ReturnType = typeof(string))] public class LangExtension : MarkupExtension 添加一个静态字典,用于存放多语言字符串...代码请看 [MarkupExtensionReturnType(ReturnType = typeof(string))] public class LangExtension : MarkupExtension
[1] 后边提到的x:Array标记扩展使用的是。 标记扩展的语法是{标记扩展类 参数},所有的标记扩展类都是派生自System.Windows.MarkupExtension基类实现的。...x:Array 通过标记扩展提供对 XAML 中对象的数组的一般支持。需要注意的是,在 XAML 2009 中,x:Array定义为语言基元而不是标记扩展。...MarkupExtension仅提供一个简单的ProvideValue(IServiceProvider serviceProvider)方法来获取所期望的数值。...local:Add后的2是作为构造函数的参数,Value1=5则是给标记扩展中定义的属性Value1赋值。...由于MarkupExtension并非派生自DependencyObject,因此不能直接定义依赖属性,但可以通过定义一个依赖对象结合附加属性的方式实现扩展标记属性的绑定。
流畅设计 Fluent Design System 中的光照效果 RevealBrush,WPF 也能模拟实现啦!...然而古老的 WPF 项目也想解解馋怎么办? 于是我动手实现了一个! ---- 迫不及待看效果 ? ▲ 是不是很像 UWP 中的 RevealBorderBrush?...正如 叛逆者 在 如何评价微软在 Build 2017 上提出的 Fluent Design System? - 知乎 一文中说的,只需要极少的计算量就能完成。...WPF 不让我们实现自己的 Brush,所以只好用 MarkupExtension 绕道实现了。...在样式模板中,返回 this 以延迟提供值。
使用FrameworkElementFactory FrameworkElementFactory用于以编程的方式创建模板,虽然文档中说不推荐,但WPF中常常使用这个类,例如DisplayMemberTemplateSelector...值得庆幸的是WPF有足够长的历史,在这段历史里经过了无数人上上下下的折腾,上面提到的问题在10年前已经有人给出了解决方案:XamlWriter and Bindings Serialization。...首先,MarkupExtension及其派生类(如Binding)需要有一个TypeConverter以便可以序列化: internal class BindingConvertor : ExpressionConverter...CanConvertTo(ITypeDescriptorContext context, Type destinationType) { if (destinationType == typeof(MarkupExtension...System.Globalization.CultureInfo culture, object value, Type destinationType) { if (destinationType == typeof(MarkupExtension
这是因为在绑定中,null 可能是一个合理的值,可能会被故意用在绑定中来达到某种目的。...; 在 XAML 标记扩展 MarkupExtension 里面。...一次次绑定的源值是上一个绑定的目标值,于是这样的关系组合成一个绑定提供值的链条。链条中只要有一处不能提供合理的值,就会在绑定中得到 UnsetValue。...在模板应用到实际的控件之前,模板本身也会执行一次 Binding 和 MarkupExtension 的逻辑。...于是如果绑定需要依赖于实际的控件,那么实际上 Binding 和 MarkupExtension 会至少执行两次,其中第一次便是模板中的那一次。
我们为一段文字中的一个部分绑定了主窗口的的一个属性,于是我们使用 ElementName 来指定绑定源为 WalterlvWindow。...不过运行之后的截图显示,右键菜单中并没有如预期般出现绑定的字符串。 ?...使用 x:Reference 代替 ElementName 能够解决 以上绑定失败的原因,是 Grid.ContextMenu 属性中赋值的 ContextMenu 不在可视化树中,而 ContextMenu...如果调用去查找,得到的是 null。详见:WPF 中的 NameScope。...Properties inside a MarkupExtension cannot reference objects that reference the result of the MarkupExtension
默认的 WPF 的字体大小的单位是像素,如果想要将字体大小使用 pt 点表示,写在 xaml 里面是直接添加 pt 后缀。...但是此时如果在静态资源尝试定义的时候写上了 pt 将会在运行的时候提示无法转换 默认的单位是 Pixel 如下面代码写的 ?...pt 的字体显然比 pixel 的大 ?...using System.Windows.Markup; public class FontSizeExtension : MarkupExtension { [TypeConverter(...FontSize}" Text="林德熙是逗比"> 在使用 MarkupExtension
获取 WPF 的依赖项属性的值时,会依照优先级去各个级别获取。这样,无论你什么时候去获取依赖项属性,都至少是有一个有效值的。有什么方法可以获取哪些属性被显式赋值过呢?...如果是 CLR 属性,我们可以自己写判断条件,然而依赖项属性没有自己写判断条件的地方。 本文介绍如何获取以及显式赋值过的依赖项属性。...} } 这里的 value 可能是 MarkupExtension 可能是 BindingExpression 还可能是其他一些可能延迟计算值的提供者。...因此,你不能在这里获取到常规方法获取到的依赖项属性的真实类型的值。 但是,此枚举拿到的所有依赖项属性的值都是此依赖对象已经赋值过的依赖项属性的本地值。如果没有赋值过,将不会在这里的遍历中出现。...,同时有更好的阅读体验。
源码的下载地址在文章的最下边 多语言用的是资源文件建一个MyLanguage的资源文件再添加一个MyLanguage.en-US的资源文件如果你还想要 其它的语言可自己添加。...两个资源文件里写上你要的文本如下图这样,它们的名称是一样的只是值一个是中文一个是英文 ? ...GetString(stirng name)方法是得到根据名字得到资源里的值 CurrentCulture是中英文语言转换的 ResourceTask接口是一个管理接口它管理资源的我们通过它去实现 语言转换时把发送广播把页面上的所有文字转换成想要的语言...我们写一个 XAML 标记扩展类 public class MyResourceExtension : MarkupExtension, INotifyPropertyChanged, IHandle...Handle(LanguageChangedMessage message) { PropertyChanted(); } } 这个类我们要实现MarkupExtension
这种动态绑定资源 key 的功能,在 WPF 中没有被原生支持,所以还是得在网上找找解决方法。...ItemTemplate 设置了一个 DataTemplate,里面通过 TextBlock 来绑定键值对中的 Key。...ResourceBinding ImageResourceKey}"/> /// /// public class ResourceBinding : MarkupExtension...throw new NotImplementedException(); } } #endregion } } 主要就是继承 MarkupExtension...{ "en-us", "zh-cn" }; /// /// 移除语言资源 /// /// 需要移除的资源中包含的
当我们对 Window 类型写一个附加属性的时候,在属性变更通知中我们需要判断依赖对象是否是一个窗口。但是,如果直接判断是否是 Window 类型,那么在设计器中这个属性的设置就会直接出现异常。...在 WPF 的设计器中,这个属性会被设计器重写元数据,指定其值为 true,而其他默认的情况下,它的默认值都是 false。 所以通过判断这个值可以得知此时是否是在设计器中使用此附加属性。...return; } 我在这些博客中使用过这样的判断方法,可以参见源码: 流畅设计 Fluent Design System 中的光照效果 RevealBrush,WPF 也能模拟实现啦!...如何编写 WPF 的标记扩展 MarkupExtension,即便在 ControlTemplate/DataTemplate 中也能生效 方法二:判断设计时窗口 上面的方法是个通用的判断设计器中的方法...然而设计器中的类型我们不能直接引用到,所以可以考虑进行类型名称判断的方式。类型名称判断的方式会与 Visual Studio 的版本相关,所以实际上代码并不怎么好看。
概览 随着我们的应用程序越来越受欢迎,我们的下一步将要开发多语言功能。...方便越来越多的国家使用我们中国的应用程序, 基于 WPF 本地化,我们很多时候使用的是系统资源文件,可是动态切换本地化,就比较麻烦了。...动态切换多语言思路: 把所有模块的资源文件添加到字典集合。 将资源文件里的key,绑定到前台。 通过通知更改 CurrentCulture 多语言来使用改变的语言文件里的key。...第一行是我们的主程序的数据展示,用于业务中的本地化 第二行是我们业务模块A的数据展示 第三行是我们业务模块B的数据展示 来看一下xaml展示 ? 通过ComboBox选择来切换语言 ?...dependencyObject.SetValue(ResourceManagerProperty, value); } } public class LocExtension : MarkupExtension
其是从进来的流数据中选取的字段。 关键看这个虚拟key是什么类型。...KeyedStream, String> KeyedStream5 = map.keyBy(tuple -> tuple.f1); 我的博客即将同步至腾讯云
JS中的phototype 原型法设计模式 ? JS中的phototype.png 原型法的主要思想是,现在有1个类A,我想要创建一个类B,这个类是以A为原型的,并且能进行扩展。我们称B的原型为A。...javascript中的每个对象都有prototype属性 prototype属性:返回对象类型原型的引用 prototype就是“一个给类的对象添加方法的方法”,使用prototype属性,可以给类动态地添加方法...javascript的方法可以分为三类 a 类方法 People.sleep = function(){console.log('I Am Sleeping ...')}
点击标题下「大数据文摘」可快捷关注 [今日3篇文章] 1.数据中的城市,城市中的数据 2.解密:“女博士”如何领导美帝神秘机构DARPA 3.2014年可穿戴设备之非官方报告 作者:凯尔·格雷科(Kael...这个方法中使用了模块化的优化方案,例如同一个网络中的计算机以一种能够把内部互联中断的总量减到最小的方式组织起来。结果中的每一个子群落都代表了一个通勤者居住和工作的主要地区。...通过概率变换,我们将收集到的OD交通数据转化为具体的地理信息系统(GIS)中的路段数据库中的信息,我们有可能对各种交通出行人群对于整体运输网络的影响进行量化——这表明建设一个细致全面的实时通勤展示系统是可能的...我们会继续对这些思考中的问题进行研究,城市的文化脉络将会在寻找答案的过程中成为为我们指明关注方向的核心要素。...在这个细致往复的过程中,我们在空间的框架之下和之外都进行了研究,我们希望能够建立一系列模型,来找到研究城市与生活在城市中的各种社会群体的新方法。
问题出在请求中的头信息(header)。 有的服务端有洁癖,不喜欢程序来触摸它。这个时候你需要将你的程序伪装成浏览器来发出请求。请求的方式就包含在header中。 ...url中是不能出现一些特殊的符号的,有些符号有特殊的用途。...我们知道以get方式提交数据的时候,会在url中添加key=value这样的字符串,所以在value中是不允许有'=',因此要对其进行编码;与此同时服务器接收到这些参数的时候,要进行解码,还原成原始的数据...中的键值对以连接符&划分 将dict或者包含两个元素的元组列表转换成url参数。...通过BeautifulSoup 的 find_all方法,找出所有a标签中的href属性中包含http的内容,这就是我们要找的网页的一级链接( 这里不做深度遍历链接) 并返回符合上述条件的a标签的href
领取专属 10元无门槛券
手把手带您无忧上云