主要的错误是对元素模板的逻辑及其与风格的相互作用的错误理解。
-
在您的示例中,主边界显示边界,但它有一个硬指定的值:
<Border x:Name="Border" BorderThickness="0"
。至少,您需要将其更改为
<Border x:Name="Border" BorderThickness="{TemplateBinding BorderThickness}"
.
-
“鼠标悬停”状态的边框颜色在Template触发器中设置:
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="BorderBrush" TargetName="Border" Value="Black" />
因此,在这种状态下,与父元素属性的绑定将不再有效(其优先级低于模板触发器setter的优先级):
<Border x:Name="Border" ... BorderBrush="{TemplateBinding BorderBrush}">
因此,对于这种状态,为父元素的属性设置值是没有意义的。
一次不能为一个属性设置多个值。因此,如果以后需要在使用元素的地方触发同一属性的更改,则应该想出某种机制来禁用模板中的触发器。
解决。
在任何情况下,您都必须创建自己的全新模板,因为此模板的逻辑不允许您根据需要使用元素。
在创建模板时,首先,您需要立即决定哪些元素、参数和值是常量,以及以后需要在使用元素的地方配置哪些。
自定义参数(如果它们不是父元素的属性)主要通过两种方式设置:动态资源键(DynamicResource)或AttachedProperty(例如-Material Design包)。