编辑 wpf 控件模板但使用原始样式
Edit wpf control template but use original styles
有时我在编辑控件原始模板的副本时,不需要更改原始样式和颜色,而是想直接引用原始模板。
例如,我想更改 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>
要将默认 WPF
样式重用到 ComboBox
,请使用:
<Style TargetType="ComboBox">
<!-- Setters in need of change -->
</ Style>
如果你想继承你自己创建的Style
,你可以使用:
<Style TargetType="ComboBox" BasedOn="{StaticResource YourExistentStyle}">
<!-- Setters that need to change -->
</ Style>
是的,Combobox 不是基本的裸模板控件。在它的 ControlTemplate
中是一个它需要的唯一的 ToggleButton(因此它需要额外的特定于实例的 Style 模板)。一旦你引入了一个新的 ControlTemplate
,它现在就知道了。它不能引用原始 ControlTemplate
内部的 Style
模板,因为它不是它之外可用的资源。 Style 和 ControlTemplate 是不同的野兽。
你有两个选择。您要么采用该独特的 ToggleButton 样式模板并将其放在可以作为 StaticResource 访问的某个位置,然后通过正常 <ToggleButton Style="{StaticResource ComboBoxUniqueToggleButtonStyleKeyNameYouGiveIt}" ..../>
在 ControlTemplate
内的 ToggleButton 实例上引用它
(就像它在资源字典中一样,除了它会一直加载,这通常是不必要的)。
或者,您可以将其直接嵌入到您的 ControlTemplate
中,就像他们所做的那样 in the default style/controltemplate for ComboBox。
您可以通过 BasedOn
继承 Style
模板的一部分,但一次只能继承一个 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>
要将默认 WPF
样式重用到 ComboBox
,请使用:
<Style TargetType="ComboBox">
<!-- Setters in need of change -->
</ Style>
如果你想继承你自己创建的Style
,你可以使用:
<Style TargetType="ComboBox" BasedOn="{StaticResource YourExistentStyle}">
<!-- Setters that need to change -->
</ Style>
是的,Combobox 不是基本的裸模板控件。在它的 ControlTemplate
中是一个它需要的唯一的 ToggleButton(因此它需要额外的特定于实例的 Style 模板)。一旦你引入了一个新的 ControlTemplate
,它现在就知道了。它不能引用原始 ControlTemplate
内部的 Style
模板,因为它不是它之外可用的资源。 Style 和 ControlTemplate 是不同的野兽。
你有两个选择。您要么采用该独特的 ToggleButton 样式模板并将其放在可以作为 StaticResource 访问的某个位置,然后通过正常 <ToggleButton Style="{StaticResource ComboBoxUniqueToggleButtonStyleKeyNameYouGiveIt}" ..../>
在 ControlTemplate
内的 ToggleButton 实例上引用它
(就像它在资源字典中一样,除了它会一直加载,这通常是不必要的)。
或者,您可以将其直接嵌入到您的 ControlTemplate
中,就像他们所做的那样 in the default style/controltemplate for ComboBox。
您可以通过 BasedOn
继承 Style
模板的一部分,但一次只能继承一个 ControlTemplate
。
希望这对您有所帮助,我将撤回我的重复投票。