Исключение из Avalonia "Невозможно найти представление для <имя класса>"
У меня есть решение VS со следующими проектами, чтобы я мог делиться кодом пользовательского интерфейса между iOS и Windows:
- MyApp.UI.Avalonia - стандартная библиотека классов.NET с пакетом nuget Avalonia
- содержит файлы XAML/CS для пользовательского интерфейса
- MyApp.iOS - проект Xamarin для iOS с пакетами нативов Avalonia и Avalonia.iOS
- Зависит от
- MyApp.Windows - проект приложения Windows, созданный из шаблона проекта Avalonia (с удаленными файлами XAML)
Когда я запускаю приложение Windows, я получаю исключение в своем классе приложения при вызове AvaloniaXamlLoader.Load(this): System.IO.FileNotFoundException: 'Unable to find view for MyApp.App
Похоже, что при попытке найти App.xaml, соответствующий XAML-файл в файле App.cs, происходит сбой. Это делается путем поиска ресурса с URL-адресом, например, "avares:/!AvaloniaResourceXamlInfo". Когда я отлаживаю этот процесс в проекте ControlCatalog решения Avalonia, он находит ресурс с этим именем в общей сборке библиотеки классов ControlCatalog, и внутри этого ресурса он находит все файлы и активы XAML.
Разница, которую я замечаю между своим проектом и его, заключается в том, что, когда я щелкаю правой кнопкой мыши по проекту и выбираю "Добавить" -> "Элемент" -> "Пользовательский контроль" (Avalonia), он создает файл XAML, обертывающий файл CS в своем проекте, но в моем проекте он создает два файла просто бок о бок. Какие настройки проекта мне не хватает, чтобы получить файлы XAML в этот волшебный ресурс "!AvaloniaResourceXamlInfo"?
Обновление: Хотя я все еще получаю ту же ошибку, я смог получить файлы xaml.cs для инкапсуляции соответствующих файлов.cs (так что, очевидно, это не единственная проблема), добавив следующее в мой файл.csproj вручную (что Я нашел в примере проекта ControlCatalog):
<ItemGroup>
<Compile Update="**\*.xaml.cs">
<DependentUpon>%(Filename)</DependentUpon>
</Compile>
<AvaloniaResource Include="**\*.xaml">
<SubType>Designer</SubType>
</AvaloniaResource>
<AvaloniaResource Include="Assets\*" />
<AvaloniaResource Include="Assets\Fonts\*" />
</ItemGroup>
3 ответа
Обязательно выровняйте пространства имен с путями в этом проекте.
Авалония, кажется, немного придирчива к этому.
Несмотря на то, что .Net позволяет пространствам имен и путям быть чем-то другим
Проект запустился без ошибок, как только я вручную добавил следующее в файл.csproj проекта библиотеки.NET Standard, совместно используемый проектами приложений Windows и iOS:
<ItemGroup>
<Compile Update="**\*.xaml.cs">
<DependentUpon>%(Filename)</DependentUpon>
</Compile>
<EmbeddedResource Include="**\*.xaml">
<SubType>Designer</SubType>
</EmbeddedResource>
<AvaloniaResource Include="**\*.xaml">
<SubType>Designer</SubType>
</AvaloniaResource>
<AvaloniaResource Include="Assets\*" />
<AvaloniaResource Include="Assets\Fonts\*" />
</ItemGroup>
Выглядит так <Compile ...
тег инкапсулирует файл cs в файлы xaml.cs, а остальные встраивают файлы xaml в качестве ресурсов, которые могут быть найдены Avalonia.