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

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属性就行了。

posted @ 2024-04-05 19:26  数字游民  阅读(12)  评论(0编辑  收藏  举报