winrt xaml merged resources

2019-02-15 05:29发布

问题:

I need to separate application styles to several xaml files. But I also need to define some shared values like

<x:Double x:Key="SharedValue">100</x:Double>

in single file for use this value in styles defined in other files. For instance:

<Style x:Name="SomeStyle" TargetType="TextBox">
     <Setter Property="Width" Value="{StaticResource SharedValue}"/>
</Style>

and in another resource dictionary file:

<Style x:Name="AnotherStyle" TargetType="Button">
     <Setter Property="Height" Value="{StaticResource SharedValue}"/>
</Style>

But when I try to define merged resource dictionary in App.xaml file

<Application.Resources>
    <ResourceDictionary >
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="DefinedValues.xaml"/>
            <ResourceDictionary Source="Styles1.xaml"/>
            <ResourceDictionary Source="Styles2.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

I get this runtime exception:"Message = "Cannot find a Resource with the Name/Key SharedValue"

Can you tell me is it posible to do this and what I'm doing wrong? Thanks.

回答1:

Using merged dictionaries can get a bit tricky if you have dependencies between other merged dictionaries.

When you have multiple application-scope resources the order of the declare is important. They are resolved in the inverse order of the declare, so in your case you should have the order.

<Application.Resources>
<ResourceDictionary >
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="Styles1.xaml"/>
        <ResourceDictionary Source="Styles2.xaml"/>
        <ResourceDictionary Source="DefinedValues.xaml"/>

    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

Also, you may need to reference the other ResourceDictionary in Styles1.xaml. This worked for me in Styles1.xaml.

<ResourceDictionary "...">

  <ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="SharedValues.xaml" />
  </ResourceDictionary.MergedDictionaries>

  <Style x:Name="AnotherStyle"
         TargetType="Button">
    <Setter Property="Height"
            Value="{StaticResource SharedValue}" />
  </Style>
</ResourceDictionary>