1 回答

TA貢獻1811條經驗 獲得超4個贊
您似乎遇到了依賴屬性值優先級的問題:在我看來,您正在點擊處理程序中設置本地值(鏈接優先級列表中的#3),并且覆蓋了控件模板設置的值觸發器(優先列表中的#4a)。
您唯一想要混合優先級的情況是當您明確想要替換以默認樣式或基類或類似性質完成的內容時。
但是您的方法無論如何都不是最好的主意:理想情況下,您編寫 WPF 控件就像一個無法訪問源代碼的陌生人將不得不編寫默認樣式和默認模板一樣。然后你像陌生人一樣編寫你的默認模板。模板可能需要知道的任何內容都應該清楚地公開為屬性。
這并不總是可行的,但我將演示如何在這種情況下做到這一點。
藍色畫筆表示一種狀態:按鈕已被點擊。該狀態未顯式存儲或暴露在任何地方,它只是隱含在屬性的值中GridColor
(您實際上應該將其命名為GridBrush
or?GridBackground
,因為它不是Color
)。
因此,讓我們為該狀態添加一個只讀依賴屬性,并將有關畫筆顏色的決定推到它所屬的模板中。這真的很強大,因為如果你想讓一些兄弟控件根據我們的狀態改變它的HasBeenClicked
狀態,你可以只在父視圖中添加一個綁定。
HasBeenClicked
如果您希望控件的使用者能夠以編程方式或通過綁定更改該狀態,您還可以創建一個常規的讀/寫依賴屬性。
//? This is not a good name, but I don't know what your semantics are.?
public bool HasBeenClicked
{
? ? get { return (bool)GetValue(HasBeenClickedProperty); }
? ? protected set { SetValue(HasBeenClickedPropertyKey, value); }
}
internal static readonly DependencyPropertyKey HasBeenClickedPropertyKey =
? ? DependencyProperty.RegisterReadOnly(nameof(HasBeenClicked), typeof(bool), typeof(Control1),
? ? ? ? new PropertyMetadata(false));
public static readonly DependencyProperty HasBeenClickedProperty = HasBeenClickedPropertyKey.DependencyProperty;
private void Button_Click(object sender, RoutedEventArgs e)
{
? ? HasBeenClicked = true;
}
在控制模板中:
<ControlTemplate.Triggers>
? ? <!--?
? ? The last applicable trigger wins: If both are true, GridColor will be Black?
? ? -->
? ? <Trigger Property="HasBeenClicked" Value="True">
? ? ? ? <Setter Property="GridColor" Value="DarkBlue"/>
? ? </Trigger>
? ? <Trigger Property="IsChecked" Value="True">
? ? ? ? <Setter Property="GridColor" Value="Black"/>
? ? </Trigger>
</ControlTemplate.Triggers>
- 1 回答
- 0 關注
- 120 瀏覽
添加回答
舉報