【问题标题】:Get a Resource from a ResourceDictionary with a key使用键从 ResourceDictionary 获取资源
【发布时间】:2012-06-07 01:32:16
【问题描述】:

我有一个 WPF 窗口,它应该从 XAML 文件加载两个矢量图像。 (每个都在一个单独的文件中,以便在表达式设计中进行修改。)

当我将 XAML 文件包含在 MergedDictionary 中时,它可以正常工作。 这是我使用的代码:

<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Images/LCCD logo.xaml" />
            <ResourceDictionary Source="Images/LCCD bottom image.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Window.Resources>

<Image Source="{Binding Source={StaticResource LCCDlogo}}" /> <!-- Simplified -->
<Image Source="{Binding Source={StaticResource LCCDbar}}" /> <!-- Simplified -->

但是,我现在需要向 Window 的资源添加更多内容。新资源属于这个 Window,所以我们希望它在同一个文件中,而不是在包含的文件中。

当我在&lt;Window.Resources&gt;&lt;ResourceDictionary&gt; 之间添加以下代码时,出现以下错误:

代码

<Style TargetType="{x:Type tab:FabTabItem}">
        <Setter Property="Header" Value="{Binding Path=LabelText}"/>
        <Setter Property="HeaderTemplate">
            <Setter.Value>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal" Margin="0,0,4,0">
                        <TextBlock Text="{Binding}" TextTrimming="CharacterEllipsis"/>
                    </StackPanel>
                </DataTemplate>
            </Setter.Value>
        </Setter>
    </Style>

警告

设计器不支持加载混合 'ResourceDictionary' 没有键的项目和其他项目相同 收藏。请确保“资源”属性不 包含没有键的“ResourceDictionary”项目,或者 'ResourceDictionary' 项是集合中的唯一元素。

所以我把&lt;ResourceDictionary&gt;标签改成这样:

<ResourceDictionary x:Key="Images">

但是,我现在不知道如何访问此词典中的资源。如何从名为 ResourceDictionary 的内部获取资源?


编辑

没关系。这会编译但不会运行。

错误是:

''Resources' 属性已在'MainWindow' 上设置。

我想我得换个方式了。

【问题讨论】:

    标签: wpf xaml resourcedictionary


    【解决方案1】:

    根据MergedResourceDictionary's 上的 MSDN 页面,在 MergedDictionary 中指定的资源字典中定义资源是合法的,但并不常见。从上面的页面。

    在指定为合并字典的 ResourceDictionary 中定义资源是合法的,可以作为指定 Source 的替代方法,也可以作为指定源中包含的任何资源的补充。但是,这不是常见的情况;合并字典的主要场景是合并来自外部文件位置的资源。如果您想在页面的标记中指定资源,通常应该在主 ResourceDictionary 而不是合并字典中定义这些资源。

    所以试试看它是否有效。

    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Images/LCCD logo.xaml" />   
                <ResourceDictionary Source="Images/LCCD bottom image.xaml" />
                <ResourceDictionary>
                    <Style TargetType="{x:Type tab:FabTabItem}">
                        <Setter Property="Header" Value="{Binding Path=LabelText}"/>
                        <Setter Property="HeaderTemplate">
                            <Setter.Value>
                                <DataTemplate>
                                    <StackPanel Orientation="Horizontal" Margin="0,0,4,0">
                                        <TextBlock Text="{Binding}" TextTrimming="CharacterEllipsis"/>
                                    </StackPanel>
                                </DataTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </ResourceDictionary>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>
    

    【讨论】:

    • 这看起来很有效,而且这是一个比我更好的答案。
    【解决方案2】:

    我最终将&lt;Style&gt; 进一步向下移动到文件中,移动到使用该样式的元素的父元素上。

    这不是最好的解决方案,但它确实有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-27
      相关资源
      最近更新 更多