首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何编写 WPF 的标记扩展 MarkupExtension,即便在 ControlTemplateDataTemplate 中也能生效

如何编写 WPF 的标记扩展 MarkupExtension,即便在 ControlTemplate/DataTemplate 中也能生效 发布于 2018-05-29...利用自定义的标记扩展,我们能够为 XAML 中的属性提供各种各样种类的值,而不仅限于自带的那一些。...只要赋值的那个属性接受 Brush 类型,就不会出错。 然而……有小伙伴写了更加复杂的标记扩展,在标记扩展中还通过 serviceProvider 拿到了目标控件的一些属性。...中,XAML 标记扩展也是立即执行的,这就意味着当标记扩展中的 ProvideValue 执行时,还没有根据模板创建控件呢,那创建的是什么呢?...:流畅设计 Fluent Design System 中的光照效果 RevealBrush,WPF 也能模拟实现啦!。

1.7K10

WPF 使用 MarkupExtension 实现更灵活的属性赋值与控制

的实现中,可以拿到 父菜单 的实例,可以订阅其 Loaded 事件,在这里更新 Visibility 属性。...重点说明 使用 MarkupExtension 的好处时,里面可以拿到操作的实例,属性等上下文信息,而如果只是写普通的 Converter,有些数据拿不到,使用 MarkupExtension 更灵活。...其它玩法 在 MarkupExtension.ProvideValue 中,除了返回属性对应的值,还可以返回 Binding,相当于在 XAML 中直接写 Binding,但好处是,这里可以拿到更多的上下文信息...下面这里例子,就是一个更复杂的写法(实际中没有必要)。...- 博客园 如何编写 WPF 的标记扩展 MarkupExtension,即便在 ControlTemplate/DataTemplate 中也能生效_walter lv 的博客 - CSDN 博客

10800
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    WPF 让普通 CLR 属性支持 XAML 绑定(非依赖属性),这样 MarkupExtension 中定义的属性也能使用绑定了

    如果你写了一个 MarkupExtension 在 XAML 当中使用,你会发现你在 MarkupExtension 中定时的属性是无法使用 XAML 绑定的,因为 MarkupExtension...问题 下面是一个很简单的 MarkupExtension,用户设置了什么值,就返回什么值。拿这么简单的类型只是为了避免额外引入复杂的理解难度。...非依赖对象中不能定义依赖属性,于是我们定义附加属性。 // 注意:这一段代码实际上是无效的。...在 Value 的 set 方法中得到的 value 值是一个 Binding 对象,而不是正常依赖属性中得到的绑定的结果;这意味着我们无法直接使用 Value 的值。...构造函数中的 attachedProperty 参数是需要定义的附加属性。

    1.7K20

    win10 uwp 自定义标记扩展

    UWP 自定义标记扩展,也就是定义了一个可以在 xaml 使用的标记的方法 定义一个标记扩展需要满足下面条件 继承 MarkupExtension 类 重写 ProvideValue 返回值 在类上面添加...MarkupExtensionReturnTypeAttribute 指定返回的类 命名后缀是 Extension 字符串 有没有参数的构造函数 下面我简单写一个多语言支持的标记扩展,在界面使用多语言的时候我期望使用这个方式写多语言...MarkupExtension 多语言返回的是字符串,所以标记 MarkupExtensionReturnTypeAttribute 同时设置返回的类 [MarkupExtensionReturnType...(ReturnType = typeof(string))] public class LangExtension : MarkupExtension 添加一个静态字典,用于存放多语言字符串...代码请看 [MarkupExtensionReturnType(ReturnType = typeof(string))] public class LangExtension : MarkupExtension

    56610

    标记扩展(Markup Extension)

    [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,因此不能直接定义依赖属性,但可以通过定义一个依赖对象结合附加属性的方式实现扩展标记属性的绑定。

    42130

    如何使用代码创建DataTemplate(或者ControlTemplate)

    使用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

    2.1K20

    如何使用代码创建DataTemplate(或者ControlTemplate)

    使用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

    1.9K80

    如何在 WPF 中获取所有已经显式赋过值的依赖项属性

    获取 WPF 的依赖项属性的值时,会依照优先级去各个级别获取。这样,无论你什么时候去获取依赖项属性,都至少是有一个有效值的。有什么方法可以获取哪些属性被显式赋值过呢?...如果是 CLR 属性,我们可以自己写判断条件,然而依赖项属性没有自己写判断条件的地方。 本文介绍如何获取以及显式赋值过的依赖项属性。...} } 这里的 value 可能是 MarkupExtension 可能是 BindingExpression 还可能是其他一些可能延迟计算值的提供者。...因此,你不能在这里获取到常规方法获取到的依赖项属性的真实类型的值。 但是,此枚举拿到的所有依赖项属性的值都是此依赖对象已经赋值过的依赖项属性的本地值。如果没有赋值过,将不会在这里的遍历中出现。...,同时有更好的阅读体验。

    21040

    Caliburn.Micro学习笔记(四)----IHandle实现多语言功能

    源码的下载地址在文章的最下边 多语言用的是资源文件建一个MyLanguage的资源文件再添加一个MyLanguage.en-US的资源文件如果你还想要 其它的语言可自己添加。...两个资源文件里写上你要的文本如下图这样,它们的名称是一样的只是值一个是中文一个是英文 ?  ...GetString(stirng name)方法是得到根据名字得到资源里的值 CurrentCulture是中英文语言转换的 ResourceTask接口是一个管理接口它管理资源的我们通过它去实现 语言转换时把发送广播把页面上的所有文字转换成想要的语言...我们写一个 XAML 标记扩展类 public class MyResourceExtension : MarkupExtension, INotifyPropertyChanged, IHandle...Handle(LanguageChangedMessage message) { PropertyChanted(); } } 这个类我们要实现MarkupExtension

    87370

    WPF 判断一个对象是否是设计时的窗口类型,而不是运行时的窗口

    当我们对 Window 类型写一个附加属性的时候,在属性变更通知中我们需要判断依赖对象是否是一个窗口。但是,如果直接判断是否是 Window 类型,那么在设计器中这个属性的设置就会直接出现异常。...在 WPF 的设计器中,这个属性会被设计器重写元数据,指定其值为 true,而其他默认的情况下,它的默认值都是 false。 所以通过判断这个值可以得知此时是否是在设计器中使用此附加属性。...return; } 我在这些博客中使用过这样的判断方法,可以参见源码: 流畅设计 Fluent Design System 中的光照效果 RevealBrush,WPF 也能模拟实现啦!...如何编写 WPF 的标记扩展 MarkupExtension,即便在 ControlTemplate/DataTemplate 中也能生效 方法二:判断设计时窗口 上面的方法是个通用的判断设计器中的方法...然而设计器中的类型我们不能直接引用到,所以可以考虑进行类型名称判断的方式。类型名称判断的方式会与 Visual Studio 的版本相关,所以实际上代码并不怎么好看。

    34540

    DotNetCore 3.0 助力 WPF本地化

    概览 随着我们的应用程序越来越受欢迎,我们的下一步将要开发多语言功能。...方便越来越多的国家使用我们中国的应用程序, 基于 WPF 本地化,我们很多时候使用的是系统资源文件,可是动态切换本地化,就比较麻烦了。...动态切换多语言思路: 把所有模块的资源文件添加到字典集合。 将资源文件里的key,绑定到前台。 通过通知更改 CurrentCulture 多语言来使用改变的语言文件里的key。...第一行是我们的主程序的数据展示,用于业务中的本地化 第二行是我们业务模块A的数据展示 第三行是我们业务模块B的数据展示 来看一下xaml展示 ? 通过ComboBox选择来切换语言 ?...dependencyObject.SetValue(ResourceManagerProperty, value); } } public class LocExtension : MarkupExtension

    64120

    数据中的城市,城市中的数据

    点击标题下「大数据文摘」可快捷关注 [今日3篇文章] 1.数据中的城市,城市中的数据 2.解密:“女博士”如何领导美帝神秘机构DARPA 3.2014年可穿戴设备之非官方报告 作者:凯尔·格雷科(Kael...这个方法中使用了模块化的优化方案,例如同一个网络中的计算机以一种能够把内部互联中断的总量减到最小的方式组织起来。结果中的每一个子群落都代表了一个通勤者居住和工作的主要地区。...通过概率变换,我们将收集到的OD交通数据转化为具体的地理信息系统(GIS)中的路段数据库中的信息,我们有可能对各种交通出行人群对于整体运输网络的影响进行量化——这表明建设一个细致全面的实时通勤展示系统是可能的...我们会继续对这些思考中的问题进行研究,城市的文化脉络将会在寻找答案的过程中成为为我们指明关注方向的核心要素。...在这个细致往复的过程中,我们在空间的框架之下和之外都进行了研究,我们希望能够建立一系列模型,来找到研究城市与生活在城市中的各种社会群体的新方法。

    1.2K40

    python中的urllib模块中的方法

    问题出在请求中的头信息(header)。 有的服务端有洁癖,不喜欢程序来触摸它。这个时候你需要将你的程序伪装成浏览器来发出请求。请求的方式就包含在header中。    ...url中是不能出现一些特殊的符号的,有些符号有特殊的用途。...我们知道以get方式提交数据的时候,会在url中添加key=value这样的字符串,所以在value中是不允许有'=',因此要对其进行编码;与此同时服务器接收到这些参数的时候,要进行解码,还原成原始的数据...中的键值对以连接符&划分 将dict或者包含两个元素的元组列表转换成url参数。...通过BeautifulSoup 的 find_all方法,找出所有a标签中的href属性中包含http的内容,这就是我们要找的网页的一级链接( 这里不做深度遍历链接)  并返回符合上述条件的a标签的href

    2.2K10
    领券