【问题标题】:Avalonia exception "Unable to find view for <class name>"Avalonia 异常“无法找到 <类名> 的视图”
【发布时间】:2019-01-22 02:04:10
【问题描述】:

我有一个包含以下项目的 VS 解决方案,以便我可以在 iOS 和 Windows 之间共享 UI 代码:

  • MyApp.UI.Avalonia - 带有 Avalonia nuget 包的 .NET 标准类库
    • 包含用于 UI 的 XAML/CS 文件
  • MyApp.iOS - 一个 Xamarin iOS 项目,带有 Avalonia 和 Avalonia.iOS nuget 包
    • 取决于
  • MyApp.Windows - 从 Avalonia 项目模板创建的 Windows 应用程序项目(已删除 XAML 文件)

当我运行 Windows 应用程序时,我的 App 类在调用 AvaloniaXamlLoader.Load(this) 时出现异常:System.IO.FileNotFoundException: 'Unable to find view for MyApp.App

尝试查找 App.xaml(与 App.cs 文件对应的 XAML 文件)时似乎失败了。它通过查找 URL 类似“avares:/!AvaloniaResourceXamlInfo”的资源来实现。当我在 Avalonia 解决方案的 ControlCatalog 项目中调试此过程时,它确实在共享的 ControlCatalog 类库程序集中找到了该名称的资源,并且在该资源中找到了所有 XAML 文件和资产。

我注意到我的项目和他们的项目之间的一个区别是,当我右键单击项目并选择添加 -> 项目 -> 用户控件 (Avalonia) 时,它会在他们的项目中创建一个包含 CS 文件的 XAML 文件,但在我的项目它只是并排创建两个文件。我缺少什么项目设置才能将 XAML 文件放入这个神奇的“!AvaloniaResourceXamlInfo”资源中?

更新: 虽然我仍然遇到同样的错误,但我能够通过手动将以下内容添加到我的 .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>

【问题讨论】:

    标签: c# xaml xamarin avaloniaui


    【解决方案1】:

    您是否尝试过更改文件的属性?

    【讨论】:

    • 您的意思是在 .csproj 文件中?您共享的 XML 是否在某处的 csproj 中,解决方案是手动编辑它?您能否编辑您的答案以包含更多详细信息?
    • 是的,在 .csproj 文件中,您是否尝试将 app.xaml 文件设为编译资源或嵌入资源。
    【解决方案2】:

    确保将命名空间与此项目中的路径对齐。

    Avalonia 似乎对此有点挑剔。

    尽管 .Net 允许命名空间和路径有所不同

    【讨论】:

      【解决方案3】:

      当我手动将以下内容添加到 Windows 和 iOS 应用程序项目共享的 .NET Standard 库项目的 .csproj 文件中后,项目运行没有错误:

      <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>
      

      看起来&lt;Compile ...标签将cs文件封装到xaml.cs文件中,其余的将xaml文件嵌入为Avalonia可以找到的资源。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-05
        • 1970-01-01
        • 2020-12-15
        • 2011-11-04
        相关资源
        最近更新 更多