Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Ошибка - Свойство "Resources" уже задано для "Main


Автор: 1datr 24.9.2014, 16:33
В MainWindow.xaml
Код


<Window.Resources>
        <ResourceDictionary Source="/PresentationFramework.Aero, Version=3.0.0.0, Culture=neutral, 
    PublicKeyToken=31bf3856ad364e35, ProcessorArchitecture=MSIL;component/themes/aero.normalcolor.xaml" />
        <CollectionViewSource x:Key="VCellContentCount"  />
        <Style x:Key="btnOccupied">
            <Setter Property="Control.FontWeight" Value="Bold"></Setter>         
        </Style>
    </Window.Resources>


В компоненте, используемом в MainWindow
Код

<UserControl.Resources>        
        <ResourceDictionary x:Name="PowerBtnCaptions">
            <base:String x:Key="true">ON</base:String>
            <base:String x:Key="false">OFF</base:String>           
        </ResourceDictionary>
    
        <ResourceDictionary x:Name="PowerBtnBrushes">
            <SolidColorBrush x:Key="true">Yellow</SolidColorBrush>
            <SolidColorBrush x:Key="false">Gray</SolidColorBrush>
        </ResourceDictionary>
    
        <ResourceDictionary x:Name="StackerErrors">
            <base:String x:Key="1">Ошибка привода</base:String>
            <base:String x:Key="2">Превышение момента ось Х</base:String>
            <base:String x:Key="3">Превышение момента ось Y</base:String>
            <base:String x:Key="4">Превышение момента ось Z</base:String>
            <base:String x:Key="5">Ошибка при референцировании</base:String>
        </ResourceDictionary>
    </UserControl.Resources>


При запуске происходит ошибка: 
Просмотр информации об ошибке
Цитата
System.Windows.Markup.XamlParseException произошло
  Message="Свойство "Resources" уже задано для "MainWindow".": номер строки "5" и позиция в строке "6".
  Source=PresentationFramework
  LineNumber=5
  LinePosition=6
  StackTrace:
       в System.Windows.Markup.XamlReader.RewrapException(Exception e, IXamlLineInfo lineInfo, Uri baseUri)
       в System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)
       в System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader, Boolean skipJournaledProperties, Object rootObject, XamlAccessLevel accessLevel, Uri baseUri)
       в System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream)
       в System.Windows.Application.LoadComponent(Object component, Uri resourceLocator)
       в WpfStacker.MainWindow.InitializeComponent() в d:\программы\beeVNCKirishi\WpfStacker\MainWindow.xaml:строка 1
       в WpfStacker.MainWindow..ctor() в D:\программы\beeVNCKirishi\WpfStacker\MainWindow.xaml.cs:строка 26
  InnerException: System.Xaml.XamlDuplicateMemberException
       Message="Свойство "Resources" уже задано для "MainWindow".": номер строки "5" и позиция в строке "6".
       Source=System.Xaml
       LineNumber=5
       LinePosition=6
       StackTrace:
            в System.Xaml.XamlObjectWriter.WriteEndObject()
            в System.Xaml.XamlWriter.WriteNode(XamlReader reader)
            в System.Windows.Markup.WpfXamlLoader.TransformNodes(XamlReader xamlReader, XamlObjectWriter xamlWriter, Boolean onlyLoadOneNode, Boolean skipJournaledProperties, Boolean shouldPassLineNumberInfo, IXamlLineInfo xamlLineInfo, IXamlLineInfoConsumer xamlLineInfoConsumer, XamlContextStack`1 stack, IStyleConnector styleConnector)
            в System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)
       InnerException: 

Автор: Ilya81 24.9.2014, 16:45
Дело в том, что свойство Resources у FrameworkElement и всего, что от него наследуется, имеет тип ResourceDictionary. За счёт интерфейса ICollection его можно напрямую не объявлять в XAML'е, а просто перечислять ресурсы, но никак не словари ресурсов. Так что либо один словарь ресурсов, либо коллекция ресурсов, но не несколько значений одновременно.

Если нужно дополнить несколько ресурсов словарями, пишите так:
Код

    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/PresentationFramework.Aero, Version=3.0.0.0, Culture=neutral, 
    PublicKeyToken=31bf3856ad364e35, ProcessorArchitecture=MSIL;component/themes/aero.normalcolor.xaml" />
            </ResourceDictionary.MergedDictionaries>
            <CollectionViewSource x:Key="VCellContentCount"  />
            <Style x:Key="btnOccupied">
                <Setter Property="Control.FontWeight" Value="Bold"></Setter>         
            </Style>
        </ResourceDictionary>
    </Window.Resources>

Автор: 1datr 24.9.2014, 17:07
Не понял, честно говоря. Привидите, пожалуйста, пример с двумя наборами ресурсов. Как сделать в ресурсах несколько наборов надписей с ключами чтобы потом к ним обращаться?

Добавлено через 10 минут и 12 секунд
Цитата(Ilya81 @ 24.9.2014,  16:45)
Дело в том, что свойство Resources у FrameworkElement и всего, что от него наследуется, имеет тип ResourceDictionary. За счёт интерфейса ICollection его можно напрямую не объявлять в XAML'е, а просто перечислять ресурсы, но никак не словари ресурсов. Так что либо один словарь ресурсов, либо коллекция ресурсов, но не несколько значений одновременно.

Если нужно дополнить несколько ресурсов словарями, пишите так:
Код

    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/PresentationFramework.Aero, Version=3.0.0.0, Culture=neutral, 
    PublicKeyToken=31bf3856ad364e35, ProcessorArchitecture=MSIL;component/themes/aero.normalcolor.xaml" />
            </ResourceDictionary.MergedDictionaries>
            <CollectionViewSource x:Key="VCellContentCount"  />
            <Style x:Key="btnOccupied">
                <Setter Property="Control.FontWeight" Value="Bold"></Setter>         
            </Style>
        </ResourceDictionary>
    </Window.Resources>

Написал так. Не помогает.

Автор: 1datr 24.9.2014, 17:30
Временно решил проблемму распределением ресурсов между разными элементов (вложенные ресурсы)

Автор: Ilya81 25.9.2014, 09:59
Цитата(1datr @  24.9.2014,  17:07 Найти цитируемый пост)
Привидите, пожалуйста, пример с двумя наборами ресурсов. Как сделать в ресурсах несколько наборов надписей с ключами чтобы потом к ним обращаться?

Что подразумевается под наборами ресурсов? ResourceDictionary - это словарь, т. е. одномерный список с ключами и значениями, каждый из них типа object, т. е. значением может быть любой тип данных. Но иерархию в самом ResourceDictionary не создать никак. MergedDictionaries всего лишь объединяет словари, но список остаётся одномерным.

Если хотите использовать ResourceDictionary как значение, то попробуйте так:
Код

    <UserControl.Resources>       
      <ResourceDictionary>        
        <ResourceDictionary x:Name="PowerBtnCaptions">
            <base:String x:Key="true">ON</base:String>
            <base:String x:Key="false">OFF</base:String>           
        </ResourceDictionary>
    
        <ResourceDictionary x:Name="PowerBtnBrushes">
            <SolidColorBrush x:Key="true">Yellow</SolidColorBrush>
            <SolidColorBrush x:Key="false">Gray</SolidColorBrush>
        </ResourceDictionary>
    
        <ResourceDictionary x:Name="StackerErrors">
            <base:String x:Key="1">Ошибка привода</base:String>
            <base:String x:Key="2">Превышение момента ось Х</base:String>
            <base:String x:Key="3">Превышение момента ось Y</base:String>
            <base:String x:Key="4">Превышение момента ось Z</base:String>
            <base:String x:Key="5">Ошибка при референцировании</base:String>
        </ResourceDictionary>  
      </ResourceDictionary>       
    </UserControl.Resources>

Только как в этом случае Вы планируете обращаться к элементам вложенных словарей? Может, больше подойдёт обычный Dictionary или ArrayList?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)