1 回答

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超4個(gè)贊
您似乎遇到了依賴屬性值優(yōu)先級(jí)的問(wèn)題:在我看來(lái),您正在點(diǎn)擊處理程序中設(shè)置本地值(鏈接優(yōu)先級(jí)列表中的#3),并且覆蓋了控件模板設(shè)置的值觸發(fā)器(優(yōu)先列表中的#4a)。
您唯一想要混合優(yōu)先級(jí)的情況是當(dāng)您明確想要替換以默認(rèn)樣式或基類或類似性質(zhì)完成的內(nèi)容時(shí)。
但是您的方法無(wú)論如何都不是最好的主意:理想情況下,您編寫 WPF 控件就像一個(gè)無(wú)法訪問(wèn)源代碼的陌生人將不得不編寫默認(rèn)樣式和默認(rèn)模板一樣。然后你像陌生人一樣編寫你的默認(rèn)模板。模板可能需要知道的任何內(nèi)容都應(yīng)該清楚地公開(kāi)為屬性。
這并不總是可行的,但我將演示如何在這種情況下做到這一點(diǎn)。
藍(lán)色畫筆表示一種狀態(tài):按鈕已被點(diǎn)擊。該狀態(tài)未顯式存儲(chǔ)或暴露在任何地方,它只是隱含在屬性的值中GridColor
(您實(shí)際上應(yīng)該將其命名為GridBrush
or?GridBackground
,因?yàn)樗皇?code>Color)。
因此,讓我們?yōu)樵摖顟B(tài)添加一個(gè)只讀依賴屬性,并將有關(guān)畫筆顏色的決定推到它所屬的模板中。這真的很強(qiáng)大,因?yàn)槿绻阆胱屢恍┬值芸丶鶕?jù)我們的狀態(tài)改變它的HasBeenClicked
狀態(tài),你可以只在父視圖中添加一個(gè)綁定。
HasBeenClicked
如果您希望控件的使用者能夠以編程方式或通過(guò)綁定更改該狀態(tài),您還可以創(chuàng)建一個(gè)常規(guī)的讀/寫依賴屬性。
//? 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 關(guān)注
- 126 瀏覽
添加回答
舉報(bào)