我对C# WPF很陌生,最近遇到了一个非常奇怪的问题。
我正在管理样式表 xaml 文件,如下图所示和代码。
文件结构
[ 应用xaml ]
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Styles/StyleText.xaml"/>
<ResourceDictionary Source="Styles/StyleButton.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
[ 样式文本.xaml ]
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="Red"/>
</Style>
[ StyleButton.xaml]
<Style TargetType="{x:Type Button}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<TextBlock x:Name="TblockTest" Background="Gray" Foreground="Blue">
<TextBlock.Resources>
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="Green"/>
</Style>
</TextBlock.Resources>
<ContentPresenter x:Name="CpCustomButton" ContentSource="Content"/>
</TextBlock>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="False">
<Setter TargetName="CpCustomButton" Property="TextBlock.Foreground" Value="Black"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
这些是重现问题的测试代码。
我想做的是忽略StyleButton.xaml中StyleText.xaml的样式,而不解决StyleText.xaml中文本块样式的键
如您所知,没有键的文本块样式将服务于全局样式,因此我不必为每个文本块插入烦人的"style={~~}"代码。
但是现在,我无法避免它感染控件模板内文本块的样式,用于其他控件(如按钮(。
正如你在StyleButton.xaml中看到的,我尝试了几件我能想到的事情,并在谷歌上搜索了很多次,但没有一个能清楚地解决这个问题。
按钮的内容始终以红色显示,这是 StyleText.xaml 解决的颜色。
我应该怎么做才能解决问题?
我还附上上面提到的测试溶液。
https://www.dropbox.com/s/no0j60px2qnl51y/WeirdProblem.zip
感谢阅读。
我下载了解决方案,这里有一个修复:将 TextBlock 前景样式从 TextBlock.Resources 移动到 ContentPresenter.资源,如下所示
<Style TargetType="{x:Type Button}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<TextBlock
x:Name="TblockTest"
Background="Gray"
Foreground="Blue">
<ContentPresenter x:Name="CpCustomButton" ContentSource="Content">
<ContentPresenter.Resources>
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="Green" />
</Style>
</ContentPresenter.Resources>
</ContentPresenter>
</TextBlock>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="False">
<Setter TargetName="CpCustomButton" Property="TextBlock.Foreground" Value="Black" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
我不确定为什么它没有使用TextBlock.Resources中的样式,因为它是ContentPresenter的父级。
希望有帮助。米甲