ControlTemplate中的ContentControl不显示Border或Background

时间:2015-07-24 14:26:25

标签: wpf xaml

我有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的属性没有影响?

2 个答案:

答案 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>