.Net4的WPF全局样式问题

时间:2010-04-29 11:57:46

标签: .net wpf .net-4.0 styles

我刚刚将.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中运行得很好!

1 个答案:

答案 0 :(得分:3)

我觉得这很奇怪。这确实在.Net3.5中工作得很好,我看不出为什么它现在不能工作!

我将此报告为微软的一个错误。你可以view the bug report here。当他们确认文件时,具有孤立问题的解决方案的源代码也应该可用。