2016-12-14 11 views
3

Я ищу способ поделиться ResourceDictionary между проектами.Общий проект с ресурсным словарем (xaml)

Добавление нового элемента в общий проект не предлагает словарь ресурсов. Он может быть создан в другом (основном) проекте и перетаскиваться. Но тогда я не могу изменить его параметры сборки для Page:

enter image description here

Идея заключается в том, чтобы загрузить словарь ресурсов как этот

var dictionary = new ResourceDictionary(); 
dictionary.Source = new Uri("/WpfApplication91;component/Dictionary2.xaml", UriKind.Relative); 

Это, очевидно, терпит неудачу в настоящее время с

Исключение типа 'System.IO.IOException' произошло в PresentationFramework.dll, но не было обработчиком d в коде пользователя

Дополнительная информация: Не удается найти ресурс 'dictionary2.xaml'.

Любые идеи?

ответ

2

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

Общий проект состоит из Project.shproj и Project.projitems файлов, откройте второй и найдите словарь там:

<ItemGroup> 
    <None Include="$(MSBuildThisFileDirectory)Dictionary.xaml" /> 
</ItemGroup> 

Добавить после этого

<ItemGroup> 
    <Page Include="$(MSBuildThisFileDirectory)Dictionary.xaml"> 
    <Generator>MSBuild:Compile</Generator> 
    <SubType>Designer</SubType> 
    </Page> 
</ItemGroup> 

это копия/паста вещь из обычного csproj для проекта WPF, содержащего Словарь.

Кажется, что это работает, хотя это действие сборки не отображается, когда проект загружается в Visual Studio. Добавление файлов в общий проект не влияет на это изменение вручную.

Теперь у меня есть общий проект, содержащий ресурсный словарь, yay!

ресурсов словаря могут быть объединены в словарях приложений, как если он находится в корневом каталоге проекта (для использования в качестве статического/динамического ресурса в XAML дизайнер):

<Application.Resources> 
    <ResourceDictionary > 
     <ResourceDictionary.MergedDictionaries> 
      <!-- doesn't really exists in project --> 
      <ResourceDictionary Source="Dictionary.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 

и/или загрузки вручную, например, с использованием этого pack Uri:

var dictionary = new ResourceDictionary() 
{ 
    Source = new Uri("pack://application:,,,/FlexProperty.xaml"), 
}; 
0

Эта проблема заключается в том, что вы указываете имя приложения. Вам нужно название проекта. Ниже, как сделать это в обоих XAML и код

<UserControl.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="/SharedProject1;Component/Dictionary2.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</UserControl.Resources> 

Или

var dictionary = new ResourceDictionary(); 
dictionary.Source = new Uri("/SharedProject1;component/Dictionary2.xaml", UriKind.Relative); 
+0

Неа, имя приложения должно работать нормально. Замена 'Dictionary2.xaml' на' Dictionary1.xaml' заставит мой код работать без проблем, но моя цель - нацелить словарь в общем проекте. Ваше изменение должно иметь какое-либо значение, потому что действие сборки по-прежнему «Нет». Вы можете создать такую ​​же структуру проекта (решение wpf, добавить общий проект, добавить словарь ресурсов, перенести его в общий проект) и поместить код в конструктор главного окна и сами убедиться. – Sinatr

+0

вы попробовали мой ответ? Поскольку ваш общий проект не является именем приложения. – Bryan

+0

* «Ваш общий проект также является именем приложения» * - я этого не понимаю. Нет необходимости ничего пытаться, он не будет работать до тех пор, пока действие сборки еще «Нет». – Sinatr

2

У меня была та же проблема. Существует решение для включения Xaml в совместные проекты, которые не требуют прямого редактирования файла .projitems.

Вам просто нужно добавить Xamarin в установку Visual Studio. (Я сделал это с VS Сообществе 2015.)

Теперь вы можете добавить XAML типы с помощью обычного диалога Visual Studio: Add Resource Dictionary

И правильное действие сборки доступно: Build action

Xaml в виртуальный проекты теперь собираются и выполняются, как ожидалось.

(Предположительно, это там, чтобы поддержать Xamarin Forms, но это работает для любого XAML документа.)

+0

Я добавил несколько скриншотов. –

+0

Вы используете общий проект в UWP-решении. Он не решает проблему моего решения WPF. – Sinatr

+0

Вы можете добавить общий проект в любой проект, который вы обычно сможете, включая проекты WPF. –