【问题标题】:WPF: Problem applying style to custom TabItem Header through ControlTemplate and ContentPresenter.ResourcesWPF:通过 ControlTemplate 和 ContentPresenter.Resources 将样式应用于自定义 TabItem 标题的问题
【发布时间】:2011-09-06 04:26:49
【问题描述】:

我正在尝试为 TabItem Header 编写自己的控件模板,并且已经获得了基本布局,但现在我希望将样式应用于 Header 的内容,例如操纵文本块的大小和字体.

为了对此进行测试,我在 tabitem 标题中放置了一个椭圆,并尝试通过样式用金色画笔填充该椭圆。但是,它不起作用。椭圆存在,并且正在应用控制模板,但椭圆的填充不是金色。 ContentPresenter.Resources 中的样式被忽略(Resharper 甚至将其变灰以证明这一点)。任何想法我做错了什么?谢谢。

代码如下:

    <TabItem>
    <TabItem.Template>
        <ControlTemplate x:Name="theTabItemControlTemplate" TargetType="{x:Type TabItem}">
            <Border BorderBrush="DarkBlue" BorderThickness="10">
                <Grid>
                    <ContentPresenter ContentSource="Header" RecognizesAccessKey="True">
                        <ContentPresenter.Resources>
                            <Style TargetType="{x:Type Ellipse}">
                                <Setter Property="Ellipse.Fill" Value="Gold"/>
                            </Style>
                        </ContentPresenter.Resources>
                    </ContentPresenter>
                </Grid>
            </Border>
        </ControlTemplate>
    </TabItem.Template>
    <TabItem.Header>
        <Ellipse Stroke="Black" StrokeThickness="2" Width="100" Height="30" Grid.Column="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
    </TabItem.Header>
</TabItem>

【问题讨论】:

    标签: wpf styles controltemplate tabitem contentpresenter


    【解决方案1】:

    将您的样式上移一级。即,将其移至 ControlTemplate.Resources,它会正常工作。我很不确定为什么问题中的代码不起作用。可能是因为 contentpresenter 中的控件已经在遇到样式时构建。

    <ControlTemplate x:Name="theTabItemControlTemplate" TargetType="{x:Type TabItem}">
                <ControlTemplate.Resources>
                    <Style TargetType="{x:Type Ellipse}">
                        <Setter Property="Fill" Value="Red"/>
                    </Style>
                </ControlTemplate.Resources>
                <Border BorderBrush="DarkBlue" BorderThickness="10">
            <Grid>
                <ContentPresenter ContentSource="Header" RecognizesAccessKey="True">
    
                </ContentPresenter>
            </Grid>
        </Border>
    </ControlTemplate>
    

    【讨论】:

    • 谢谢,效果很好。您可能对 ContentPresenter 资源是正确的 - 我确定我在某处看到了这个示例,所以它应该可以工作,但不用担心。顺便说一句,ReSharper 仍然感到困惑,因为样式仍然是灰色的。我猜它没有想到“ContentPresenter”元素可能会引入任何其他元素,包括椭圆。
    猜你喜欢
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 2019-03-11
    相关资源
    最近更新 更多