代码之家  ›  专栏  ›  技术社区  ›  Rodney

如何在SL4页面中定义资源和带有键的MergeDictionary

  •  9
  • Rodney  · 技术社区  · 14 年前

    这可能是个很愚蠢的问题,但我搞不懂。

    我有一个定义了MergeDictionary的页面:

      <navigation:Page.Resources>
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="../Assets/TourneySetupStyles.xaml"/>
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
        </navigation:Page.Resources>
    

    我引用了TourneySetupStyles.xaml文件在我的XAML中,像这样毫无问题:

    <TextBlock Text="Tourney Name:" Style="{StaticResource TourneySetupTextStyle}" />
    

    但是,现在我需要添加另一个页面资源,如下所示:

    但设计师现在发出警告:

    所以我给我的ResourceDictionary添加了一个键,如下所示:

       <navigation:Page.Resources>
             <local:Tournament x:Key="tournament" />
            <ResourceDictionary x:Key="whatever">
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="../Assets/TourneySetupStyles.xaml"/>
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
    
        </navigation:Page.Resources>
    

    警告就消失了。但现在我对TourneySetupStyles中的样式的引用不再有效:

    “找不到名为/Key TourneySetupTextStyle的资源”

    4 回复  |  直到 14 年前
        1
  •  8
  •   chadbr    14 年前

    我今天遇到了这个——我正在交叉编译WPF/Silverlight。

    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/mydll;component/folder/MyResDict.xaml" />
            </ResourceDictionary.MergedDictionaries>
    
            <LinearGradientBrush x:Key="OrangeGradient"
                                 EndPoint="0.5,1"
                                 MappingMode="RelativeToBoundingBox"
                                 StartPoint="0.5,0">
                <LinearGradientBrush.RelativeTransform>
                    <RotateTransform  CenterY="0.5"
                                      CenterX="0.5" />
                </LinearGradientBrush.RelativeTransform>
                <GradientStop Color="#FFF3801E" />
                <GradientStop Color="#FFEDB17E"
                              Offset="0.5" />
                <GradientStop Color="#FFF3801E"
                              Offset="1" />
            </LinearGradientBrush>
        </ResourceDictionary>
    </UserControl.Resources>
    

    我无法解释为什么-但我知道这是有效的。。。

        2
  •  1
  •   Rodney    14 年前

    叹息 声明的顺序似乎很重要,只要我将第一个资源下移,它现在就可以工作了:

    <navigation:Page.Resources>
        <ResourceDictionary x:Key="TourneySetupStyles">
                <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="../Assets/TourneySetupStyles.xaml"/>
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
        <local:Tournament x:Key="tourneySetupViewModel" />
    </navigation:Page.Resources>
    

    如果有人能解释为什么这会是伟大的未来参考。。。

        3
  •  0
  •   Scott Nimrod    14 年前

    我也遇到了同样的问题。

        <ResourceDictionary>
    
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Resources\Brushes\Brushes_Dictionary.xaml" />
                <ResourceDictionary Source="Resources\Storyboards\Storyboard_Dictionary.xaml" />
            </ResourceDictionary.MergedDictionaries>
    
        </ResourceDictionary>
    
    </Application.Resources>
    

        4
  •  0
  •   Simon Brangwin    11 年前

    是的,我刚被这个咬了一口。一旦Silverlight加载合并的资源字典,它就会删除您已经添加的所有本地资源!在我的例子中,我需要在initializeComponent()调用之前以编程方式添加一个资源,但是由于UserControl包含一个合并的ResourceDictionary,因此该资源将丢失。我知道这是Silverlight里的一只虫子。

    但是把本地资源放在ResourceDictionary之后,对于像你这样的案例是有效的,所以我投了赞成票。