编辑wpf控件模板,但使用原始样式

时间:2017-03-08 19:56:48

标签: c# wpf xaml controltemplate

有时,当我编辑控件原始模板的副本时,我不需要更改原始样式和颜色,并且希望直接引用原始样式和颜色。

例如,我想更改ComboBox模板以在下拉列表中添加一些过滤按钮,其切换按钮指的是也会复制到文件中的样式。我想参考原始风格,以便我的XAML不会过于混乱。

编辑: 因此,这是您选择编辑副本时创建的XAML代码的一部分。 ControlTemplate是我想要改变的,但我不需要ComboBoxToggleButton样式,因此对于toggleButton,我想将它的样式设置为从中复制ComboBoxToggleButton样式的样式。是否存在一些存储在其中的命名空间,或者它们是否无法访问?

<Style x:Key="ComboBoxToggleButton" TargetType="{x:Type ToggleButton}">
     ...
</Style>

<ControlTemplate x:Key="ComboBoxTemplate" TargetType="{x:Type ComboBox}">
    <Grid x:Name="templateRoot" SnapsToDevicePixels="true">
        ...
        <ToggleButton x:Name="toggleButton" ... Style="{StaticResource ResourceKey=ComboBoxToggleButton}"/>
     </Grid>
</ControlTemplate>

大概是我喜欢它的样子

<Window xmlns:baseStyles="{namespace/url to the default wpf styles}">
<ControlTemplate x:Key="ComboBoxTemplate" TargetType="{x:Type ComboBox}">
    <Grid x:Name="templateRoot" SnapsToDevicePixels="true">
        ...
        <ToggleButton x:Name="toggleButton" ... Style="{StaticResource ResourceKey=baseStyles:ComboBoxToggleButton}"/>
     </Grid>
     <ControlTemplate.Triggers>
        ...
     </ControlTemplate.Triggers>
</ControlTemplate>

2 个答案:

答案 0 :(得分:1)

要将默认WPF样式重新用于ComboBox,请使用:

<Style TargetType="ComboBox">
<!-- Setters in need of change -->
</ Style>

如果您想继承自己创建的Style,可以使用:

<Style TargetType="ComboBox" BasedOn="{StaticResource YourExistentStyle}">
<!-- Setters that need to change -->
</ Style>

答案 1 :(得分:1)

是的,所以Combobox不是你基本的模板控制。在其中ControlTemplate是一个独特的ToggleButton(因此它的附加实例特定样式模板)是它所需要的。一旦你引入一个新的ControlTemplate而不是那个,现在它只知道了。它无法引用原始Style内的ControlTemplate模板,因为它不是其外部可用的资源。 Style和ControlTemplate是不同的野兽。

您有两种选择。您可以使用该唯一的ToggleButton样式模板并将其放在某处,可以作为StaticResource到达,并通过正常ControlTemplate<ToggleButton Style="{StaticResource ComboBoxUniqueToggleButtonStyleKeyNameYouGiveIt}" ..../>内的ToggleButton实例上引用它 (就好像它在资源词典中一样,除非它一直加载,而且通常是不必要的)。

或者,您可以将其直接嵌入ControlTemplate,就像他们in the default style/controltemplate for ComboBox一样。

您可以通过Style继承BasedOn模板的部分内容,但一次只能有一个ControlTemplate

希望这会有所帮助,我会撤回我的重复投票。