強制設定和恢復依賴屬性值(類似WPF內建的Style.Trigger和Template.Trigger)

Jchkds發表於2024-04-05

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

相關文章