2013-12-05 7 views
1

Как получить доступ к ResourceDictionary из другого проекта в решении?доступ ResourceDictionary для разных проектов в решении

В файле Solution содержится несколько проектов. Один из этих проектов называется «Common» и содержит ресурс под названием SharedResource.xaml.

SharedResource.xaml в Коммон:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d"> 
     <ImageBrush x:Key="UserIcon" ImageSource="/Images\icon_user.png"/> 
    </ResourceDictionary> 

Это, как я пытался сделать SharedResource словарь использовать в одном из моих UserControls.

<UserControl x:Class="MasterDataManagement.View.DisplayMasterDataView" 
     xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
     xmlns:command="http://www.galasoft.ch/mvvmlight" 
     xmlns:common="clr-namespace:Common;assembly=Common" 
     mc:Ignorable="d" 
     d:DesignWidth="800" d:DesignHeight="600" d:DataContext="{Binding DisplayMasterDataViewModel, Source={StaticResource ViewModelLocator}}"> 

    <UserControl.Resources> 
     <ResourceDictionary> <!-- ERROR Each dictionary entry must have an associated key.--> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="pack://application:,,,/Common;component/Resources/SharedResources.xaml"/> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </UserControl.Resources> 

    <Grid> 
    <!-- Removed Content --> 
    </Grid> 
</UserControl> 

К сожалению, этот подход не работает, и я не уверен, что я пропустил. Приведенный выше код вызывает это сообщение об ошибке: каждая запись словаря должна иметь связанный ключ.

Любые мысли?

Примечания:

  • Я не могу поставить ResourceDictionary в App.xaml, потому что я создаю прямые экземпляры UserControl (что-то вроде UserControl uc = new DisplayMasterDataView()).
  • Только проект App.xaml из проекта, который настроен как проект StartUp, «выполнен». Мое решение состоит из одного MainProject (который задан как StartUp Project) и нескольких других проектов, которые используются в качестве модулей в MainProject. Теперь мне нужно использовать эти модули в моем основном проекте, который выполняется следующим образом:

    UserControl uc = new DisplayMasterDataView();

Я считаю, что создание экземпляра UserControl из другого проекта не выполняет App.xaml в проекте, которые состоят в UserControl. Поэтому для определения моих ресурсов я должен использовать <UserControl.Resources> </UserControl.Resources>. Я только что упомянул об этом, потому что в большинстве примеров проектов для определения ресурсов используется App.xaml.

+0

Опубликованный XAML завершен? Потому что я подозреваю, что вы определили некоторые ресурсы ниже ресурсного словаря, для которого вы не установили 'x: Key'. Или может быть в вашем ResourceDictionary есть еще один элемент, кроме Image, для которого вы не установили значение ключа. –

+0

SharedResource.xaml завершен, он содержит только один элемент с x: Key UserIcon. – Joel

+1

А как насчет 'UserControl.Resources'? –

ответ

0

Проект My WinView содержит файл ViewResources.xaml, в котором я размещаю все ресурсы, необходимые элементам управления в этом проекте. Он также содержит ссылки на другие файлы XAML в одном проекте:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 

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

    <!-- ==================== Data Templates ==================== --> 

    <DataTemplate DataType="{x:Type myNameSpace:MyViewModel}"> 
     <controls:MyUserControl MyProperty="{Binding ...etc...}" /> 
    </DataTemplate> 

</ResourceDictionary> 

Мой главный проект затем ссылается на это в App.xaml:

<ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 

      <!-- Main Theme --> 
      <ResourceDictionary Source="pack://application:,,,/WPF.Themes;component/BureauBlue/Theme.xaml" /> 

      <!-- Global Resources for Views --> 
      <ResourceDictionary Source="pack://application:,,,/MyProject.WinView;component/ViewResources.xaml" /> 
      <ResourceDictionary Source="pack://application:,,,/MyProject.WinUI;component/HelpResources.xaml" /> 

     ... and so on and so forth ... 

     </ResourceDictionary.MergedDictionaries> 

    </ResourceDictionary> 

</Application.Resources> 

Я не вижу, как это будет остановить вы сами создаете UserControls.

+1

Создание UserControls непосредственно из другого проекта в файле решения - проблема, обновленная моя почта с коротким объяснением. Но это означалось только в качестве примечания, это не сама проблема. Проблема заключается в сообщении об ошибке: каждая запись словаря должна иметь связанный ключ – Joel

2

Каждая запись словаря должен иметь соответствующий ключ ...

Конечно, что ошибка просто говорит вам, что вам нужно добавить ключ к ResourceDictionary с помощью x:Key обозначения ...в этом случае, «запись словаря» Ваш ResourceDictionary и «связанный ключ» является то, что вы называете это ссылаться на него позже, в моем примере ниже, «CommonResourceDictionary»:

<ResourceDictionary x:Key="CommonResourceDictionary"> 
    <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary 
Source="pack://application:,,,/Common;component/Resources/SharedResources.xaml"/> 
    </ResourceDictionary.MergedDictionaries> 
</ResourceDictionary> 
0

Здесь приходит решение, спасибо вы для указания меня в правильном направлении Rohit Vats!

не работает

<UserControl.Resources> 
    <gridView:RadContextMenuXamlHolder x:Key="ContextMenuHolder"> 
     <telerik:RadContextMenu DataContext="{Binding Path=UIElement.Column.DataControl.DataContext, RelativeSource={RelativeSource Self}}" InheritDataContext="False" 
           StaysOpen="True" x:Name="CellCellContextMenu" Placement="Bottom" Loaded="ContextMenu_OnLoaded"> 
      <telerik:RadMenuItem x:Name="ColumnsMenuEntry" Header="Choose Columns:" ItemsSource="{Binding Path=Menu.UIElement.Column.DataControl.Columns, RelativeSource={RelativeSource Self}}" StaysOpenOnClick="True"> 
       <telerik:RadMenuItem.ItemContainerStyle> 
        <Style TargetType="telerik:RadMenuItem"> 
         <Setter Property="Header" Value="{Binding Header}" /> 
         <Setter Property="IsChecked" Value="{Binding IsVisible, Mode=TwoWay}" /> 
         <Setter Property="IsCheckable" Value="True" /> 
        </Style> 
       </telerik:RadMenuItem.ItemContainerStyle> 
      </telerik:RadMenuItem> 
      <telerik:RadMenuItem Header="Show all columns" Click="RadMenuItem_ShowAllColumns_OnClick"/> 
      <telerik:RadMenuItem Header="Hide all columns" Click="RadMenuItem_HideAllColumns_OnClick"/> 
     </telerik:RadContextMenu> 
    </gridView:RadContextMenuXamlHolder> 

    <Style TargetType="telerik:GridViewHeaderCell"> 
     <Setter Property="telerik:RadContextMenu.ContextMenu" Value="{Binding Path=CellContextMenu, Source={StaticResource ContextMenuHolder}}"/> 
    </Style> 

    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="pack://application:,,,/Common;component/SharedResources.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</UserControl.Resources> 

Working

<UserControl.Resources> 
    <ResourceDictionary> 
     <gridView:RadContextMenuXamlHolder x:Key="ContextMenuHolder"> 
      <telerik:RadContextMenu DataContext="{Binding Path=UIElement.Column.DataControl.DataContext, RelativeSource={RelativeSource Self}}" InheritDataContext="False" 
           StaysOpen="True" x:Name="CellCellContextMenu" Placement="Bottom" Loaded="ContextMenu_OnLoaded"> 
       <telerik:RadMenuItem x:Name="ColumnsMenuEntry" Header="Choose Columns:" ItemsSource="{Binding Path=Menu.UIElement.Column.DataControl.Columns, RelativeSource={RelativeSource Self}}" StaysOpenOnClick="True"> 
        <telerik:RadMenuItem.ItemContainerStyle> 
         <Style TargetType="telerik:RadMenuItem"> 
          <Setter Property="Header" Value="{Binding Header}" /> 
          <Setter Property="IsChecked" Value="{Binding IsVisible, Mode=TwoWay}" /> 
          <Setter Property="IsCheckable" Value="True" /> 
         </Style> 
        </telerik:RadMenuItem.ItemContainerStyle> 
       </telerik:RadMenuItem> 
       <telerik:RadMenuItem Header="Show all columns" Click="RadMenuItem_ShowAllColumns_OnClick"/> 
       <telerik:RadMenuItem Header="Hide all columns" Click="RadMenuItem_HideAllColumns_OnClick"/> 
      </telerik:RadContextMenu> 
     </gridView:RadContextMenuXamlHolder> 

     <Style TargetType="telerik:GridViewHeaderCell"> 
      <Setter Property="telerik:RadContextMenu.ContextMenu" Value="{Binding Path=CellContextMenu, Source={StaticResource ContextMenuHolder}}"/> 
     </Style> 

     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="pack://application:,,,/Common;component/SharedResources.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</UserControl.Resources> 

хитрость заключается в том, чтобы переместить все ресурсы в <ResourceDictionary> </ResourceDictionary> тега.

+0

Я был уверен, что это должно быть где-то еще. :) –

+1

в любом случае ваш комментарий был действительно полезен для меня – Joel

Смежные вопросы