WPF、C# 中资源字典的奇怪重写操作



我对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的父级。

希望有帮助。米甲

相关内容

  • 没有找到相关文章

最新更新