Ресурсы WPF в библиотеке классов в .NET 5

#c# #wpf #.net-5 #class-library

Вопрос:

Раньше, в .NET Framework, когда я создавал библиотеку классов WPF, у меня был файл App.xaml (заданный в качестве определения приложения), который ссылался на мои словари ресурсов таким образом:

 <Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="ResourceDictionary1.xaml" />
                <ResourceDictionary Source="ResourceDictionary2.xaml" />
                <ResourceDictionary Source="ResourceDictionary3.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>
 

Однако теперь, с .NET 5, я получаю эту ошибку компиляции:

Файл проекта библиотеки не может указать элемент определения приложения.

Таким образом, это сообщение означает, что у меня больше не может быть файла App.xaml в библиотеке классов. Но теперь я не знаю, как определить свои ресурсы глобально в библиотеке классов. Неужели нет никакого способа сделать это без ссылок на словари в каждом файле XAML в проекте?

Правка: Дело не в Source синтаксисе. Путь правильный, и все отлично компилируется, если я установлю проект в приложение Windows вместо библиотеки классов.

Комментарии:

1. Тип .net библиотеки классов должен совпадать с типом проекта.

2. Напишите, на какие платформы ориентирован ваш проект.

3.@EldHasp я использовал значение по умолчанию .Шаблон библиотеки классов NET 5 WPF <TargetFramework>net5.0-windows</TargetFramework> <UseWPF>true</UseWPF> , И я пытаюсь скомпилировать его в отладке для любого процессора. Но проблема возникает и на x64.

4. Я пытался как-то решить эту проблему, но у меня ничего не получалось. Возможно, по сути это действительно неприемлемо и требует другого подхода.

5. Я не могу воспроизвести проблему. У меня та же ошибка . Библиотека NET framework.

Ответ №1:

ссылаясь на эту проблему github : https://github.com/dotnet/wpf/issues/2812#issuecomment-607537794

В проекте WindowsDesktop в стиле SDK,

*.xaml все по умолчанию рассматриваются как элементы страницы, если только они не называются App.xaml (C#) или Application.xaml (VB).

По умолчанию App.xaml/Application.xaml обрабатывается как определение приложения.

 <!-- 
Disables automatic globbing of App.xaml/Application.xaml into 
ApplicationDefinition item
App.xaml/Application.xaml would now get treated as any other *.xaml file 
(typically, a Page)
--> 
<PropertyGroup>
  <EnableDefaultApplicationDefinition>false</EnableDefaultApplicationDefinition>
</PropertyGroup>
 

Стоит попробовать.

Комментарии:

1. проверьте, как также ссылаются на ваш App.xaml: <ItemGroup> <ItemGroup><Страница включает=»App.xaml» /> <Страница Включает=»App.xaml» /></ItemGroup>

Ответ №2:

Для меня работает следующее: Если у вас есть библиотека-проект с ресурсами (т. е. пространство имен «Project.Resources«) и есть презентация-проект (т. е. пространство имен «Project.Presentation«):

 <Application x:Class="Project.Presentation.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/Project.Resources;Dictionary.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>
 

Не забудьте добавить ссылку на «Проект.Ресурсы» в «Проект.Презентация».