【问题标题】:Custom Control not using Theme自定义控件不使用主题
【发布时间】:2014-09-15 21:53:08
【问题描述】:

我的应用程序设置我们使用皇家主题:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/PresentationFramework.Royale;V3.0.0.0;31bf3856ad364e35;component\themes\Royale.NormalColor.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

然后我在同一个应用程序项目中有一个 CustomControl:

public class CustomerView : Control
{
    static CustomerView()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomerView), 
            new FrameworkPropertyMetadata(typeof(CustomerView)));
    }
}

 <Style TargetType="{x:Type local:CustomerView}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:CustomerView}">
                <TabControl>
                    <TabItem Header="Tab0" />
                    <TabItem Header="Tab1" />
                    <TabItem Header="Tab2" />
                </TabControl>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

这很有效,并且皇家主题的样式被应用于 Tabcontrol。但现在我想对选项卡项上的 Padding 做些小改动:

<Style TargetType="{x:Type local:CustomerView}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:CustomerView}">
                <TabControl>
                    <TabControl.ItemContainerStyle>
                        <Style TargetType="{x:Type TabItem}"
                               BasedOn="{StaticResource {x:Type TabItem}}">
                            <Setter Property="Padding"
                                    Value="20" />
                        </Style>
                    </TabControl.ItemContainerStyle>

                    <TabItem Header="Tab0" />
                    <TabItem Header="Tab1" />
                    <TabItem Header="Tab2" />
                </TabControl>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

现在 Royal 主题不应用于 TabControl 并返回 Aero 主题。是什么赋予了?我该如何解决这个问题?

【问题讨论】:

    标签: wpf styles themes custom-controls basedon


    【解决方案1】:

    我不确定为什么设置 ItemContainerStyle 会覆盖样式,但是如果您只是将其作为资源添加到 ControlTemplate 中,它将按预期工作

    <Style TargetType="{x:Type local:CustomerView}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:CustomerView}">
                <ControlTemplate.Resources>
                    <Style TargetType="{x:Type TabItem}" BasedOn="{StaticResource {x:Type TabItem}}">
                         <Setter Property="Padding" Value="20" />
                    </Style>
                </ControlTemplate.Resources>
                <TabControl>
                    <TabItem Header="Tab0" />
                    <TabItem Header="Tab1" />
                    <TabItem Header="Tab2" />
                </TabControl>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    

    希望这能解决您的问题。

    【讨论】:

    • 这很奇怪,你确定没有其他影响吗?
    • 我有一个非常简单的项目,如上所述。如果有帮助,我可以上传项目。您使用的是哪个版本的 VS?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-29
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多