我刚刚将.Net3.5的WPF应用程序更改为.Net4。这样做会导致我的所有全局样式停止工作。只有使用键明确设置的样式才有效。我做了一些研究,找出了导致这种情况的原因,并在一个简单的应用程序中重现了它。
我有一个简单的WPF应用程序,只包含一个带文本的按钮 - 没有样式或其他任何东西。我为App.Xaml的ResourceDictionary中的所有按钮定义了一个样式:
<Style TargetType="{x:Type Button}">
<Setter Property="Background" Value="Red"></Setter>
</Style>
我的按钮现在是红色 - 一切都很好。我现在将其移动到单独项目中的单独ResourceDictionary中。这是我想要保留所有共享样式的地方。该按钮仍为红色,我从App.xaml到SharedStyles.xaml的引用如下所示:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/StyleLib;component/SharedStyles.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
现在 - 我希望StyleLib的SharedStyles.xaml保存所有特定的样式定义,因此我在名为ButtonStyles.xaml的同一项目中创建了一个新文件,并在那里添加了资源。实际上 - 我也添加了另一种样式,并且明确使用了一个键(技术上我稍后添加了这个,所以这与发生的问题没有任何关系)。
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style TargetType="{x:Type Button}">
<Setter Property="Background" Value="Red"></Setter>
</Style>
<Style x:Key="Explicit" TargetType="{x:Type Button}">
<Setter Property="Background" Value="Blue"></Setter>
</Style>
</ResourceDictionary>
ButtonStyles.xaml是从SharedStyles.xaml引用的:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/StyleLib;component/ButtonStyles.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
现在 - 我的按钮控件不再设置样式了。实际上 - 它仍然在VS2010的预览窗口中显示为样式,但是当我运行应用程序时,它们没有被设置样式。如果我使用键“Explicit”显式引用样式,它们将获得此样式 - 因此成功包含该文件。
另一个有趣的事情是,如果我现在在SharedStyle.xaml中添加另一种样式 - 例如StackPanel的全局风格(这是我尝试过的) - 然后ButtonStyle.xaml中的全局风格神奇地开始工作..!
我现在的问题是,如果我做错了什么,或者这听起来像.Net4中的错误?对我来说听起来像个错误..这在.Net3.5中运行得很好!
答案 0 :(得分:3)
我觉得这很奇怪。这确实在.Net3.5中工作得很好,我看不出为什么它现在不能工作!
我将此报告为微软的一个错误。你可以view the bug report here。当他们确认文件时,具有孤立问题的解决方案的源代码也应该可用。