首页 > 其他分享 >强制设置和恢复依赖属性值(类似WPF内置的Style.Trigger和Template.Trigger)

强制设置和恢复依赖属性值(类似WPF内置的Style.Trigger和Template.Trigger)

时间:2024-04-05 19:33:23浏览次数:16  
标签:控件 Style Trigger Template 强制 dp 属性

WPF元素的依赖属性的值由众多规则决定,最高优先级的规则决定依赖属性的最终当前值。如 本地值 > 继承值 > 默认值。可以临时忽略一切规则,强制为依赖属性指定一个值,相当于强行插入一个最高优先级规则,后续可以删除此强制值(最高优先级规则),将依赖属性的值恢复成原来的计算规则。这个强制和恢复的过程,和Style.Trigger很像!

static void ApplyTempProperty(DependencyObject d, DependencyProperty dp, object tempValue)
{
    d?.SetCurrentValue(dp, tempValue);// 强制将dp的当前值设置成tempValue
}

static void RestoreProperty(DependencyObject d, DependencyProperty dp)
{
    d.InvalidateProperty(dp); // 恢复原来的值
    BindingOperations.GetBindingExpression(d, dp)?.UpdateTarget(); // 如果dp设置了绑定(d.SetBinding(dp,source)),在使用强制值期间源属性的值发生了变化,即使调用了InvalidateProperty(),dp不会被更新。此行代码可以强制读取数据源属性更新一下dp。
}

dependencyObject.ClearValue(DependencyProperty dp)是清除本地值,会把绑定表达式和显示赋值全部从dp的值计算规则中干掉。

利用临时赋值和恢复旧值,以及Microsoft.Xaml.Behaviors完全可以实现Style.Trigger的效果:条件发生,赋予指定值,条件消退,恢复成原值(不需要知道原值具体是什么值)。

可以先备份一下控件的Style属性,这样相当于一下子备份完控件的所有属性(控件模板是Style的Template属性值),然后将控件的Style设置成null,然后将控件属性设置成临时值,恢复时,只需要恢复Style属性就行了。

标签:控件,Style,Trigger,Template,强制,dp,属性
From: https://www.cnblogs.com/euvio/p/18116091

相关文章

  • Vue3 + TypeScript + Vite 初始项目搭建(ESLint、Prettier、Sass、Stylelint、husky、p
    仓库地址仓库地址:https://gitee.com/tongchaowei/vue-ts-vite-template项目源码下载:https://gitee.com/tongchaowei/vue-ts-vite-template/releases全局安装pnpm包管理工具执行如下命令在系统全局安装pnpm包管理工具:npmipnpm-g使用Vite脚手架创建Vue3......
  • C++ templates: (1)、类模板
    1、类模板定义(主模板)template<typenameT,typenameC=list<T>,intMAX=10>classStack{public:usingvalue_type=T;public:Stack(constT&a):m_oContainer{move(a)}{cout<<"Stack<T,list<T>>()"<<......
  • window.getComputedStyle会有性能问题吗
    window.getComputedStyle()方法被用来获取指定元素在浏览器中计算后的最终样式,包括继承样式、浏览器默认样式、用户自定义样式表、行内样式以及动画和过渡效果等。虽然它是一个非常有用的工具,但正如任何JavaScript操作一样,频繁或不当使用确实可能引发性能问题。以下是可能导致......
  • "sideEffects": [ "dist/*", "esm/**/style/*", "lib/**/
    这段配置出现在一个软件包的package.json文件中,具体是"sideEffects"字段。这个字段用于告知打包工具(如Webpack、Rollup等)哪些模块或文件可能存在副作用(sideeffects),以便在进行TreeShaking(摇树优化)时做出正确决策。TreeShaking是一种优化技术,旨在在打包过程中去除那些在......
  • D11-StyleControls安装到使用
    1.首先网上下载D11--StyleControls控件2.得到这个BPL文件后打开D11-选择Component-installpackages...--Add找到你下载的文件目录--直到安装完成--ok3.安装完成后目录下就会出现下图文件,当然这个时候还不能直接使用,要不然编译会出错。4.找到StyleControls_D11Alexandria.dpk(......
  • 【LAMMPS学习】五、LAMMPS命令(8) Pair_style 势
     5.命令 本部分描述了LAMMPS输入脚本的格式以及其中的命令如何用于定义LAMMPS模拟。主要包括以下内容。5.1.LAMMPS输入脚本5.2.输入脚本的解析规则5.3.输入脚本结构5.4.按类别划分的命令5.5.通用命令5.6.Fix命令5.7.compute命令5.8.Pair_style势所有LAMMP......
  • vue extends继承后修改template的解决方案
    vueextends继承后怎么注入虚拟DOM节点1.需求使用extends继承一个组件并在上面做功能的修改和扩展,同时需要小小修改一部分的template。2.extend原理使用extends时,你实际上是创建了一个新组件,它包含了父组件的所有选项和数据,但是你可以覆盖或添加新的选项。3.问题修改通过ext......
  • Go Template 常用疑难知识点
    前段时间,在项目开发中经常和go语言的HTMLLtemplate打交道,特意总结了几点我在使用中经常遇到不太明确的,比较纠结疑惑的知识点,巩固一下,也方便以后查找。​ 至于关于gotemplate的系统性的介绍说明,这是一篇我经常查看的文章,写的非常全面。1、作用域访问​ gotemplate中最常打交......
  • MongoTemplate基本使用
    分页/***mongo分页*/@TestpublicvoidtestPage(){intpageSize=10;intcurrentNo=0;Queryquery=newQuery();query.addCriteria(Criteria.where("username").is("小明"));longcount=mongoTemplate.count(query,User.class);longtot......
  • 2-13. 创建 ListView 中的 ItemTemplate
    上次作业漏了Row3另外补充一下,如果想要显示DarkEditorTheme的话,就需要开启EditorExtensionAuthoring然后就能开启DarkEditorTheme了创建ItemRowTemplate在Assets/Editor/UIBuilder下面新建UIDocument,起名叫ItemRowTemplate查看样例项目相关代......