如何在WPF中使用控件模板将默认样式应用于样式

如何在WPF中使用控件模板将默认样式应用于样式,wpf,styles,controltemplate,Wpf,Styles,Controltemplate,在我的例子中,基于配置设置,网格线应该以不同的颜色显示 我已经用TargetType的CellValuePresenter定义了一个简单的样式,我注意到该样式应用于所有列,除了那些也具有TargetType的CellValuePresenter样式并且有自己的ControlTemplate的列。我在整个解决方案中为CellValuePresenter提供了许多带有ControlTemplates的样式,不可能将所有样式都更改为基于我创建的新样式 我的选项是什么,这样带有ControlTempla

在我的例子中,基于配置设置,网格线应该以不同的颜色显示

我已经用TargetType的CellValuePresenter定义了一个简单的样式,我注意到该样式应用于所有列,除了那些也具有TargetType的CellValuePresenter样式并且有自己的ControlTemplate的列。我在整个解决方案中为CellValuePresenter提供了许多带有ControlTemplates的样式,不可能将所有样式都更改为基于我创建的新样式

我的选项是什么,这样带有ControlTemplates的样式可以在不修改每个样式的情况下拾取我的更改

可以基于该元素的默认样式创建样式,以便它也包括隐式样式中的所有setter

比如说,

<Style TargetType="{x:Type CellValuePresenter}">
    <!-- Generic Style Setters -->
</Style>

<!-- This Style will include the setters from the implicit style above -->
<Style x:Key="CustomCellStyle"
       TargetType="{x:Type CellValuePresenter}"
       BasedOn="{StaticResource {x:Type CellValuePresenter}}">

    <Setter Property="ControlTemplate" ... />

</Style>
可以基于该元素的默认样式创建样式,以便它也包括隐式样式中的所有setter

比如说,

<Style TargetType="{x:Type CellValuePresenter}">
    <!-- Generic Style Setters -->
</Style>

<!-- This Style will include the setters from the implicit style above -->
<Style x:Key="CustomCellStyle"
       TargetType="{x:Type CellValuePresenter}"
       BasedOn="{StaticResource {x:Type CellValuePresenter}}">

    <Setter Property="ControlTemplate" ... />

</Style>

不幸的是,样式并不像在CSS中那样应用,所以在样式彼此建立的地方,您最终会得到什么是不明确的

如果为类型创建样式,则该样式将应用于样式范围内的所有类型。这意味着,如果您在app.xaml的顶部包含它,则所有内容都会受到影响,但如果您仅为用户控件或window.xaml包含它,则它仅适用于该控件

如果创建样式并将其应用于特定控件,则本地样式集将替代基于全局类型的样式集。除非你使用BasedOn,你明确地说你不能这样做


不幸的是,我认为您将被迫重构处理样式的方式,以获得您试图实现的外观,BasedOn将是一条出路。

不幸的是,样式不像CSS中的样式那样适用,因此您最终会得到什么,样式是如何相互建立的,这一点并不含糊

如果为类型创建样式,则该样式将应用于样式范围内的所有类型。这意味着,如果您在app.xaml的顶部包含它,则所有内容都会受到影响,但如果您仅为用户控件或window.xaml包含它,则它仅适用于该控件

如果创建样式并将其应用于特定控件,则本地样式集将替代基于全局类型的样式集。除非你使用BasedOn,你明确地说你不能这样做


不幸的是,我认为你将被迫重构你如何处理你的风格,以获得你想要的外观,BasedOn将是一种方法。

我不能使用BasedOn属性,因为我有太多的ControlTemplate样式,并且默认情况下也不会强制使用任何未来样式。@SujithJagini您可以尝试将隐式基础样式放入,因为这些样式通常应用于整个应用程序,而不管模板边界如何,与中的样式或其他.Resources不同。我不确定这是否适用于您的设置程序,因为我只使用了一些常见的样式设置程序(如字体颜色)进行了测试。我无法使用BasedOn属性,因为我有太多的样式与ControlTemplate一起使用,并且默认情况下也不会强制使用任何未来样式。@SujithJagini您可以尝试将隐式基本样式放置在,与中的样式或其他.Resources中的样式不同,这些样式通常应用于应用程序范围,而不考虑模板边界。我不确定这是否适用于您的设置程序,因为我只使用了一些常见的样式设置程序(如字体颜色)进行了测试。