XAML 从NET MAUI引用仅限Windows的项目

ttp71kqs  于 2023-02-01  发布在  Windows
关注(0)|答案(2)|浏览(154)

我一直在使用NET MAUI完成的工具。现在我想自动化Windows UI,但我不知道如何做到这一点。我尝试下载FlaUI NuGet,但无法让它工作,因为它需要项目是Net7.0-windows。所以我创建了新的项目与Net7.0-windows的参考,但我在Net Maui的参考得到损坏。

MauiApp1.csproj(项目):

<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <TargetFrameworks>net7.0-android;net7.0-ios;net7.0-maccatalyst</TargetFrameworks>
        <TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net7.0-windows10.0.19041.0</TargetFrameworks>
        <!-- Uncomment to also build the tizen app. You will need to install tizen by following this: https://github.com/Samsung/Tizen.NET -->
        <!-- <TargetFrameworks>$(TargetFrameworks);net7.0-tizen</TargetFrameworks> -->
        <OutputType>Exe</OutputType>
        <RootNamespace>MauiApp1</RootNamespace>
        <UseMaui>true</UseMaui>
        <SingleProject>true</SingleProject>
        <ImplicitUsings>enable</ImplicitUsings>

        <!-- Display name -->
        <ApplicationTitle>MauiApp1</ApplicationTitle>

        <!-- App Identifier -->
        <ApplicationId>com.companyname.mauiapp1</ApplicationId>
        <ApplicationIdGuid>67771146-3ce8-452f-860b-3669d8a9e4a0</ApplicationIdGuid>

        <!-- Versions -->
        <ApplicationDisplayVersion>1.0</ApplicationDisplayVersion>
        <ApplicationVersion>1</ApplicationVersion>

        <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">11.0</SupportedOSPlatformVersion>
        <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'maccatalyst'">13.1</SupportedOSPlatformVersion>
        <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">21.0</SupportedOSPlatformVersion>
        <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</SupportedOSPlatformVersion>
        <TargetPlatformMinVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</TargetPlatformMinVersion>
        <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'tizen'">6.5</SupportedOSPlatformVersion>
    </PropertyGroup>

    <ItemGroup>
        <!-- App Icon -->
        <MauiIcon Include="Resources\AppIcon\appicon.svg" ForegroundFile="Resources\AppIcon\appiconfg.svg" Color="#512BD4" />

        <!-- Splash Screen -->
        <MauiSplashScreen Include="Resources\Splash\splash.svg" Color="#512BD4" BaseSize="128,128" />

        <!-- Images -->
        <MauiImage Include="Resources\Images\*" />
        <MauiImage Update="Resources\Images\dotnet_bot.svg" BaseSize="168,208" />

        <!-- Custom Fonts -->
        <MauiFont Include="Resources\Fonts\*" />

        <!-- Raw Assets (also remove the "Resources\Raw" prefix) -->
        <MauiAsset Include="Resources\Raw\**" LogicalName="%(RecursiveDir)%(Filename)%(Extension)" />
    </ItemGroup>

    <ItemGroup>
        <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="7.0.0" />
    </ItemGroup>

</Project>

项目ClassLibrary1.csproj(项目):

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net7.0-windows</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="FlaUI.Core" Version="4.0.0" />
    <PackageReference Include="FlaUI.UIA3" Version="4.0.0" />
  </ItemGroup>

</Project>

当前如果:

我得到以下错误:

我的问题是如何在NET MAUI中引用MauiApp1.csproj中的ClassLibrary1.csproj?有什么方法可以让这个设置工作吗?

h7wcgrx3

h7wcgrx31#

如果你的ClassLibrary1项目支持所有平台,那么你也应该把这几行添加到你的ClassLibrary1.cspoj文件中。

<TargetFrameworks>net7.0-android;net7.0-ios;net7.0-maccatalyst</TargetFrameworks>
<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net7.0-windows10.0.19041.0</TargetFrameworks>

如果你的ClassLibrary1项目只支持windows,那么你可以做两件事;
1.如果你的MAUI项目只在windows上运行,那么在你的MauiApp1.csproj文件中你应该删除这些行;

<TargetFrameworks>net7.0-android;net7.0-ios;net7.0-maccatalyst</TargetFrameworks>

<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">11.0</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'maccatalyst'">13.1</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">21.0</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'tizen'">6.5</SupportedOSPlatformVersion>

1.如果你的MAUI应用程序要同时支持其他平台,你应该单独添加你的平台特定库。我正在为我的多平台MAUI应用程序使用这个。
Solution Explorer > Your MAUI Project > Dependencies > Right Click Your Platform > Add reference
然后打开你的MauiApp1.csproj文件,找到你的引用,给你的引用加上一个条件,你的引用应该是这样的结尾;

<ItemGroup Condition="$(TargetFramework.Contains('-windows')) != false ">
  <ProjectReference Include="..\MauiLib1\MauiLib1.csproj" />
</ItemGroup>
    • 示例**

我已经做了一个例子。我创建了一个名为MauiApp1的MAUI项目和一个名为MauiLib1的类库。MauiLib1只支持Windows平台,MauiApp1支持所有平台。我已经将MauiLib1添加到MauiApp1中,但仅适用于Windows平台。所需的.csproj文件和特定于平台的代码可以在下面看到。

  • MauiApp1.csproj
<PropertyGroup>
     <TargetFrameworks>net7.0-android;net7.0-ios;net7.0-maccatalyst</TargetFrameworks>
     <TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net7.0-windows10.0.19041.0</TargetFrameworks>

     <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">11.0</SupportedOSPlatformVersion>
     <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'maccatalyst'">13.1</SupportedOSPlatformVersion>
     <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">21.0</SupportedOSPlatformVersion>
     <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</SupportedOSPlatformVersion>
     <TargetPlatformMinVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</TargetPlatformMinVersion>
     <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'tizen'">6.5</SupportedOSPlatformVersion>
 </PropertyGroup>

 <ItemGroup Condition="$(TargetFramework.Contains('-windows')) != false ">
   <ProjectReference Include="..\MauiLib1\MauiLib1.csproj" />
 </ItemGroup>
  • MauiLib1.csproj
<PropertyGroup>
     <TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net7.0-windows10.0.19041.0</TargetFrameworks>

     <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</SupportedOSPlatformVersion>
     <TargetPlatformMinVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</TargetPlatformMinVersion>
 </PropertyGroup>
  • MauiLib1项目中的一个简单类。因此我们可以进行测试。
public static class MauiLib1TestClass
 {
     public static string testString = "ehehehe";
 }
  • 稍微更改了MauiApp1项目的默认MainPage.xaml.cs代码。在这里您可以看到Windows特定的代码。如果没有这些条件,您的应用程序将崩溃。因为将不会有该平台的引用。
#if WINDOWS
 using MauiLib1;
 #endif

 public partial class MainPage : ContentPage
 {
     int count = 0;

     public MainPage()
     {
         InitializeComponent();
     }

     private void OnCounterClicked(object sender, EventArgs e)
     {
         count++;

         if (count == 1)
             CounterBtn.Text = $"Clicked {count} time";
 #if WINDOWS
         else if (count == 3)
             CounterBtn.Text = MauiLib1TestClass.testString;
 #endif
         else
             CounterBtn.Text = $"Clicked {count} times";

         SemanticScreenReader.Announce(CounterBtn.Text);
     }
 }
  • 点击3次后,你会在按钮中看到我们的字符串,这里是解决方案资源管理器的屏幕截图。正如你所看到的,仅为windows添加了参考。

第一节第一节第一节第一节第一次

    • 注1**

别忘了在Visual Studio上更改您当前的平台。这一点非常重要。否则,您的平台特定代码将无法编译。

    • 附注2**

我删除了代码中与问题无关的部分,这样大家就可以清楚地看到我做了哪些修改。

    • 附注3**

如果库支持多个平台,则可以在.csproj文件中向引用添加更多条件。

pqwbnv8z

pqwbnv8z2#

我对FlaUI知之甚少,但删除MauiApp1.csproj中的这一行可能会起作用:
<TargetFrameworks>net7.0-android;net7.0-ios;net7.0-maccatalyst</TargetFrameworks>

相关问题