MergedDictionaries和跨程序集的共享样式

时间:2013-03-27 11:29:50

标签: silverlight windows-phone-7 xaml windows-phone-8 windows-phone

也许有人会帮助我。我一直在努力寻找在WindowsPhone项目上共享样式和资源的解决方案。

问题如下:

我有一个由两个WP项目使用的通用程序集。在这个程序集中,我定义了一些样式和数据表。我希望在公共程序集中定义一个datatemplates,并将其作为项目的默认datatemplate。

程序集资源字典示例代码:

<Style TargetType="TextBlock" x:Key="TopItemsTitle">
    <Setter Property="FontSize" Value="18"></Setter>
    <Setter Property="FontFamily" Value="Segoe WP Black"></Setter>
    <Setter Property="Foreground" Value="Red"></Setter>
</Style>

<DataTemplate x:Key="TopItemsTemplate">
    <Button>
        <TextBlock x:Name="Name"
                   Grid.Row="1"
                   Width="172"
                   Height="25"
                   Margin="0,6,0,50"
                   VerticalAlignment="Bottom"
                   Text="{Binding Name}"
                   TextWrapping="Wrap" 
                   Style="{StaticResource TopItemsTitle}" />
    </Button>
</DataTemplate>

在不同的项目中,我想重新定义TopItemsTitle样式,例如:

<Style TargetType="TextBlock" x:Key="TopItemsTitle">
    <Setter Property="FontSize" Value="20"></Setter>
    <Setter Property="FontFamily" Value="Segoe WP"></Setter>
    <Setter Property="Foreground" Value="Blue"></Setter>
</Style>

然后合并WP项目的app.xaml中的两个资源字典:

<ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="/Assembly;component/Resources/Style.xaml" />
        <ResourceDictionary Source="Resources/LocalStyle.xaml" />
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

根据MSDN,这应该是可能的。但实际上这不起作用。 datatemplate不反映重新定义的样式并使用默认样式。

这是一个错误还是我做错了?

非常感谢任何形式的帮助。

1 个答案:

答案 0 :(得分:0)

我认为你误解了这篇文章。查找StaticResource始终从元素开始,然后沿树向上走。

TopItemsTemplate在公共Style.xaml中定义,因此模板中的任何{StaticResource}引用都会首先在Button(找不到)中查找匹配,然后{ {1}}(未找到),然后是DataTemplate的{​​{1}}(已找到)。如果在ResourceDictionary中找不到任何内容,那么它将继续尝试在合并字典中找到一个。

如果将Style.xaml移动到另一个字典(因此合并的字典有3个源而不是2个),它可能会起作用,但我不是百分百肯定。