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 关注
- 98 浏览
添加回答
举报