我有Button
个自定义控件模板和Grid
兄弟。当网格可见时,按钮应使用TriangleUpPath
,否则应使用TriangleDownPath
。到目前为止一切都很好。
但我希望Path
周围有Border
。所以我想我可以设置BorderBrush
的{{1}},但这不起作用。我没有看到边境。 ContentControl的ContentControl
也是如此。
这是我最小的不工作的例子:
Background
正如你所看到的,我甚至试图将样式中的背景设置(到HotPink)无济于事。 当我在ContentControl周围有一个边框时,它会有所帮助。
但问题是:为什么<Button x:Name="_hideButton"
Grid.Row="0"
HorizontalAlignment="Right"
VerticalAlignment="Top"
Click="ToggleResultsVisibility">
<Button.Style>
<Style TargetType="Button" >
<Style.Resources>
<Path x:Key="TriangleUpPath"
Data="M 0,5 L 7,0 L 14,5"
Margin="3,3,0,0"
Stroke="Black"
StrokeThickness="1"/>
<Path x:Key="TriangleDownPath"
Data="M 0,0 L 7,5 L 14,0"
Margin="3,3,0,0"
Stroke="Black"
StrokeThickness="1"/>
</Style.Resources>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<ContentControl Margin="0,5,5,0"
Width="20"
Height="11"
BorderBrush="Magenta"
BorderThickness="1"
Background="Cyan">
<ContentControl.Style>
<Style TargetType="ContentControl">
<Setter Property="Background"
Value="HotPink"></Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding Visibility, ElementName=_resultsGrid}"
Value="Collapsed">
<Setter Property="Content"
Value="{StaticResource TriangleDownPath}"/>
</DataTrigger>
<DataTrigger Binding="{Binding Visibility, ElementName=_resultsGrid}"
Value="Visible">
<Setter Property="Content"
Value="{StaticResource TriangleUpPath}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Button.Style>
</Button>
<Grid x:Name="_resultsGrid"/>
- 属性和Background
- ContentControl的属性没有影响?
答案 0 :(得分:4)
default style for ContentControl不包含渲染边框和背景属性的方法,它只有ContentPresenter。
您需要自己为内容控件添加自定义模板,其中包含您需要的其他元素:
<ContentControl.Template>
<ControlTemplate TargetType="ContentControl">
<Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" >
<ContentPresenter
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
Cursor="{TemplateBinding Cursor}"
Margin="{TemplateBinding Padding}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Border>
</ControlTemplate>
</ContentControl.Template>
答案 1 :(得分:0)
这是因为BorderThickness / Brush不具备一些魔法属性,使得边框神奇地突然出现。
对于制作边框,您应该在某处使用<Border>
元素。
默认情况下,Button内部有一些Border。这就是在Button上设置BorderBrush / BorderThickness的原因。具体来说,Button的默认控件模板包含Border作为其最顶层元素之一,Border的定义类似于:
// the DEFAULT Button's control template
<ControlTemplate>
...
<Border BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
.... >
...here goes other things like textblock/content..
</Border>
...
</ControlTemplate>
所以,如你所见,它有一个边框,它的设置绑定到拥有控件,因此绑定到Button。 TemplateBinding将BBrush of Border绑定到拥有它的Button的BBrush。
现在,由于你完全重写/覆盖了Button的控件模板,它现在不包含任何Border,因此没有任何东西可以绘制边框。
尝试:
<Border BorderBrush=... BorderThickness=...>
<ContentControl ....
它应该是你想要的。
事后的想法:如果我理解你错了,你的意思是你在按钮内的ContentControl
上设置BorderBrush / Thickness&#39;模板没有在您的路径周围添加边框,然后出现意外。
这些属性仅在CC上可用,因为它们是常用的,它们来自基础Control
类。但ContentControl根本不使用它们。他们被忽略了。 ContentControl不会绘制任何边框,文本等.ContentControl显示其内容,而内容只是一个仅绘制自己的路径。因此,如上所述在ContentControl周围添加Border,或者更改资源并将每个Path包装到Border中并将其用作内容资源。
<Style.Resources>
<Border x:Key="TriangleUpPath"
BorderBrush=... BorderThickness=...
<Path Data="M 0,5 L 7,0 L 14,5"
.... />
</Border>
<Border x:Key="TriangleDownPath"
BorderBrush=... BorderThickness=...
<Path Data="M 0,0 L 7,5 L 14,0"
.... />
</Border>
</Style.Resources>