Исключение из 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.

Другие вопросы по тегам