Подтвердить что ты не робот

Ссылка на ресурс в ResourceDictionary из другого ResourceDictionary в Silverlight

У меня есть следующий набор кода в моем App.xaml:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/Client.Common;component/Theme/Brushes.xaml"/>
            <ResourceDictionary Source="/Client.Common;component/Theme/Fonts.xaml"/>
            <ResourceDictionary Source="/Client.Common;component/Theme/CoreStyles.xaml"/>
            <ResourceDictionary Source="/Client.Common;component/Theme/SdkStyles.xaml"/>
            <ResourceDictionary Source="/Client.Common;component/Theme/MyAppName.xaml"/>

            <ResourceDictionary Source="/Client.Common;component/Controls/NavigationPanel.xaml"/>
         </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

NavigationPanel.xaml содержит стиль, который выглядит так:

<Style x:Key="NavigationPanelListBox" TargetType="ListBox">
    <Setter Property="Background" Value="{StaticResource DarkBackground}" />
    <Lots of XAML>
</Style>

{StaticResource DarkBackground} определяется в файле Brushes.xaml (т.е. первый словарь ресурсов). Он определяется как

<SolidColorBrush x:Key="DarkBackground" Color="#FF707176" />

в словаре ресурсов.

Во время выполнения я получаю следующую ошибку:

Cannot find a Resource with the Name/Key DarkBackground [Line: 16 Position: 44]

Номера строк и позиции ссылаются на словарь ресурсов NavigationPanel.xaml в файле app.xaml.

Я могу ссылаться на кисть с других элементов управления, а не на словарь ресурсов.

Почему я не могу ссылаться или почему он не разрешает ссылку на ресурс, который выше в иерархии объединенного ресурсного словаря? Что мне здесь не хватает?

4b9b3361

Ответ 1

Вы ссылаетесь на кисть DarkBackground в любом из ресурсов в словаре NavigationPanel?

Если вам, возможно, потребуется объединить словарь ресурсов Brushes в словарь NavigationPanel.

Итак, в словаре NavigationPanel.

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="/Client.Common;component/Theme/Brushes.xaml" />
</ResourceDictionary.MergedDictionaries>

Ответ 2

Вы можете включить один словарь в другой (например, "использовать" на С#):

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation" 
    xmlns:uriMapper="clr-namespace:System.Windows.Navigation;assembly=System.Windows.Controls.Navigation"
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:Controls="clr-namespace:APC.IKM.UI.SL.Controls"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d">

    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="Brushes.xaml"/>
        <ResourceDictionary Source="Fonts.xaml"/>
        <ResourceDictionary Source="CoreStyles.xaml"/>
    </ResourceDictionary.MergedDictionaries>

Это то, что вы ищете? Хорошим примером этого является шаблон проекта Cosmopolitan/Metro.

Ответ 3

Ответ trully - это ответ Эрика на этом сайте: https://social.msdn.microsoft.com/forums/windowsapps/en-US/2be9a5f6-5313-448d-a9d9-296bac42215e/using-style-defined-in-merged-dictionary-from-another-merged-dictionary?forum=wpdevelop.

Brushes.xaml и NavigationPanel.xaml анализируются независимо, а затем добавляются в объединенный словарь ресурсов приложения, поэтому они ничего не знают друг о друге.