From 07381e86f4873e09fb278c70e995da762c827019 Mon Sep 17 00:00:00 2001 From: Starcloudsea <84891987+Starcloudsea@users.noreply.github.com> Date: Wed, 19 Mar 2025 23:27:27 +0800 Subject: [PATCH 01/40] =?UTF-8?q?=E6=94=AF=E6=8C=81GitHub=20Action?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=8F=91=E5=B8=83=EF=BC=88tnnd=E6=88=91?= =?UTF-8?q?=E7=96=AF5=E5=A4=A9=EF=BC=89=20=E5=92=8CWindows=20ClickOnce?= =?UTF-8?q?=EF=BC=88=E5=BF=AB=E6=8D=B7=E6=96=B9=E5=BC=8F=E5=9B=BE=E6=A0=87?= =?UTF-8?q?=E5=92=8B=E6=90=9E=E5=95=8AQAQ=EF=BC=89=20=E5=92=8C=E4=B8=80?= =?UTF-8?q?=E5=A4=A7=E5=A0=86=E6=9C=89=E7=9A=84=E6=B2=A1=E6=9C=89=E7=9A=84?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=88=20=E7=AE=80=E7=A7=B0=EF=BC=9A?= =?UTF-8?q?=E5=86=99=E4=BD=A0=E5=A4=A7=E7=88=B7=EF=BC=81=EF=BC=81=EF=BC=81?= =?UTF-8?q?(=E2=81=A0=E2=94=9B=E2=81=A0=E2=9C=A7=E2=81=A0=D0=94=E2=81=A0?= =?UTF-8?q?=E2=9C=A7=E2=81=A0)=E2=81=A0)=E2=81=A0=E2=94=9B=E2=81=A0?= =?UTF-8?q?=E5=BD=A1=E2=81=A0=E2=94=BB=E2=81=A0=E2=94=81=E2=81=A0=E2=94=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/publish-ci.yml | 365 ++++++++++++++++++ .github/workflows/{ci.yml => test-ci.yml} | 8 +- BadMC_Launcher/App.xaml | 5 +- BadMC_Launcher/App.xaml.cs | 42 +- BadMC_Launcher/BadMC_Launcher.csproj | 80 ++-- BadMC_Launcher/BadMC_Launcher.csproj.user | 21 +- ...ftPathEntry.cs => MinecraftFolderEntry.cs} | 12 +- .../Classes/{ => ViewClasses}/MainMenuItem.cs | 2 +- .../MainMenuSearchMinecraftEntryFilter.cs | 9 +- .../MainSearch/MainMenuSearchResultItem.cs | 2 +- .../{ => ViewClasses}/MainSideBarItem.cs | 2 +- .../ViewClasses/SettingsSideBarItem.cs | 21 + BadMC_Launcher/Enums/MessengerTokenEnum.cs | 17 - .../MainPageMessengerTokenEnum.cs | 17 + ...on.cs => MinecraftFolderEntryExtension.cs} | 10 +- .../Interfaces/IMainMenuSharchFilterItem.cs | 2 +- BadMC_Launcher/Models/Datas/AppParameters.cs | 7 - .../Models/Datas/Mappings/UpdateMapping.cs | 12 + .../Datas/SettingsDatas/MinecraftConfig.cs | 6 +- .../SettingsDatas/SingleMinecraftConfig.cs | 10 +- .../Models/Datas/ViewDatas/MainMenuData.cs | 1 + .../Models/Datas/ViewDatas/MainSideBarData.cs | 1 + .../Models/Datas/ViewDatas/SettingsData.cs | 15 + BadMC_Launcher/Package.appxmanifest | 18 +- .../win-arm64-clickonce.pubxml | 39 ++ .../PublishProfiles/win-arm64.pubxml | 2 +- .../PublishProfiles/win-x64-clickonce.pubxml | 39 ++ .../Properties/PublishProfiles/win-x64.pubxml | 27 +- .../Properties/PublishProfiles/win-x86.pubxml | 23 -- BadMC_Launcher/Services/FileService.cs | 153 ++++---- .../Settings/MinecraftConfigService.cs | 30 +- .../Settings/SingleMinecraftConfigService.cs | 22 +- .../Services/Settings/ThemeSettingService.cs | 11 +- .../Services/ViewServices/MainMenuService.cs | 5 +- .../ViewServices/MainSideBarManagerService.cs | 7 +- .../Services/ViewServices/SettingsService.cs | 20 + BadMC_Launcher/Strings/en-US/Resources.resw | 52 ++- BadMC_Launcher/Strings/zh-Hans/Resources.resw | 52 ++- .../MinecraftFolderContentDialogViewModel.cs | 21 + .../ViewModels/Pages/MainPageViewModel.cs | 21 +- .../MainMenuPageViewModel.cs | 25 +- .../Settings/LaunchSettingsPageViewModel.cs | 69 ++++ .../SettingsDashboardPageViewModel.cs | 46 +++ .../SettingsDashboardPageViewModel.cs | 10 - .../UserControls/LaunchPadViewModel.cs | 34 +- .../MinecraftFolderContentDialog.xaml | 30 ++ .../MinecraftFolderContentDialog.xaml.cs | 26 ++ BadMC_Launcher/Views/Pages/MainPage.xaml | 46 +-- BadMC_Launcher/Views/Pages/MainPage.xaml.cs | 16 +- .../MainMenuPage.xaml | 4 +- .../MainMenuPage.xaml.cs | 4 +- .../Pages/Settings/LaunchSettingsPage.xaml | 102 +++++ .../Pages/Settings/LaunchSettingsPage.xaml.cs | 30 ++ .../Pages/Settings/SettingsDashboardPage.xaml | 45 +++ .../SettingsDashboardPage.xaml.cs | 8 +- .../SettingsPages/SettingsDashboardPage.xaml | 11 - .../MinecraftFolderItemsTemplate.xaml | 30 ++ .../MinecraftPathItemsTemplate.xaml | 9 - .../Views/UserControls/LaunchPad.xaml | 12 +- Directory.Packages.props | 1 + docs/README_enUS.md | 0 docs/Release.md | 0 publish.sh | 0 63 files changed, 1386 insertions(+), 381 deletions(-) create mode 100644 .github/workflows/publish-ci.yml rename .github/workflows/{ci.yml => test-ci.yml} (94%) rename BadMC_Launcher/Classes/Minecraft/{MinecraftPathEntry.cs => MinecraftFolderEntry.cs} (85%) rename BadMC_Launcher/Classes/{ => ViewClasses}/MainMenuItem.cs (91%) rename BadMC_Launcher/Classes/{ => ViewClasses}/MainSearch/MainMenuSearchMinecraftEntryFilter.cs (86%) rename BadMC_Launcher/Classes/{ => ViewClasses}/MainSearch/MainMenuSearchResultItem.cs (95%) rename BadMC_Launcher/Classes/{ => ViewClasses}/MainSideBarItem.cs (90%) create mode 100644 BadMC_Launcher/Classes/ViewClasses/SettingsSideBarItem.cs delete mode 100644 BadMC_Launcher/Enums/MessengerTokenEnum.cs create mode 100644 BadMC_Launcher/Enums/MessengerTokenEnum/MainPageMessengerTokenEnum.cs rename BadMC_Launcher/Extensions/{MinecraftPathEntryExtension.cs => MinecraftFolderEntryExtension.cs} (92%) create mode 100644 BadMC_Launcher/Models/Datas/Mappings/UpdateMapping.cs create mode 100644 BadMC_Launcher/Models/Datas/ViewDatas/SettingsData.cs create mode 100644 BadMC_Launcher/Properties/PublishProfiles/win-arm64-clickonce.pubxml create mode 100644 BadMC_Launcher/Properties/PublishProfiles/win-x64-clickonce.pubxml delete mode 100644 BadMC_Launcher/Properties/PublishProfiles/win-x86.pubxml create mode 100644 BadMC_Launcher/Services/ViewServices/SettingsService.cs create mode 100644 BadMC_Launcher/ViewModels/ContentDialogs/Settings/MinecraftFolderContentDialogViewModel.cs rename BadMC_Launcher/ViewModels/Pages/{MainSideBarPages => MainSideBar}/MainMenuPageViewModel.cs (77%) create mode 100644 BadMC_Launcher/ViewModels/Pages/Settings/LaunchSettingsPageViewModel.cs create mode 100644 BadMC_Launcher/ViewModels/Pages/Settings/SettingsDashboardPageViewModel.cs delete mode 100644 BadMC_Launcher/ViewModels/Pages/SettingsPages/SettingsDashboardPageViewModel.cs create mode 100644 BadMC_Launcher/Views/ContentDialogs/Settings/MinecraftFolderContentDialog.xaml create mode 100644 BadMC_Launcher/Views/ContentDialogs/Settings/MinecraftFolderContentDialog.xaml.cs rename BadMC_Launcher/Views/Pages/{MainSideBarPages => MainSideBar}/MainMenuPage.xaml (98%) rename BadMC_Launcher/Views/Pages/{MainSideBarPages => MainSideBar}/MainMenuPage.xaml.cs (87%) create mode 100644 BadMC_Launcher/Views/Pages/Settings/LaunchSettingsPage.xaml create mode 100644 BadMC_Launcher/Views/Pages/Settings/LaunchSettingsPage.xaml.cs create mode 100644 BadMC_Launcher/Views/Pages/Settings/SettingsDashboardPage.xaml rename BadMC_Launcher/Views/Pages/{SettingsPages => Settings}/SettingsDashboardPage.xaml.cs (75%) delete mode 100644 BadMC_Launcher/Views/Pages/SettingsPages/SettingsDashboardPage.xaml create mode 100644 BadMC_Launcher/Views/Styles/Templates/ItemTemplate/MinecraftFolderItemsTemplate.xaml delete mode 100644 BadMC_Launcher/Views/Styles/Templates/ItemTemplate/MinecraftPathItemsTemplate.xaml create mode 100644 docs/README_enUS.md create mode 100644 docs/Release.md create mode 100644 publish.sh diff --git a/.github/workflows/publish-ci.yml b/.github/workflows/publish-ci.yml new file mode 100644 index 0000000..b0a3c60 --- /dev/null +++ b/.github/workflows/publish-ci.yml @@ -0,0 +1,365 @@ +name: Publish App to Release + +on: + push: + paths: + - 'BadMC_Launcher/**' + + workflow_call: + secrets: + PRIVATE_KEY: + required: true + +env: + NET_VERSION: 9.0.201 + +jobs: + PublishApp: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + platform: [x64, arm64] + os: [windows-latest, ubuntu-latest, macos-latest] + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + # Setup Dependencies + - name: Set up .NET + uses: actions/setup-dotnet@v3 + with: + dotnet-version: ${{ env.NET_VERSION }} + + - name: Install Dependencies + timeout-minutes: 60 + continue-on-error: true + uses: "./.github/steps/install_dependencies" + + - name: Install Dependencies(Linux) + if: ${{ matrix.os == 'ubuntu-latest' }} + run: | + sudo apt update + sudo snap refresh + sudo apt install -y snapd + sudo snap install core22 + sudo snap install multipass + sudo snap install lxd + sudo snap install snapcraft --classic + sudo lxd init --minimal + sudo usermod --append --groups lxd $USER + + - name: Setup MSBuild + if: ${{ matrix.os == 'windows-latest' }} + uses: microsoft/setup-msbuild@v1.3.1 + + # Build Application + - name: Build Uno Platform + run: | + cd BadMC_Launcher + + dotnet nuget add source https://pkgs.dev.azure.com/dotnet/CommunityToolkit/_packaging/CommunityToolkit-Labs/nuget/v3/index.json -n CommunityToolkit-Labs + + dotnet build --configuration Release + + - name: Get Application Version + id: getAppVersion + uses: mavrosxristoforos/get-xml-info@2.0 + with: + xml-file: 'BadMC_Launcher/BadMC_Launcher.csproj' + xpath: '//ApplicationVersion' + + # Publish Windows + # Publish WinUI Packaged + - name: Set PFX + if: ${{ matrix.os == 'windows-latest' }} + run: | + cd BadMC_Launcher + $certificatePath = "$env:RUNNER_TEMP/" + $privateFpx = "${{ secrets.PRIVATE_PFX }}" + + $privateFpx | Set-Content -Path $certificatePath/BadMC_Launcher_TemporaryKey.pfx.b64 + openssl base64 -d -in $certificatePath/BadMC_Launcher_TemporaryKey.pfx.b64 -out BadMC_Launcher_TemporaryKey.pfx + + - name: Publish WinUI Packaged + if: ${{ matrix.os == 'windows-latest' }} + run: | + cd BadMC_Launcher + + $platform = "${{ matrix.platform }}" + + msbuild /r ` + /p:TargetFramework=net9.0-windows10.0.26100 ` + /p:Configuration=Release ` + /p:Platform=$platform ` + /p:GenerateAppxPackageOnBuild=true ` + /p:AppxBundle=Never ` + /p:UapAppxPackageBuildMode=Sideloading ` + /p:AppxPackageDir="publish/WinUIPackaged/$platform/" ` + /p:AppxPackageSigningEnabled=true + + $exePath = "publish/WinUIPackaged/$platform/*" + $zipDictionary = "publish/Zip" + $zipPath = "publish/Zip/BadMCLauncher_WinUIPack.$platform.${{ steps.getAppVersion.outputs.info }}.zip" + + New-Item -ItemType Directory -Path $zipDictionary -Force + Compress-Archive -Path $exePath -DestinationPath $zipPath + + - name: Upload WinUI Packaged Application + if: ${{ matrix.os == 'windows-latest' }} + uses: actions/upload-artifact@v4 + with: + name: BadMCLauncher_WinUIPack.${{ matrix.platform }}.Artifact + path: | + BadMC_Launcher/publish/Zip/BadMCLauncher_WinUIPack.${{ matrix.platform }}.${{ steps.getAppVersion.outputs.info }}.zip + + # Publish WinUI Unpackaged + - name: Publish WinUI Unpackaged + if: ${{ matrix.os == 'windows-latest' }} + run: | + cd BadMC_Launcher + + $platform = "${{ matrix.platform }}" + + msbuild /r ` + /t:publish ` + /p:TargetFramework=net9.0-windows10.0.26100 ` + /p:Configuration=Release ` + /p:Platform=$platform ` + /p:PublishDir="publish/WinUIUnpackaged/$platform/" + + $exePath = "publish/WinUIUnpackaged/$platform/*" + $zipDictionary = "publish/Zip" + $zipPath = "publish/Zip/BadMCLauncher_WinUIUnpack.$platform.${{ steps.getAppVersion.outputs.info }}.zip" + + New-Item -ItemType Directory -Path $zipDictionary -Force + Compress-Archive -Path $exePath -DestinationPath $zipPath + + - name: Upload WinUI Unpackaged Application + if: ${{ matrix.os == 'windows-latest' }} + uses: actions/upload-artifact@v4 + with: + name: BadMCLauncher_WinUIUnpack.${{ matrix.platform }}.Artifact + path: | + BadMC_Launcher/publish/Zip/BadMCLauncher_WinUIUnpack.${{ matrix.platform }}.${{ steps.getAppVersion.outputs.info }}.zip + + # Publish Windows Desktop + - name: Publish Windows Desktop + if: ${{ matrix.os == 'windows-latest' }} + run: | + cd BadMC_Launcher + + $platform = "${{ matrix.platform }}" + + dotnet publish -f net9.0-desktop ` + -r win-$platform ` + -o "publish/WinDesktop/$platform/" ` + -p:Platform=$platform ` + -p:SelfContained=False ` + -p:TargetFrameworks=net9.0-desktop + + $exePath = "publish/WinDesktop/$platform/*" + $zipDictionary = "publish/Zip" + $zipPath = "publish/Zip/BadMCLauncher_WinDesktop.$platform.${{ steps.getAppVersion.outputs.info }}.zip" + + New-Item -ItemType Directory -Path $zipDictionary -Force + Compress-Archive -Path $exePath -DestinationPath $zipPath + + - name: Upload Windows Desktop Application + if: ${{ matrix.os == 'windows-latest' }} + uses: actions/upload-artifact@v4 + with: + name: BadMCLauncher_WinDesktop.${{ matrix.platform }}.Artifact + path: | + BadMC_Launcher/publish/Zip/BadMCLauncher_WinDesktop.${{ matrix.platform }}.${{ steps.getAppVersion.outputs.info }}.zip + + # Publish Windows Desktop(ClickOnce) + - name: Publish Windows Desktop(ClickOnce) + if: ${{ matrix.os == 'windows-latest' }} + run: | + cd BadMC_Launcher + + $platform = "${{ matrix.platform }}" + + msbuild /m /r ` + /target:Publish ` + /p:Configuration=Release ` + /p:SelfContained=False ` + /p:PublishProfile="Properties/PublishProfiles/win-$platform-clickonce.pubxml" ` + /p:TargetFramework=net9.0-desktop ` + /p:UnoClickOncePublishDir="publish/WinDesktop_ClickOnce/$platform/" + + $exePath = "publish/WinDesktop_ClickOnce/$platform/*" + $zipDictionary = "publish/Zip" + $zipPath = "publish/Zip/BadMCLauncher_WinDesktop_ClickOnce.$platform.${{ steps.getAppVersion.outputs.info }}.zip" + + New-Item -ItemType Directory -Path $zipDictionary -Force + Compress-Archive -Path $exePath -DestinationPath $zipPath + + - name: Upload Windows Desktop(ClickOnce) Application + if: ${{ matrix.os == 'windows-latest' }} + uses: actions/upload-artifact@v4 + with: + name: BadMCLauncher_WinDesktop_ClickOnce.${{ matrix.platform }}.Artifact + path: | + BadMC_Launcher/publish/Zip/BadMCLauncher_WinDesktop_ClickOnce.${{ matrix.platform }}.${{ steps.getAppVersion.outputs.info }}.zip + + # Publish MacOS + # Publish Mac Catalyst + # TODO: 草贵死我辣(っ °Д °;)っ + # - name: Publish Mac Catalyst + # if: ${{ matrix.os == 'mac-latest' }} + # run: | + # cd BadMC_Launcher + # + # $platform = "${{ matrix.platform }}" + # + # + # + # $exePath = "publish/WinDesktop/$platform/*" + # $zipDictionary = "publish/Zip" + # $zipPath = "publish/Zip/BadMCLauncher_WinDesktop.$platform.${{ steps.getAppVersion.outputs.info }}.zip" + # + # New-Item -ItemType Directory -Path $zipDictionary -Force + # Compress-Archive -Path $exePath -DestinationPath $zipPath + + # Publish MacOS Desktop + # TODO: 《让我们等Mac》 + # - name: Publish MacOS Desktop + # if: ${{ matrix.os == 'macos-latest' }} + # run: | + # cd BadMC_Launcher + # + # $platform = "${{ matrix.platform }}" + # + # msbuild /m /r ` + # /target:Publish ` + # /p:Configuration=Release ` + # /p:SelfContained=False ` + # /p:PublishProfile="Properties/PublishProfiles/win-$platform-clickonce.pubxml" ` + # /p:TargetFramework=net9.0-desktop ` + # /p:UnoClickOncePublishDir="publish/WinDesktop_ClickOnce/$platform/" + # + # $exePath = "publish/WinDesktop_ClickOnce/$platform/*" + # $zipDictionary = "publish/Zip" + # $zipPath = "publish/Zip/BadMCLauncher_WinDesktop_ClickOnce.$platform.${{ steps.getAppVersion.outputs.info }}.zip" + # + # New-Item -ItemType Directory -Path $zipDictionary -Force + # Compress-Archive -Path $exePath -DestinationPath $zipPath + # + # - name: Upload Windows Desktop(ClickOnce) Application + # if: ${{ matrix.os == 'windows-latest' }} + # uses: actions/upload-artifact@v4 + # with: + # name: BadMCLauncher_WinDesktop_ClickOnce.${{ matrix.platform }}.Artifact + # path: | + # BadMC_Launcher/publish/Zip/BadMCLauncher_WinDesktop_ClickOnce.${{ matrix.platform }}.${{ steps.getAppVersion.outputs.info }}.zip + + # Publish Linux + # 暂不支持.NET 9(草!) + # - name: Publish Linux Desktop + # if: ${{ matrix.os == 'ubuntu-latest' }} + # run: | + # cd BadMC_Launcher + # + # platform="${{ matrix.platform }}" + # + # dotnet publish -f net9.0-desktop \ + # -p:Platform="$platform" \ + # -p:SelfContained=true \ + # -p:PackageFormat=snap \ + # -o "publish/LinuxDesktop/$platform/" + # + # - name: Upload Windows Desktop(ClickOnce) Application + # if: ${{ matrix.os == 'ubuntu-latest' }} + # uses: actions/upload-artifact@v4 + # with: + # name: BadMCLauncher_LinuxDesktop.${{ matrix.platform }}.${{ steps.getAppVersion.outputs.info }} + # path: | + # BadMC_Launcher/publish/LinuxDesktop/${{ matrix.platform }}/* + + UploadRelease: + needs: PublishApp + runs-on: windows-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Get Application Version + id: getAppVersion + uses: mavrosxristoforos/get-xml-info@2.0 + with: + xml-file: 'BadMC_Launcher/BadMC_Launcher.csproj' + xpath: '//ApplicationVersion' + + - name: Download all artifacts + uses: actions/download-artifact@v4 + with: + path: artifacts + + - name: Check Release + id: CheckRelease + run: | + $branchPart = $env:GITHUB_REF.Split('/')[2] + + if ($branchPart -ne "Release") { + echo "IsPreRelease=true" >> $env:GITHUB_OUTPUT + } + else { + echo "IsPreRelease=false" >> $env:GITHUB_OUTPUT + } + + echo "Branch=$branchPart" >> $env:GITHUB_OUTPUT + + - name: Generate Hashes Table + continue-on-error: true + id: MarkdownGetHashes + run: | + $markdownPath = "docs/Release.md" + + $folderPath = "artifacts" + + "`n`n## File Hash`n" | Add-Content -Path $markdownPath -Encoding UTF8 + "| File | SHA-256 Hash |" | Add-Content -Path $markdownPath -Encoding UTF8 + "|------|--------------|" | Add-Content -Path $markdownPath -Encoding UTF8 + + Get-ChildItem -Path "$folderPath" -File -Depth 3 | ForEach-Object { + $fileName = $_.Name + + $hash = (Get-FileHash -Path $_.FullName -Algorithm SHA256).Hash + + "| $fileName | ``$hash`` |" | Add-Content -Path $markdownPath -Encoding UTF8 + } + + - name: Create Build Summary + continue-on-error: true + run: | + $markdown = Get-Content -Path "docs/ActionSummary.md" -Raw + + "$markdown" | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Encoding utf8 -Append + + - name: Read Markdown + id: ReadMd + uses: juliangruber/read-file-action@v1.1.7 + with: + path: docs/Release.md + + - name: Create Release + id: create_release + uses: softprops/action-gh-release@v2.2.1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ steps.getAppVersion.outputs.info }} + name: ${{ steps.CheckRelease.outputs.Branch}} Publish - ${{ steps.getAppVersion.outputs.info }} + body: "${{ steps.ReadMd.outputs.content }}" + draft: false + prerelease: ${{ steps.CheckRelease.outputs.IsPreRelease}} + files: | + artifacts/** + + + + + diff --git a/.github/workflows/ci.yml b/.github/workflows/test-ci.yml similarity index 94% rename from .github/workflows/ci.yml rename to .github/workflows/test-ci.yml index 8867e6e..7181056 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/test-ci.yml @@ -1,10 +1,10 @@ -name: CI +name: Run application unit test on: push: - branches: - - main - - release/** + paths: + - 'BadMC_Launcher/**' + - 'BadMC_Launcher.Tests/**' pull_request: types: [opened, synchronize, reopened] diff --git a/BadMC_Launcher/App.xaml b/BadMC_Launcher/App.xaml index 3466ef5..a91f150 100644 --- a/BadMC_Launcher/App.xaml +++ b/BadMC_Launcher/App.xaml @@ -10,11 +10,14 @@ - + + diff --git a/BadMC_Launcher/App.xaml.cs b/BadMC_Launcher/App.xaml.cs index 6bcfbc4..7676331 100644 --- a/BadMC_Launcher/App.xaml.cs +++ b/BadMC_Launcher/App.xaml.cs @@ -1,13 +1,16 @@ using BadMC_Launcher.Classes; -using BadMC_Launcher.Classes.MainSearch; +using BadMC_Launcher.Classes.ViewClasses; +using BadMC_Launcher.Classes.ViewClasses.MainSearch; using BadMC_Launcher.Models.Datas; using BadMC_Launcher.Services; using BadMC_Launcher.Services.ViewServices; using BadMC_Launcher.Servicess; using BadMC_Launcher.Servicess.Settings; using BadMC_Launcher.ViewModels.Pages; +using BadMC_Launcher.Views.ContentDialogs.Settings; using BadMC_Launcher.Views.Pages; -using BadMC_Launcher.Views.Pages.MainSideBarPages; +using BadMC_Launcher.Views.Pages.MainSideBar; +using BadMC_Launcher.Views.Pages.Settings; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.UI; using Microsoft.UI.Xaml.Media.Imaging; @@ -28,6 +31,7 @@ public App() { public static new App Current => (App)Application.Current; protected Window? MainWindow { get; private set; } + public IHost? Host { get; private set; } protected override void OnLaunched(LaunchActivatedEventArgs args) { @@ -89,8 +93,12 @@ protected override void OnLaunched(LaunchActivatedEventArgs args) { services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); + services.AddSingleton(); services.AddSingleton(); services.AddTransient(); + + //Register ContentDialogs + services.AddTransient(); }) ); MainWindow = builder.Window; @@ -99,6 +107,10 @@ protected override void OnLaunched(LaunchActivatedEventArgs args) { //Get Configs GetSettings(); + //Regist Pages + GlobalRegister(); + + //Set MainWindow Configs MainWindow.AppWindow.Title = GetService().WindowName; MainWindow.AppWindow.Resize(AppParameters.windowSize); MainWindow.AppWindow.TitleBar.ExtendsContentIntoTitleBar = true; @@ -130,10 +142,6 @@ protected override void OnLaunched(LaunchActivatedEventArgs args) { // parameter rootFrame.Navigate(typeof(MainPage), args.Arguments); } - - //Regist Pages - GlobalRegister(); - // Ensure the current window is active MainWindow.Activate(); } @@ -158,23 +166,31 @@ private static void GetSettings() { } private void GlobalRegister() { - //Register MainSideBarItem + //Register MainSideBarItems GetService().Register(new MainSideBarItem() { - ItemName = App.GetService().GetString("MainPage_MainMenuNameResource"), + ItemName = GetService().GetString("MainPage_MainMenuNameResource"), ItemIcon = new FontIcon() { Glyph = "\uE74C" }, - NavigatePage = typeof(MainMenuPage), + NavigatePage = typeof(MainMenuPage) }); GetService().Register(new MainSideBarItem() { - ItemName = App.GetService().GetString("MainPage_MainMenuNameResource"), + ItemName = GetService().GetString("MainPage_MainMenuNameResource"), ItemIcon = new FontIcon() { Glyph = "\uE74C" }, - NavigatePage = typeof(MainMenuPage), + NavigatePage = typeof(MainMenuPage) }); - //Register MainMenuSearchFilterItem - GetService().Register(new MainMenuSearchMinecraftEntryFilter() { + //Register MainMenuSearchFilterItems + GetService().SearchFilterRegister(new MainMenuSearchMinecraftEntryFilter() { ItemName = GetService().GetString("MainMenuPage_SearchFilterMinecraftEntryNameResource"), IconGlyph = "\uE7FC" }); + + //Register SettingsSideBarItems + GetService().SideBarRegister(new SettingsSideBarItem() { + ItemName = GetService().GetString("LaunchSettingsPage_PageName"), + ItemIcon = new FontIcon() { Glyph = "\uE7FC" }, + NavigatePage = typeof(LaunchSettingsPage), + PageHead = GetService().GetString("LaunchSettingsPage_PageName"), + }); } } diff --git a/BadMC_Launcher/BadMC_Launcher.csproj b/BadMC_Launcher/BadMC_Launcher.csproj index bd4b722..4726849 100644 --- a/BadMC_Launcher/BadMC_Launcher.csproj +++ b/BadMC_Launcher/BadMC_Launcher.csproj @@ -1,10 +1,11 @@ - net9.0-maccatalyst;net9.0-windows10.0.26100;net9.0-desktop;net9.0 + net9.0-windows10.0.26100;net9.0-desktop;net9.0-maccatalyst;net9.0 preview Exe true + false BadMC_Launcher @@ -27,10 +28,6 @@ BadMC_Launcher powered by Uno Platform. - - - - + + + 0 + 0.0.1.* + True + Release + False + true + True + Disk + True + False + True + False + arm64 + ClickOnce + True + False + win-arm64 + True + (none) + False + False + net9.0-desktop + True + Background + False + Publish.html + + + + + True + .NET Desktop Runtime 9.0.201 (arm64) + + + diff --git a/BadMC_Launcher/Properties/PublishProfiles/win-arm64.pubxml b/BadMC_Launcher/Properties/PublishProfiles/win-arm64.pubxml index 4125b4f..45aafd5 100644 --- a/BadMC_Launcher/Properties/PublishProfiles/win-arm64.pubxml +++ b/BadMC_Launcher/Properties/PublishProfiles/win-arm64.pubxml @@ -8,7 +8,7 @@ https://go.microsoft.com/fwlink/?LinkID=208121. arm64 win-arm64 bin\$(Configuration)\$(TargetFramework)\$(RuntimeIdentifier)\publish\ - true + True False False True diff --git a/BadMC_Launcher/Properties/PublishProfiles/win-x64-clickonce.pubxml b/BadMC_Launcher/Properties/PublishProfiles/win-x64-clickonce.pubxml new file mode 100644 index 0000000..454ec9b --- /dev/null +++ b/BadMC_Launcher/Properties/PublishProfiles/win-x64-clickonce.pubxml @@ -0,0 +1,39 @@ + + + + + 0 + 0.0.1.* + True + Release + False + True + True + Disk + True + False + True + False + x64 + ClickOnce + True + False + win-x64 + True + (none) + False + False + net9.0-desktop + True + Background + False + Publish.html + + + + + True + .NET Desktop Runtime 9.0.201 (x64) + + + diff --git a/BadMC_Launcher/Properties/PublishProfiles/win-x64.pubxml b/BadMC_Launcher/Properties/PublishProfiles/win-x64.pubxml index 12b8344..2b62d55 100644 --- a/BadMC_Launcher/Properties/PublishProfiles/win-x64.pubxml +++ b/BadMC_Launcher/Properties/PublishProfiles/win-x64.pubxml @@ -1,18 +1,19 @@ - + - - FileSystem - x64 - win-x64 - bin\$(Configuration)\$(TargetFramework)\$(RuntimeIdentifier)\publish\ - true - False - False - True - False - True - + + FileSystem + x64 + win-x64 + True + False + False + False + Release + net9.0-desktop + false + true + diff --git a/BadMC_Launcher/Properties/PublishProfiles/win-x86.pubxml b/BadMC_Launcher/Properties/PublishProfiles/win-x86.pubxml deleted file mode 100644 index 65b8f1d..0000000 --- a/BadMC_Launcher/Properties/PublishProfiles/win-x86.pubxml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - FileSystem - x86 - win-x86 - bin\$(Configuration)\$(TargetFramework)\$(RuntimeIdentifier)\publish\ - true - False - False - True - False - True - - - diff --git a/BadMC_Launcher/Services/FileService.cs b/BadMC_Launcher/Services/FileService.cs index b5c9fdf..a869e1a 100644 --- a/BadMC_Launcher/Services/FileService.cs +++ b/BadMC_Launcher/Services/FileService.cs @@ -2,8 +2,11 @@ using System.Security; using System.Text.Encodings.Web; using System.Text.Json; +using System.Text.Json.Nodes; using System.Text.Json.Serialization; using System.Text.Json.Serialization.Metadata; +using BadMC_Launcher.Models.Datas; +using BadMC_Launcher.Models.Datas.Mappings; using Microsoft.UI.Xaml.Controls; using MinecraftLaunch.Extensions; @@ -50,47 +53,15 @@ public bool CheckFolderAndFile(string path, bool isCheckFile) { } return false; } - //计划弃用 - //public bool ChangeFile(string path, bool isDelete) { - // if (CheckFolderAndFile(path, true)) { - // try { - // if (isDelete) { - // File.Delete(path); - // } - // else { - // using (File.Create(path)) { - // return true; - // } - // } - // } - // catch (Exception ex) { - // switch (ex) { - // case SecurityException: - // //TODO - // break; - // case UnauthorizedAccessException: - // //TODO - // break; - // case PathTooLongException: - // //TODO - // break; - // case IOException: - // //TODO - // break; - // default: - // throw; - // } - // } - // } - // return false; - //} - public bool ReadConfig(string path, JsonTypeInfo jsonTypeInfo, out T? returnValue) { - if (CheckFolderAndFile(path, true)) { + public bool ReadConfig(string filePath, JsonTypeInfo jsonTypeInfo, out T? returnValue, Dictionary? updateMapping = null) { + if (CheckFolderAndFile(filePath, true)) { try { - var fileValue = File.ReadAllText(path); + if (updateMapping != null) { + TryReadConfigWithMappings(filePath, jsonTypeInfo, updateMapping); + } + var fileValue = File.ReadAllText(filePath); if (!string.IsNullOrWhiteSpace(fileValue)) { - returnValue = fileValue.Deserialize(jsonTypeInfo); return true; } @@ -121,10 +92,10 @@ public bool ReadConfig(string path, JsonTypeInfo jsonTypeInfo, out T? retu return false; } - public bool ReadConfig(string path, out JsonElement? returnValue) { - if (CheckFolderAndFile(path, true)) { + public bool ReadConfigToJsonElement(string filePath, out JsonElement? returnValue) { + if (CheckFolderAndFile(filePath, true)) { try { - var fileValue = File.ReadAllText(path); + var fileValue = File.ReadAllText(filePath); if (!string.IsNullOrWhiteSpace(fileValue)) { var jsonValue = JsonDocument.Parse(fileValue); if (jsonValue != null) { @@ -160,11 +131,11 @@ public bool ReadConfig(string path, out JsonElement? returnValue) { return false; } - public bool WriteConfig(string path, T value, JsonTypeInfo jsonTypeInfo) { - if (CheckFolderAndFile(path, true)) { + public bool WriteConfig(string filePath, JsonTypeInfo jsonTypeInfo, T value) { + if (CheckFolderAndFile(filePath, true)) { try { var jsonValue = value.Serialize(jsonTypeInfo); - File.WriteAllText(path, jsonValue); + File.WriteAllText(filePath, jsonValue); return true; } catch (Exception ex) { @@ -191,46 +162,56 @@ public bool WriteConfig(string path, T value, JsonTypeInfo jsonTypeInfo) { } return false; } - //public bool ConfigSet(string path, string propertyName, TValue value) { - // //Check - // if (CheckFolderAndFile(path, true)) { - // try { - // //Read JSON data from a file and deserialize it. - // if (ReadConfig(path, out var returnValue) && returnValue != null) { - // //Get the property information of the specified property. - // PropertyInfo? propertyInfo = typeof(TJson).GetProperty(propertyName); - // //Set the value of the specified property. - // if (propertyInfo != null && propertyInfo.CanWrite) { - // propertyInfo.SetValue(returnValue, value); - // } - // else { - // throw new ArgumentException($"Property '{propertyName}' not found or is read-only."); - // } - // return WriteConfig(path, returnValue); - // } - // } - // catch (Exception ex) { - // switch (ex) { - // case SecurityException: - // //TODO - // break; - // case UnauthorizedAccessException: - // //TODO - // break; - // case PathTooLongException: - // //TODO - // break; - // case IOException: - // //TODO - // break; - // case JsonException: - // //TODO - // break; - // default: - // throw; - // } - // } - // } - // return false; - //} + + public bool TryReadConfigWithMappings(string filePath, JsonTypeInfo jsonTypeInfo, Dictionary updateMapping) { + try { + if (CheckFolderAndFile(filePath, true)) { + var fileValue = File.ReadAllText(filePath); + if (!string.IsNullOrWhiteSpace(fileValue)) { + + using JsonDocument doc = JsonDocument.Parse(fileValue); + + JsonObject? jsonObject = JsonObject.Create(doc.RootElement); + if (jsonObject != null) { + foreach (var item in jsonObject.ToList()) { + var updateKey = updateMapping.FirstOrDefault(mappingItem => mappingItem.Key == item.Key).Value; + if (updateKey != null) { + JsonNode? valueCopy = item.Value?.DeepClone(); + + jsonObject.Add(updateKey, valueCopy); + jsonObject.Remove(item.Key); + + File.WriteAllText(filePath, jsonObject.ToJsonString(new() { WriteIndented = true })); + return true; + } + } + } + + + } + } + } + catch(Exception ex) { + switch (ex) { + case SecurityException: + //TODO + break; + case UnauthorizedAccessException: + //TODO + break; + case PathTooLongException: + //TODO + break; + case IOException: + //TODO + break; + case JsonException: + //TODO + break; + default: + throw; + } + } + return false; + } } diff --git a/BadMC_Launcher/Services/Settings/MinecraftConfigService.cs b/BadMC_Launcher/Services/Settings/MinecraftConfigService.cs index 8742465..0368eed 100644 --- a/BadMC_Launcher/Services/Settings/MinecraftConfigService.cs +++ b/BadMC_Launcher/Services/Settings/MinecraftConfigService.cs @@ -23,6 +23,7 @@ using BadMC_Launcher.Extensions; using BadMC_Launcher.Classes.Minecraft; using BadMC_Launcher.Models.Datas; +using BadMC_Launcher.Models.Datas.Mappings; namespace BadMC_Launcher.Servicess.Settings; public class MinecraftConfigService : IConfigClass { @@ -31,7 +32,7 @@ public class MinecraftConfigService : IConfigClass { public MinecraftConfigService() { if (MinecraftConfig.minecraftAccounts is ObservableDataList minecraftAccountsObservableDataList && MinecraftConfig.javaPaths is ObservableDataList javaPathsObservableDataList - && MinecraftConfig.minecraftPaths is ObservableDataList minecraftPathsObservableDataList) { + && MinecraftConfig.minecraftPaths is ObservableDataList minecraftPathsObservableDataList) { //Triggers an event when a property is changed minecraftAccountsObservableDataList.CollectionChanged += OnCollectionChanged; @@ -58,7 +59,7 @@ public IEnumerable JavaPaths { SyncSettingSet(); } } - public IEnumerable MinecraftPaths { + public IEnumerable MinecraftFolders { get => MinecraftConfig.minecraftPaths; set { MinecraftConfig.minecraftPaths = value; @@ -78,10 +79,10 @@ public JavaEntry? ActiveJavaPath { } } - public string? ActiveMinecraftPath { - get => MinecraftConfig.activeMinecraftPath; + public string? ActiveMinecraftFolderPath { + get => MinecraftConfig.activeMinecraftFolder; set { - MinecraftConfig.activeMinecraftPath = value; + MinecraftConfig.activeMinecraftFolder = value; //Write to Json SyncSettingSet(); @@ -118,6 +119,16 @@ public bool IsEnableIndependencyCore { } } + public bool IsAutoMemorySize { + get => MinecraftConfig.isAutoMemorySize; + set { + MinecraftConfig.isAutoMemorySize = value; + + //Write to Json + SyncSettingSet(); + } + } + public int MinMemorySize { get => MinecraftConfig.minMemorySize; set { @@ -166,16 +177,17 @@ private void OnCollectionChanged(object? sender, NotifyCollectionChangedEventArg } public bool SyncSettingGet() { - if (App.GetService().ReadConfig(Path.Combine(AppDataPath.ConfigsPath, "MinecraftConfigs.json"), MinecraftConfigServiceContext.Default.MinecraftConfigService, out var jsonClass) && jsonClass != null) { + if (App.GetService().ReadConfig(Path.Combine(AppDataPath.ConfigsPath, "MinecraftConfigs.json"), MinecraftConfigServiceContext.Default.MinecraftConfigService, out var jsonClass, UpdateMapping.MinecraftConfig) && jsonClass != null) { //TODO: 解蜜 MinecraftConfig.minecraftAccounts = jsonClass.MinecraftAccounts; MinecraftConfig.javaPaths = jsonClass.JavaPaths; - MinecraftConfig.minecraftPaths = jsonClass.MinecraftPaths; + MinecraftConfig.minecraftPaths = jsonClass.MinecraftFolders; MinecraftConfig.activeJavaPath = jsonClass.ActiveJavaPath; - MinecraftConfig.activeMinecraftPath = jsonClass.ActiveMinecraftPath; + MinecraftConfig.activeMinecraftFolder = jsonClass.ActiveMinecraftFolderPath; MinecraftConfig.activeMinecraftAccount = jsonClass.ActiveMinecraftAccount; MinecraftConfig.isFullscreen = jsonClass.IsFullscreen; MinecraftConfig.isEnableIndependencyCore = jsonClass.IsEnableIndependencyCore; + MinecraftConfig.isAutoMemorySize = jsonClass.IsAutoMemorySize; MinecraftConfig.minMemorySize = jsonClass.MinMemorySize; MinecraftConfig.maxMemorySize = jsonClass.MaxMemorySize; MinecraftConfig.launcherName = jsonClass.LauncherName; @@ -197,7 +209,7 @@ public bool SyncSettingSet() { } MinecraftConfigService classValue = this; //TODO: 加蜜 - return App.GetService().WriteConfig(Path.Combine(AppDataPath.ConfigsPath, "MinecraftConfigs.json"), classValue, MinecraftConfigServiceContext.Default.MinecraftConfigService); + return App.GetService().WriteConfig(Path.Combine(AppDataPath.ConfigsPath, "MinecraftConfigs.json"), MinecraftConfigServiceContext.Default.MinecraftConfigService, classValue); } } diff --git a/BadMC_Launcher/Services/Settings/SingleMinecraftConfigService.cs b/BadMC_Launcher/Services/Settings/SingleMinecraftConfigService.cs index 9567f4d..1412d54 100644 --- a/BadMC_Launcher/Services/Settings/SingleMinecraftConfigService.cs +++ b/BadMC_Launcher/Services/Settings/SingleMinecraftConfigService.cs @@ -7,7 +7,6 @@ using BadMC_Launcher.Models.Datas.SettingsDatas; using BadMC_Launcher.Interfaces; using MinecraftLaunch.Base.Models.Game; -using MinecraftLaunch.Components.Parser; namespace BadMC_Launcher.Servicess.Settings; public class SingleMinecraftConfigService : IConfigClass { @@ -23,7 +22,7 @@ public string? TargetMinecraftEntryPath { } } - public bool IsFullscreen { + public bool? IsFullscreen { get => singleMinecraftConfigInstance.isFullscreen; set { singleMinecraftConfigInstance.isFullscreen = value; @@ -33,7 +32,7 @@ public bool IsFullscreen { } } - public bool IsEnableIndependencyCore { + public bool? IsEnableIndependencyCore { get => singleMinecraftConfigInstance.isEnableIndependencyCore; set { singleMinecraftConfigInstance.isEnableIndependencyCore = value; @@ -43,7 +42,17 @@ public bool IsEnableIndependencyCore { } } - public int MinMemorySize { + public bool? IsAutoMemorySize { + get => singleMinecraftConfigInstance.isAutoMemorySize; + set { + singleMinecraftConfigInstance.isAutoMemorySize = value; + + //Write to Json + SyncSettingSet(); + } + } + + public int? MinMemorySize { get => singleMinecraftConfigInstance.minMemorySize; set { singleMinecraftConfigInstance.minMemorySize = value; @@ -53,7 +62,7 @@ public int MinMemorySize { } } - public int MaxMemorySize { + public int? MaxMemorySize { get => singleMinecraftConfigInstance.maxMemorySize; set { singleMinecraftConfigInstance.maxMemorySize = value; @@ -99,6 +108,7 @@ public bool SyncSettingGet() { if(App.GetService().ReadConfig(Path.Combine(TargetMinecraftEntryPath, @"BadBCConfigs\MinecraftConfig.json"), SingleMinecraftConfigServiceContext.Default.SingleMinecraftConfigService, out var jsonClass) && jsonClass != null) { singleMinecraftConfigInstance.isFullscreen = jsonClass.IsFullscreen; singleMinecraftConfigInstance.isEnableIndependencyCore = jsonClass.IsEnableIndependencyCore; + singleMinecraftConfigInstance.isAutoMemorySize = jsonClass.IsAutoMemorySize; singleMinecraftConfigInstance.minMemorySize = jsonClass.MinMemorySize; singleMinecraftConfigInstance.maxMemorySize = jsonClass.MaxMemorySize; singleMinecraftConfigInstance.javaPath = jsonClass.JavaPath; @@ -114,7 +124,7 @@ public bool SyncSettingGet() { public bool SyncSettingSet() { if (TargetMinecraftEntryPath != null) { - return App.GetService().WriteConfig(Path.Combine(TargetMinecraftEntryPath, @"BadBCConfigs\MinecraftConfig.json"), this, SingleMinecraftConfigServiceContext.Default.SingleMinecraftConfigService); + return App.GetService().WriteConfig(Path.Combine(TargetMinecraftEntryPath, @"BadBCConfigs\MinecraftConfig.json"), SingleMinecraftConfigServiceContext.Default.SingleMinecraftConfigService, this); } //TODO: Toast return false; diff --git a/BadMC_Launcher/Services/Settings/ThemeSettingService.cs b/BadMC_Launcher/Services/Settings/ThemeSettingService.cs index f5c2deb..0c51ce3 100644 --- a/BadMC_Launcher/Services/Settings/ThemeSettingService.cs +++ b/BadMC_Launcher/Services/Settings/ThemeSettingService.cs @@ -3,15 +3,16 @@ using System.Drawing; using System.Linq; using System.Text; +using System.Text.Encodings.Web; using System.Text.Json; using System.Text.Json.Serialization; +using BadMC_Launcher.Enums; using BadMC_Launcher.Interfaces; -using CommunityToolkit.Mvvm.Messaging.Messages; +using BadMC_Launcher.Models.Datas; +using BadMC_Launcher.Models.Datas.SettingsDatas; using CommunityToolkit.Mvvm.Messaging; +using CommunityToolkit.Mvvm.Messaging.Messages; using Microsoft.UI.Xaml.Media.Imaging; -using BadMC_Launcher.Models.Datas.SettingsDatas; -using BadMC_Launcher.Models.Datas; -using BadMC_Launcher.Enums; namespace BadMC_Launcher.Servicess.Settings; public class ThemeSettingService : IConfigClass { @@ -112,7 +113,7 @@ public bool SyncSettingGet() { } public bool SyncSettingSet() { - if (App.GetService().WriteConfig(Path.Combine(AppDataPath.ConfigsPath, @"Settings\ThemeSettings.json"), this, ThemeSettingServiceContext.Default.ThemeSettingService)) { + if (App.GetService().WriteConfig(Path.Combine(AppDataPath.ConfigsPath, @"Settings\ThemeSettings.json"), ThemeSettingServiceContext.Default.ThemeSettingService, this)) { WeakReferenceMessenger.Default.Send(new ValueChangedMessage(this), "MinecraftConfigChanged"); return true; } diff --git a/BadMC_Launcher/Services/ViewServices/MainMenuService.cs b/BadMC_Launcher/Services/ViewServices/MainMenuService.cs index 195a7f9..58e6a86 100644 --- a/BadMC_Launcher/Services/ViewServices/MainMenuService.cs +++ b/BadMC_Launcher/Services/ViewServices/MainMenuService.cs @@ -4,17 +4,18 @@ using System.Text; using System.Threading.Tasks; using BadMC_Launcher.Classes; +using BadMC_Launcher.Classes.ViewClasses; using BadMC_Launcher.Interfaces; using BadMC_Launcher.Models.Datas.ViewDatas; namespace BadMC_Launcher.Services.ViewServices; public class MainMenuService { - public void Register(IMainMenuSharchFilterItem mainMenuSharchItem) { + public void SearchFilterRegister(IMainMenuSharchFilterItem mainMenuSharchItem) { MainMenuData.MainMenuSharchFilterItems.Add(mainMenuSharchItem); } - public void Register(MainMenuItem mainMenuItem) { + public void MenuItemRegister(MainMenuItem mainMenuItem) { MainMenuData.MainMenuItems.Add(mainMenuItem); } } diff --git a/BadMC_Launcher/Services/ViewServices/MainSideBarManagerService.cs b/BadMC_Launcher/Services/ViewServices/MainSideBarManagerService.cs index d8129c3..0bb398a 100644 --- a/BadMC_Launcher/Services/ViewServices/MainSideBarManagerService.cs +++ b/BadMC_Launcher/Services/ViewServices/MainSideBarManagerService.cs @@ -8,16 +8,17 @@ using BadMC_Launcher.ViewModels.Pages; using BadMC_Launcher.Classes; using Microsoft.Windows.ApplicationModel.Resources; -using BadMC_Launcher.Views.Pages.MainSideBarPages; +using BadMC_Launcher.Views.Pages.MainSideBar; using CommunityToolkit.Mvvm.Messaging.Messages; using CommunityToolkit.Mvvm.Messaging; using Newtonsoft.Json.Linq; -using BadMC_Launcher.Enums; +using BadMC_Launcher.Classes.ViewClasses; +using BadMC_Launcher.Enums.MessengerTokenEnum; namespace BadMC_Launcher.Services.ViewServices; public class MainSideBarManagerService { public void NavigateToPage() where T : Page { - WeakReferenceMessenger.Default.Send(new ValueChangedMessage(typeof(T)), MessengerTokenEnum.MainPage_MainSideBarFrameToken.ToString()); + WeakReferenceMessenger.Default.Send(new ValueChangedMessage(typeof(T)), MainPageMessengerTokenEnum.MainSideBarFrameToken.ToString()); } public void Register(MainSideBarItem mainSideBarItem, bool isFooter = false) { diff --git a/BadMC_Launcher/Services/ViewServices/SettingsService.cs b/BadMC_Launcher/Services/ViewServices/SettingsService.cs new file mode 100644 index 0000000..1af0c7a --- /dev/null +++ b/BadMC_Launcher/Services/ViewServices/SettingsService.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using BadMC_Launcher.Classes.ViewClasses; +using BadMC_Launcher.Models.Datas.ViewDatas; + +namespace BadMC_Launcher.Services.ViewServices; + +public class SettingsService { + public void SideBarRegister(SettingsSideBarItem settingsSideBarItem, bool isFooter = false) { + if (isFooter) { + SettingsData.SettingsSideBarFooterItems.Add(settingsSideBarItem); + } + else { + SettingsData.SettingsSideBarItems.Add(settingsSideBarItem); + } + } +} diff --git a/BadMC_Launcher/Strings/en-US/Resources.resw b/BadMC_Launcher/Strings/en-US/Resources.resw index a9cb965..cd397db 100644 --- a/BadMC_Launcher/Strings/en-US/Resources.resw +++ b/BadMC_Launcher/Strings/en-US/Resources.resw @@ -121,7 +121,7 @@ BadMC Launcher - BadMC Launcher - Let's MINECRAFT! + Launch with BadMCL (NOT BMCL!!!) No ontology selected_( ゚Д゚)ノ @@ -133,10 +133,10 @@ Refresh - Manage .minecraft folders + Manage Minecraft ontologies folders - Browse .minecraft folder + Browse Minecraft ontologies folders Can't find any ontologies. @@ -171,4 +171,50 @@ Let's BadMC Launcher! 🥳😝😈 + + Settings + + + Minecraft settings + + + Manage Minecraft ontologies folders + + + Lower priority + + + This setting will have a lower priority than ontology-specific customizations. +If something in this setting has been changed in an ontology-specific customization, that item will not take effect for this ontology. + + + Management of ontologies and resource storage locations. + + + Managing Java Runtime Memory + + + Setting the Java Runtime for Minecraft Java. + + + Java Runtime Memory + + + Set the memory used when running Minecraft Java. + + + Automatic distribution + + + Manual settings + + + Manage Minecraft ontologies folders + + + OK + + + Adding a new Minecraft ontologies folder + \ No newline at end of file diff --git a/BadMC_Launcher/Strings/zh-Hans/Resources.resw b/BadMC_Launcher/Strings/zh-Hans/Resources.resw index 7a1aef2..2e106e2 100644 --- a/BadMC_Launcher/Strings/zh-Hans/Resources.resw +++ b/BadMC_Launcher/Strings/zh-Hans/Resources.resw @@ -127,16 +127,16 @@ 未选择本体_( ゚Д゚)ノ - BadMC Launcher - 让我们一起MINECRAFT! + 使用 BadMCL(不是 BMCL!!!)启动 刷新 - 管理 .minecraft 文件夹 + 管理 Minecraft 本体文件夹 - 浏览 .minecraft 文件夹 + 浏览 Minecraft 本体文件夹 找不到任何本体. @@ -171,4 +171,50 @@ 让我们一起 BadMC Launcher! 🥳😝😈 + + 设置 + + + Minecraft 设置 + + + 管理 Minecraft 本体文件夹 + + + 更低的优先级 + + + 该设置的优先级将比特定于本体的自定义设置更低. +如果这个设置的某些项已在特定于本体的自定义设置中更改,该项将不会对这个本体生效. + + + 对本体以及资源的存储位置进行管理. + + + 管理 Java 运行时内存 + + + 为 Minecraft Java 设置 Java 运行时. + + + Java 运行时内存 + + + 设置运行 Minecraft Java 时所使用的内存. + + + 自动分配 + + + 手动设置 + + + 管理 Minecraft 本体文件夹 + + + 确定 + + + 添加新的 Minecraft 本体文件夹 + \ No newline at end of file diff --git a/BadMC_Launcher/ViewModels/ContentDialogs/Settings/MinecraftFolderContentDialogViewModel.cs b/BadMC_Launcher/ViewModels/ContentDialogs/Settings/MinecraftFolderContentDialogViewModel.cs new file mode 100644 index 0000000..a9c1c30 --- /dev/null +++ b/BadMC_Launcher/ViewModels/ContentDialogs/Settings/MinecraftFolderContentDialogViewModel.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using BadMC_Launcher.Classes.Minecraft; +using BadMC_Launcher.Servicess.Settings; + +namespace BadMC_Launcher.ViewModels.ContentDialogs.Settings; +public partial class MinecraftFolderContentDialogViewModel : ObservableObject { + private MinecraftConfigService minecraftCOnfigService = App.GetService(); + + public MinecraftFolderContentDialogViewModel() { + + MinecraftFoldersList = minecraftCOnfigService.MinecraftFolders.ToObservableCollection(); + } + + [ObservableProperty] + public partial ObservableCollection MinecraftFoldersList { get; set; } +} diff --git a/BadMC_Launcher/ViewModels/Pages/MainPageViewModel.cs b/BadMC_Launcher/ViewModels/Pages/MainPageViewModel.cs index 7f3a8fb..7de4dd6 100644 --- a/BadMC_Launcher/ViewModels/Pages/MainPageViewModel.cs +++ b/BadMC_Launcher/ViewModels/Pages/MainPageViewModel.cs @@ -10,7 +10,8 @@ using Microsoft.UI.Xaml.Controls.Primitives; using Microsoft.UI.Xaml.Media.Animation; using Uno.UI.RemoteControl; -using BadMC_Launcher.Enums; +using BadMC_Launcher.Classes.ViewClasses; +using BadMC_Launcher.Enums.MessengerTokenEnum; namespace BadMC_Launcher.ViewModels.Pages; @@ -53,7 +54,7 @@ public MainPageViewModel() { public partial Visibility MainSideBarToolVisibility { get; set; } [RelayCommand] - public void MainSideBarFrameNavigated(object parameter) { + private void MainSideBarFrameNavigated(object parameter) { if (parameter is Frame frame) { if (frame.Content == null) { MainSideBarToolVisibility = Visibility.Collapsed; @@ -65,32 +66,32 @@ public void MainSideBarFrameNavigated(object parameter) { } [RelayCommand] - public void MainSideBarSelectionChanged(object parameter) { + private void MainSideBarSelectionChanged(object parameter) { if (parameter is NavigationView mainSideBar && mainSideBar.SelectedItem != null) { - SendInvokeFuncMessage(((MainSideBarItem)mainSideBar.SelectedItem).NavigatePage, MessengerTokenEnum.MainPage_FlyoutPageNavigateToken); + SendInvokeFuncMessage(((MainSideBarItem)mainSideBar.SelectedItem).NavigatePage, MainPageMessengerTokenEnum.FlyoutPageNavigateToken); } } [RelayCommand(CanExecute = nameof(MainSideBarFrameCanGoBack))] - public void BackButton(Frame parameter) { + private void BackButton(Frame parameter) { if (parameter.CanGoBack) { parameter.GoBack(); } } [RelayCommand] - public void CloseButton(Frame parameter) { + private void CloseButton(Frame parameter) { parameter.Content = null; MainSideBarToolVisibility = Visibility.Collapsed; } [RelayCommand] - public void MainSideBarFlyoutClosed() { + private void MainSideBarFlyoutClosed() { MainSideBarSelectedItem = null; } internal void SetCanGoBack() { - var mainSideBarFrame = SendGetValueMessage(MessengerTokenEnum.MainPage_MainSideBarFrameToken); + var mainSideBarFrame = SendGetValueMessage(MainPageMessengerTokenEnum.MainSideBarFrameToken); if (mainSideBarFrame != null) { MainSideBarFrameCanGoBack = mainSideBarFrame.Response.CanGoBack; if (mainSideBarFrame.Response.Content == null) { @@ -102,11 +103,11 @@ internal void SetCanGoBack() { } } - public void SendInvokeFuncMessage(T value, MessengerTokenEnum tokenEnum) { + private void SendInvokeFuncMessage(T value, Enum tokenEnum) { WeakReferenceMessenger.Default.Send(new ValueChangedMessage(value), tokenEnum.ToString()); } - public RequestMessage SendGetValueMessage(MessengerTokenEnum tokenEnum) { + private RequestMessage SendGetValueMessage(Enum tokenEnum) { return WeakReferenceMessenger.Default.Send(new RequestMessage(), tokenEnum.ToString()); } } diff --git a/BadMC_Launcher/ViewModels/Pages/MainSideBarPages/MainMenuPageViewModel.cs b/BadMC_Launcher/ViewModels/Pages/MainSideBar/MainMenuPageViewModel.cs similarity index 77% rename from BadMC_Launcher/ViewModels/Pages/MainSideBarPages/MainMenuPageViewModel.cs rename to BadMC_Launcher/ViewModels/Pages/MainSideBar/MainMenuPageViewModel.cs index a55cf27..ad6fe3c 100644 --- a/BadMC_Launcher/ViewModels/Pages/MainSideBarPages/MainMenuPageViewModel.cs +++ b/BadMC_Launcher/ViewModels/Pages/MainSideBar/MainMenuPageViewModel.cs @@ -6,14 +6,15 @@ using System.Text; using System.Threading.Tasks; using BadMC_Launcher.Classes; -using BadMC_Launcher.Classes.MainSearch; -using BadMC_Launcher.Enums; +using BadMC_Launcher.Classes.ViewClasses; +using BadMC_Launcher.Classes.ViewClasses.MainSearch; +using BadMC_Launcher.Enums.MessengerTokenEnum; using BadMC_Launcher.Extensions; using BadMC_Launcher.Interfaces; using BadMC_Launcher.Models.Datas.ViewDatas; using BadMC_Launcher.Services.ViewServices; -using BadMC_Launcher.Views.Pages.MainSideBarPages; -using BadMC_Launcher.Views.Pages.SettingsPages; +using BadMC_Launcher.Views.Pages.MainSideBar; +using BadMC_Launcher.Views.Pages.Settings; using CommunityToolkit.Labs.WinUI; using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Messaging; @@ -21,7 +22,7 @@ using CommunityToolkit.WinUI.Controls; using Microsoft.Windows.ApplicationModel.Resources; -namespace BadMC_Launcher.ViewModels.Pages.MainSideBarPages; +namespace BadMC_Launcher.ViewModels.Pages.MainSideBar; public partial class MainMenuPageViewModel : ObservableObject { public MainMenuPageViewModel() { MainMenuItems = MainMenuData.MainMenuItems; @@ -52,26 +53,26 @@ public MainMenuPageViewModel() { //TODO: 该写Blog了,还能这样的啊???Σ(っ °Д °;)っ [RelayCommand] - public void MainMenuSearchButtonClicked(AutoSuggestBoxQuerySubmittedEventArgs args) { + private void MainMenuSearchButtonClicked(AutoSuggestBoxQuerySubmittedEventArgs args) { MainMenuSearch(args.QueryText); } [RelayCommand] - public void SearchTextChanged(AutoSuggestBoxTextChangedEventArgs args) { + private void SearchTextChanged(AutoSuggestBoxTextChangedEventArgs args) { if (SearchFilterRealTimeToggleIsOn && args.Reason == AutoSuggestionBoxTextChangeReason.UserInput) { MainMenuSearch(SearchText); } } [RelayCommand] - public void MainMenuSearchSuggestionChosen(AutoSuggestBoxSuggestionChosenEventArgs args) { + private void MainMenuSearchSuggestionChosen(AutoSuggestBoxSuggestionChosenEventArgs args) { if (args.SelectedItem is MainMenuSearchResultItem selectedItem) { selectedItem.Navigate.Invoke(); } } [RelayCommand] - public void MainMenuSearchFilterTokenViewSelected(TokenView parameter) { + private void MainMenuSearchFilterTokenViewSelected(TokenView parameter) { parameter.SelectedItems.ForEach(item => { if (item is IMainMenuSharchFilterItem mainMenuSharchFilterItem) { SearchFilterSelectedItems.Add(mainMenuSharchFilterItem); @@ -80,11 +81,11 @@ public void MainMenuSearchFilterTokenViewSelected(TokenView parameter) { } [RelayCommand] - public void SettingsButtonClicked() { - WeakReferenceMessenger.Default.Send(new ValueChangedMessage(typeof(SettingsDashboardPage)), MessengerTokenEnum.MainPage_PageNavigateToken.ToString()); + private void SettingsButtonClicked() { + WeakReferenceMessenger.Default.Send(new ValueChangedMessage(typeof(SettingsDashboardPage)), MainPageMessengerTokenEnum.PageNavigateToken.ToString()); } - public void MainMenuSearch(string queryText) { + private void MainMenuSearch(string queryText) { var searchItems = new ObservableDataList(); foreach (var item in SearchFilterSelectedItems) { foreach (var searchMainMenuSearchResultItem in item.Search(queryText)) { diff --git a/BadMC_Launcher/ViewModels/Pages/Settings/LaunchSettingsPageViewModel.cs b/BadMC_Launcher/ViewModels/Pages/Settings/LaunchSettingsPageViewModel.cs new file mode 100644 index 0000000..5747c07 --- /dev/null +++ b/BadMC_Launcher/ViewModels/Pages/Settings/LaunchSettingsPageViewModel.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using BadMC_Launcher.Classes.Minecraft; +using BadMC_Launcher.Enums; +using BadMC_Launcher.Enums.MessengerTokenEnum; +using BadMC_Launcher.Models.Datas.SettingsDatas; +using BadMC_Launcher.Servicess.Settings; +using BadMC_Launcher.Views.ContentDialogs.Settings; +using BadMC_Launcher.Views.Pages.Settings; +using CommunityToolkit.Mvvm.Input; +using CommunityToolkit.Mvvm.Messaging; +using CommunityToolkit.Mvvm.Messaging.Messages; +using MinecraftLaunch.Base.Models.Game; +using MinecraftLaunch.Utilities; + +namespace BadMC_Launcher.ViewModels.Pages.Settings; + +public partial class LaunchSettingsPageViewModel : ObservableObject { + private readonly XamlRoot? mainPageXamlRoot; + private MinecraftConfigService service = App.GetService(); + + public LaunchSettingsPageViewModel() { + mainPageXamlRoot = SendGetValueMessage(MainPageMessengerTokenEnum.XamlRootToken).Response; + Java = service.ActiveJavaPath; + MinecraftFolder = service.MinecraftFolders.First(item => item.MinecraftFolderPath == service.ActiveMinecraftFolderPath); + IsAutoMemorySize = service.IsAutoMemorySize; + } + + [ObservableProperty] + public partial MinecraftFolderEntry? MinecraftFolder { get; set; } + + [ObservableProperty] + public partial JavaEntry? Java { get; set; } + + [ObservableProperty] + public partial bool IsAutoMemorySize { get; set; } + + [RelayCommand(FlowExceptionsToTaskScheduler = true)] + private async Task MinecraftFolderSettingsCardClicked() { + if (mainPageXamlRoot != null) { + var dialog = App.GetService(); + dialog.XamlRoot = mainPageXamlRoot; + + await dialog.ShowAsync(); + } + } + + [RelayCommand(FlowExceptionsToTaskScheduler = true)] + private async Task JavaPathSettingsCardClicked() { + if (mainPageXamlRoot != null) { + var dialog = App.GetService(); + dialog.XamlRoot = mainPageXamlRoot; + + await dialog.ShowAsync(); + } + } + + [RelayCommand] + private void IsAutoMemorySizeSwitchToggled() { + service.IsAutoMemorySize = IsAutoMemorySize; + } + + private RequestMessage SendGetValueMessage(Enum tokenEnum) { + return WeakReferenceMessenger.Default.Send(new RequestMessage(), tokenEnum.ToString()); + } +} diff --git a/BadMC_Launcher/ViewModels/Pages/Settings/SettingsDashboardPageViewModel.cs b/BadMC_Launcher/ViewModels/Pages/Settings/SettingsDashboardPageViewModel.cs new file mode 100644 index 0000000..924b3cd --- /dev/null +++ b/BadMC_Launcher/ViewModels/Pages/Settings/SettingsDashboardPageViewModel.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using BadMC_Launcher.Classes.ViewClasses; +using BadMC_Launcher.Enums.MessengerTokenEnum; +using BadMC_Launcher.Models.Datas.ViewDatas; +using BadMC_Launcher.Services.ViewServices; +using CommunityToolkit.Mvvm.Input; +using CommunityToolkit.Mvvm.Messaging; +using CommunityToolkit.Mvvm.Messaging.Messages; +using Microsoft.UI.Xaml.Media.Animation; + +namespace BadMC_Launcher.ViewModels.Pages.Settings; + +public partial class SettingsDashboardPageViewModel : ObservableObject { + public SettingsDashboardPageViewModel() { + SideBarItems = SettingsData.SettingsSideBarItems; + FootSideBarItems = SettingsData.SettingsSideBarFooterItems; + } + [ObservableProperty] + public partial ObservableCollection SideBarItems { get; set; } + + [ObservableProperty] + public partial ObservableCollection FootSideBarItems { get; set; } + + [ObservableProperty] + public partial SettingsSideBarItem? SideBarSelectedItem { get; set; } + + [RelayCommand] + private void FrameLoaded() { + if (SideBarItems.Count > 0) { + SideBarSelectedItem = SideBarItems[0]; + } + } + + [RelayCommand] + private void SideBarSelectionChanged(Frame parameter) { + if (SideBarSelectedItem != null) { + parameter.Navigate(SideBarSelectedItem.NavigatePage); + } + } +} diff --git a/BadMC_Launcher/ViewModels/Pages/SettingsPages/SettingsDashboardPageViewModel.cs b/BadMC_Launcher/ViewModels/Pages/SettingsPages/SettingsDashboardPageViewModel.cs deleted file mode 100644 index 102842e..0000000 --- a/BadMC_Launcher/ViewModels/Pages/SettingsPages/SettingsDashboardPageViewModel.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace BadMC_Launcher.ViewModels.Pages.SettingsPages; - -public class SettingsDashboardPageViewModel : ObservableObject { -} diff --git a/BadMC_Launcher/ViewModels/UserControls/LaunchPadViewModel.cs b/BadMC_Launcher/ViewModels/UserControls/LaunchPadViewModel.cs index a0d815e..ecff8b2 100644 --- a/BadMC_Launcher/ViewModels/UserControls/LaunchPadViewModel.cs +++ b/BadMC_Launcher/ViewModels/UserControls/LaunchPadViewModel.cs @@ -15,15 +15,15 @@ namespace BadMC_Launcher.ViewModels.UserControls; public partial class LaunchPadViewModel : ObservableObject { MinecraftConfigService MinecraftService = App.GetService(); - MinecraftPathEntry? minecraftPathEntry; + MinecraftFolderEntry? minecraftPathEntry; ObservableCollection minecraftList = new ObservableCollection(); public LaunchPadViewModel() { //Check Active Minecraft Path - if (MinecraftService.ActiveMinecraftPath != null) { + if (MinecraftService.ActiveMinecraftFolderPath != null) { //Get Minecraft Entry - minecraftPathEntry = MinecraftService.MinecraftPaths.First(item => item.MinecraftPath == MinecraftService.ActiveMinecraftPath); + minecraftPathEntry = MinecraftService.MinecraftFolders.FirstOrDefault(item => item.MinecraftFolderPath == MinecraftService.ActiveMinecraftFolderPath); if (minecraftPathEntry != null) { //Get Minecraft Items @@ -41,11 +41,11 @@ public LaunchPadViewModel() { MinecraftListSelectedItem = MinecraftList.FirstOrDefault(item => item.MinecraftId == minecraftItem.MinecraftId); } } - MinecraftPathListSelectedItem = minecraftPathEntry; + MinecraftFolderListSelectedItem = minecraftPathEntry; } } - MinecraftPathList = new ObservableCollection(MinecraftService.MinecraftPaths); + MinecraftFolderList = new ObservableCollection(MinecraftService.MinecraftFolders); SetLaunchButtonEntry(); } @@ -62,10 +62,10 @@ public LaunchPadViewModel() { //MinecraftFolderPathsList [ObservableProperty] - public partial ObservableCollection? MinecraftPathList { get; set; } + public partial ObservableCollection? MinecraftFolderList { get; set; } [ObservableProperty] - public partial MinecraftPathEntry? MinecraftPathListSelectedItem { get; set; } + public partial MinecraftFolderEntry? MinecraftFolderListSelectedItem { get; set; } [ObservableProperty] public partial MinecraftItem? MinecraftListSelectedItem { get; set; } @@ -80,8 +80,8 @@ public void LaunchButton() { public void RefreshMinecraftList() { //Get Configs From Json File MinecraftService.SyncSettingGet(); - minecraftPathEntry = MinecraftService.MinecraftPaths.FirstOrDefault(item => item.MinecraftPath == MinecraftService.ActiveMinecraftPath); - if (MinecraftService.ActiveMinecraftPath != null && minecraftPathEntry != null) { + minecraftPathEntry = MinecraftService.MinecraftFolders.FirstOrDefault(item => item.MinecraftFolderPath == MinecraftService.ActiveMinecraftFolderPath); + if (MinecraftService.ActiveMinecraftFolderPath != null && minecraftPathEntry != null) { minecraftPathEntry.GetMinecrafts(); MinecraftList = minecraftList; SetLaunchButtonEntry(); @@ -90,9 +90,9 @@ public void RefreshMinecraftList() { [RelayCommand] public void ViewLoaclMinecraftFolder() { - if (MinecraftService.ActiveMinecraftPath != null) { + if (MinecraftService.ActiveMinecraftFolderPath != null) { try { - using (Process.Start(new ProcessStartInfo(MinecraftService.ActiveMinecraftPath) { + using (Process.Start(new ProcessStartInfo(MinecraftService.ActiveMinecraftFolderPath) { UseShellExecute = true, Verb = "open" })) { @@ -118,7 +118,7 @@ public void ViewLoaclMinecraftFolder() { public void MinecraftListSelected(object parameter) { if (parameter is ListView listView) { var item = (MinecraftItem)listView.SelectedItem; - if (item != null && MinecraftService.ActiveMinecraftPath != null && minecraftPathEntry != null) { + if (item != null && MinecraftService.ActiveMinecraftFolderPath != null && minecraftPathEntry != null) { minecraftPathEntry.ActiveMinecraftEntryId = item.MinecraftId; SetLaunchButtonEntry(); } @@ -126,12 +126,12 @@ public void MinecraftListSelected(object parameter) { } [RelayCommand] - public void MinecraftPathsListSelected(object parameter) { + public void MinecraftFoldersListSelected(object parameter) { if (parameter is ComboBox comboBox) { - var item = (MinecraftPathEntry)comboBox.SelectedItem; - MinecraftService.ActiveMinecraftPath = item.MinecraftPath; - minecraftPathEntry = MinecraftService.MinecraftPaths.FirstOrDefault(item => item.MinecraftPath == MinecraftService.ActiveMinecraftPath); - if (MinecraftService.ActiveMinecraftPath != null && minecraftPathEntry != null) { + var item = (MinecraftFolderEntry)comboBox.SelectedItem; + MinecraftService.ActiveMinecraftFolderPath = item.MinecraftFolderPath; + minecraftPathEntry = MinecraftService.MinecraftFolders.FirstOrDefault(item => item.MinecraftFolderPath == MinecraftService.ActiveMinecraftFolderPath); + if (MinecraftService.ActiveMinecraftFolderPath != null && minecraftPathEntry != null) { MinecraftList = (ObservableCollection)minecraftPathEntry.GetMinecraftItems(); if (minecraftPathEntry.ActiveMinecraftEntryId != null) { MinecraftListSelectedItem = minecraftPathEntry.GetMinecraftItem(minecraftPathEntry.ActiveMinecraftEntryId); diff --git a/BadMC_Launcher/Views/ContentDialogs/Settings/MinecraftFolderContentDialog.xaml b/BadMC_Launcher/Views/ContentDialogs/Settings/MinecraftFolderContentDialog.xaml new file mode 100644 index 0000000..ed95053 --- /dev/null +++ b/BadMC_Launcher/Views/ContentDialogs/Settings/MinecraftFolderContentDialog.xaml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + diff --git a/BadMC_Launcher/Views/ContentDialogs/Settings/MinecraftFolderContentDialog.xaml.cs b/BadMC_Launcher/Views/ContentDialogs/Settings/MinecraftFolderContentDialog.xaml.cs new file mode 100644 index 0000000..5a02628 --- /dev/null +++ b/BadMC_Launcher/Views/ContentDialogs/Settings/MinecraftFolderContentDialog.xaml.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices.WindowsRuntime; +using Windows.Foundation; +using Windows.Foundation.Collections; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Controls.Primitives; +using Microsoft.UI.Xaml.Data; +using Microsoft.UI.Xaml.Input; +using Microsoft.UI.Xaml.Media; +using Microsoft.UI.Xaml.Navigation; +using BadMC_Launcher.ViewModels.ContentDialogs.Settings; + +namespace BadMC_Launcher.Views.ContentDialogs.Settings; + +public sealed partial class MinecraftFolderContentDialog : ContentDialog { + public MinecraftFolderContentDialog() { + this.InitializeComponent(); + DataContext = new MinecraftFolderContentDialogViewModel(); + + } + +} diff --git a/BadMC_Launcher/Views/Pages/MainPage.xaml b/BadMC_Launcher/Views/Pages/MainPage.xaml index 1a05d2e..7b0edc5 100644 --- a/BadMC_Launcher/Views/Pages/MainPage.xaml +++ b/BadMC_Launcher/Views/Pages/MainPage.xaml @@ -10,7 +10,6 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:skia="http://uno.ui/skia" xmlns:ui="using:CommunityToolkit.WinUI" - xmlns:win="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:userControls="using:BadMC_Launcher.Views.UserControls" xmlns:utu="using:Uno.Toolkit.UI" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" @@ -165,7 +164,7 @@ - + - - - - - - - - - - - - - - - - - - - - + + Width="16" + Height="16"> - + @@ -251,9 +223,9 @@ Command="{Binding CloseButtonCommand}" CommandParameter="{Binding ElementName=MainSideBarFrame}" Style="{StaticResource ButtonTransparentStyle}"> - diff --git a/BadMC_Launcher/Views/Pages/MainPage.xaml.cs b/BadMC_Launcher/Views/Pages/MainPage.xaml.cs index 1b6224a..cb7bb8f 100644 --- a/BadMC_Launcher/Views/Pages/MainPage.xaml.cs +++ b/BadMC_Launcher/Views/Pages/MainPage.xaml.cs @@ -1,4 +1,4 @@ -using BadMC_Launcher.Enums; +using BadMC_Launcher.Enums.MessengerTokenEnum; using BadMC_Launcher.Servicess.Settings; using BadMC_Launcher.ViewModels.Pages; using CommunityToolkit.Mvvm.Messaging; @@ -14,15 +14,16 @@ public MainPage() { DataContext = new MainPageViewModel(); //Register NavigationToPage Messengers - WeakReferenceMessenger.Default.Register, string>(this, MessengerTokenEnum.MainPage_PageNavigateToken.ToString(), MainFramePageNavigate); - WeakReferenceMessenger.Default.Register, string>(this, MessengerTokenEnum.MainPage_FlyoutPageNavigateToken.ToString(), MainFlyoutFramePageNavigate); + WeakReferenceMessenger.Default.Register, string>(this, MainPageMessengerTokenEnum.PageNavigateToken.ToString(), MainFrameNavigate); + WeakReferenceMessenger.Default.Register, string>(this, MainPageMessengerTokenEnum.FlyoutPageNavigateToken.ToString(), MainFlyoutFrameNavigate); //Register Frame Messengers - WeakReferenceMessenger.Default.Register, string>(this, MessengerTokenEnum.MainPage_MainSideBarFrameToken.ToString(), (r, m) => m.Reply(MainSideBarFrame)); - WeakReferenceMessenger.Default.Register, string>(this, MessengerTokenEnum.MainPage_MainSideBarFlyoutFrameToken.ToString(), (r, m) => m.Reply(MainSideBarFlyoutFrame)); + WeakReferenceMessenger.Default.Register, string>(this, MainPageMessengerTokenEnum.MainSideBarFrameToken.ToString(), (r, m) => m.Reply(MainSideBarFrame)); + WeakReferenceMessenger.Default.Register, string>(this, MainPageMessengerTokenEnum.MainSideBarFlyoutFrameToken.ToString(), (r, m) => m.Reply(MainSideBarFlyoutFrame)); + WeakReferenceMessenger.Default.Register, string>(this, MainPageMessengerTokenEnum.XamlRootToken.ToString(), (r, m) => m.Reply(this.XamlRoot)); } - public void MainFramePageNavigate(object recipient, ValueChangedMessage message) { + public void MainFrameNavigate(object recipient, ValueChangedMessage message) { MainSideBarFlyout.Hide(); if (MainSideBarFrame.Content != null && MainSideBarFrame.Content.GetType() == message.Value) { return; @@ -33,7 +34,7 @@ public void MainFramePageNavigate(object recipient, ValueChangedMessage me } } - public void MainFlyoutFramePageNavigate(object recipient, ValueChangedMessage message) { + public void MainFlyoutFrameNavigate(object recipient, ValueChangedMessage message) { if (MainSideBarFrame.Content != null && MainSideBarFrame.Content.GetType() == message.Value) { return; } @@ -42,6 +43,5 @@ public void MainFlyoutFramePageNavigate(object recipient, ValueChangedMessage diff --git a/BadMC_Launcher/Views/Pages/MainSideBarPages/MainMenuPage.xaml.cs b/BadMC_Launcher/Views/Pages/MainSideBar/MainMenuPage.xaml.cs similarity index 87% rename from BadMC_Launcher/Views/Pages/MainSideBarPages/MainMenuPage.xaml.cs rename to BadMC_Launcher/Views/Pages/MainSideBar/MainMenuPage.xaml.cs index 49c2332..d61bdd6 100644 --- a/BadMC_Launcher/Views/Pages/MainSideBarPages/MainMenuPage.xaml.cs +++ b/BadMC_Launcher/Views/Pages/MainSideBar/MainMenuPage.xaml.cs @@ -12,11 +12,11 @@ using Microsoft.UI.Xaml.Input; using Microsoft.UI.Xaml.Media; using Microsoft.UI.Xaml.Navigation; -using BadMC_Launcher.ViewModels.Pages.MainSideBarPages; +using BadMC_Launcher.ViewModels.Pages.MainSideBar; // The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=234238 -namespace BadMC_Launcher.Views.Pages.MainSideBarPages; +namespace BadMC_Launcher.Views.Pages.MainSideBar; /// /// An empty page that can be used on its own or navigated to within a Frame. diff --git a/BadMC_Launcher/Views/Pages/Settings/LaunchSettingsPage.xaml b/BadMC_Launcher/Views/Pages/Settings/LaunchSettingsPage.xaml new file mode 100644 index 0000000..7546831 --- /dev/null +++ b/BadMC_Launcher/Views/Pages/Settings/LaunchSettingsPage.xaml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BadMC_Launcher/Views/Pages/Settings/LaunchSettingsPage.xaml.cs b/BadMC_Launcher/Views/Pages/Settings/LaunchSettingsPage.xaml.cs new file mode 100644 index 0000000..8877edc --- /dev/null +++ b/BadMC_Launcher/Views/Pages/Settings/LaunchSettingsPage.xaml.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices.WindowsRuntime; +using Windows.Foundation; +using Windows.Foundation.Collections; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Controls.Primitives; +using Microsoft.UI.Xaml.Data; +using Microsoft.UI.Xaml.Input; +using Microsoft.UI.Xaml.Media; +using Microsoft.UI.Xaml.Navigation; +using BadMC_Launcher.ViewModels.Pages.Settings; + +// The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=234238 + +namespace BadMC_Launcher.Views.Pages.Settings; + +/// +/// An empty page that can be used on its own or navigated to within a Frame. +/// +public sealed partial class LaunchSettingsPage : Page { + public LaunchSettingsPage() { + InitializeComponent(); + DataContext = new LaunchSettingsPageViewModel(); + } +} + diff --git a/BadMC_Launcher/Views/Pages/Settings/SettingsDashboardPage.xaml b/BadMC_Launcher/Views/Pages/Settings/SettingsDashboardPage.xaml new file mode 100644 index 0000000..6fa77dd --- /dev/null +++ b/BadMC_Launcher/Views/Pages/Settings/SettingsDashboardPage.xaml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BadMC_Launcher/Views/Pages/SettingsPages/SettingsDashboardPage.xaml.cs b/BadMC_Launcher/Views/Pages/Settings/SettingsDashboardPage.xaml.cs similarity index 75% rename from BadMC_Launcher/Views/Pages/SettingsPages/SettingsDashboardPage.xaml.cs rename to BadMC_Launcher/Views/Pages/Settings/SettingsDashboardPage.xaml.cs index 927c208..d36eb92 100644 --- a/BadMC_Launcher/Views/Pages/SettingsPages/SettingsDashboardPage.xaml.cs +++ b/BadMC_Launcher/Views/Pages/Settings/SettingsDashboardPage.xaml.cs @@ -3,20 +3,24 @@ using System.IO; using System.Linq; using System.Runtime.InteropServices.WindowsRuntime; -using BadMC_Launcher.ViewModels.Pages.SettingsPages; +using BadMC_Launcher.Enums.MessengerTokenEnum; +using BadMC_Launcher.ViewModels.Pages.Settings; +using CommunityToolkit.Mvvm.Messaging; +using CommunityToolkit.Mvvm.Messaging.Messages; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Controls.Primitives; using Microsoft.UI.Xaml.Data; using Microsoft.UI.Xaml.Input; using Microsoft.UI.Xaml.Media; +using Microsoft.UI.Xaml.Media.Animation; using Microsoft.UI.Xaml.Navigation; using Windows.Foundation; using Windows.Foundation.Collections; // The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=234238 -namespace BadMC_Launcher.Views.Pages.SettingsPages; +namespace BadMC_Launcher.Views.Pages.Settings; /// /// An empty page that can be used on its own or navigated to within a Frame. /// diff --git a/BadMC_Launcher/Views/Pages/SettingsPages/SettingsDashboardPage.xaml b/BadMC_Launcher/Views/Pages/SettingsPages/SettingsDashboardPage.xaml deleted file mode 100644 index dc8627d..0000000 --- a/BadMC_Launcher/Views/Pages/SettingsPages/SettingsDashboardPage.xaml +++ /dev/null @@ -1,11 +0,0 @@ - - - - diff --git a/BadMC_Launcher/Views/Styles/Templates/ItemTemplate/MinecraftFolderItemsTemplate.xaml b/BadMC_Launcher/Views/Styles/Templates/ItemTemplate/MinecraftFolderItemsTemplate.xaml new file mode 100644 index 0000000..30a9954 --- /dev/null +++ b/BadMC_Launcher/Views/Styles/Templates/ItemTemplate/MinecraftFolderItemsTemplate.xaml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/BadMC_Launcher/Views/Styles/Templates/ItemTemplate/MinecraftPathItemsTemplate.xaml b/BadMC_Launcher/Views/Styles/Templates/ItemTemplate/MinecraftPathItemsTemplate.xaml deleted file mode 100644 index 744711f..0000000 --- a/BadMC_Launcher/Views/Styles/Templates/ItemTemplate/MinecraftPathItemsTemplate.xaml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - diff --git a/BadMC_Launcher/Views/UserControls/LaunchPad.xaml b/BadMC_Launcher/Views/UserControls/LaunchPad.xaml index f6046ea..f84133a 100644 --- a/BadMC_Launcher/Views/UserControls/LaunchPad.xaml +++ b/BadMC_Launcher/Views/UserControls/LaunchPad.xaml @@ -102,20 +102,20 @@ - + ItemTemplate="{StaticResource MinecraftFolderItemsTemplateSecondary}" + ItemsSource="{Binding MinecraftFolderList}" + SelectedItem="{Binding MinecraftFolderListSelectedItem, Mode=TwoWay}"> - - + + diff --git a/Directory.Packages.props b/Directory.Packages.props index 8d819f6..a4b1244 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -13,6 +13,7 @@ + diff --git a/docs/README_enUS.md b/docs/README_enUS.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/Release.md b/docs/Release.md new file mode 100644 index 0000000..e69de29 diff --git a/publish.sh b/publish.sh new file mode 100644 index 0000000..e69de29 From e87870abd4b1938b45c2ab7488b209ba69bbf35c Mon Sep 17 00:00:00 2001 From: Starcloudsea <84891987+Starcloudsea@users.noreply.github.com> Date: Wed, 19 Mar 2025 23:34:14 +0800 Subject: [PATCH 02/40] Debug --- .github/workflows/publish-ci.yml | 2 ++ .github/workflows/test-ci.yml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/.github/workflows/publish-ci.yml b/.github/workflows/publish-ci.yml index b0a3c60..9258b78 100644 --- a/.github/workflows/publish-ci.yml +++ b/.github/workflows/publish-ci.yml @@ -4,6 +4,8 @@ on: push: paths: - 'BadMC_Launcher/**' + branches-ignore: + - Backup workflow_call: secrets: diff --git a/.github/workflows/test-ci.yml b/.github/workflows/test-ci.yml index 7181056..3899471 100644 --- a/.github/workflows/test-ci.yml +++ b/.github/workflows/test-ci.yml @@ -5,6 +5,8 @@ on: paths: - 'BadMC_Launcher/**' - 'BadMC_Launcher.Tests/**' + branches-ignore: + - Backup pull_request: types: [opened, synchronize, reopened] From 76026a098ca62f738a2fcdc7de3ebee5040e70ef Mon Sep 17 00:00:00 2001 From: Starcloudsea <84891987+Starcloudsea@users.noreply.github.com> Date: Wed, 19 Mar 2025 23:36:00 +0800 Subject: [PATCH 03/40] TEST --- BadMC_Launcher/BadMC_Launcher.csproj | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/BadMC_Launcher/BadMC_Launcher.csproj b/BadMC_Launcher/BadMC_Launcher.csproj index 4726849..58d3fb5 100644 --- a/BadMC_Launcher/BadMC_Launcher.csproj +++ b/BadMC_Launcher/BadMC_Launcher.csproj @@ -29,20 +29,20 @@ BadMC_Launcher powered by Uno Platform. Lottie; From 96e983d6733bc9b4050fcb96ade7ff64a117a2c3 Mon Sep 17 00:00:00 2001 From: Starcloudsea <84891987+Starcloudsea@users.noreply.github.com> Date: Thu, 20 Mar 2025 10:16:10 +0800 Subject: [PATCH 04/40] Debug Image --- .../Assets/Icons/MinecraftIcons/creeper.png | Bin 0 -> 4548 bytes .../Assets/Icons/MinecraftIcons/drowned.png | Bin 0 -> 16128 bytes .../Assets/Icons/MinecraftIcons/fabric.png | Bin 0 -> 14999 bytes .../Assets/Icons/MinecraftIcons/forge.png | Bin 0 -> 14350 bytes .../Assets/Icons/MinecraftIcons/neoforge.png | Bin 0 -> 15156 bytes .../Assets/Icons/MinecraftIcons/optifine.png | Bin 0 -> 14887 bytes .../Assets/Icons/MinecraftIcons/quilt.png | Bin 0 -> 39060 bytes .../Assets/Icons/MinecraftIcons/unknown.png | Bin 0 -> 15938 bytes 8 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 BadMC_Launcher/Assets/Icons/MinecraftIcons/creeper.png create mode 100644 BadMC_Launcher/Assets/Icons/MinecraftIcons/drowned.png create mode 100644 BadMC_Launcher/Assets/Icons/MinecraftIcons/fabric.png create mode 100644 BadMC_Launcher/Assets/Icons/MinecraftIcons/forge.png create mode 100644 BadMC_Launcher/Assets/Icons/MinecraftIcons/neoforge.png create mode 100644 BadMC_Launcher/Assets/Icons/MinecraftIcons/optifine.png create mode 100644 BadMC_Launcher/Assets/Icons/MinecraftIcons/quilt.png create mode 100644 BadMC_Launcher/Assets/Icons/MinecraftIcons/unknown.png diff --git a/BadMC_Launcher/Assets/Icons/MinecraftIcons/creeper.png b/BadMC_Launcher/Assets/Icons/MinecraftIcons/creeper.png new file mode 100644 index 0000000000000000000000000000000000000000..94a72e342e7ec5eaf5195df6d01685307634a3d7 GIT binary patch literal 4548 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 literal 0 HcmV?d00001 diff --git a/BadMC_Launcher/Assets/Icons/MinecraftIcons/fabric.png b/BadMC_Launcher/Assets/Icons/MinecraftIcons/fabric.png new file mode 100644 index 0000000000000000000000000000000000000000..93530b47979693c1225c64c12cc56639f12e7668 GIT binary patch literal 14999 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 literal 0 HcmV?d00001 diff --git a/BadMC_Launcher/Assets/Icons/MinecraftIcons/forge.png b/BadMC_Launcher/Assets/Icons/MinecraftIcons/forge.png new file mode 100644 index 0000000000000000000000000000000000000000..48b4eb45423e8767099df1bcbef083c52834153d GIT binary patch literal 14350 zcmeHO`BM}}6z&-oSwM6^#RG*=P_R7E5Kllx4i}V5qeg-ij2JQTLaitgV0*odl#9_M z8Zm&x3K|a%?^0OH3r*zkLWIZ$wJ-{bg0OOJ-Yzgb|3IvY^bcDUP4AmGAK&-h>u+|q zhXyOGECyI0gscMmePo8RmF^|77Slzy{Xvhp)VVRdgl7UjvXcHp#_6uL-O zmcj~6h&W3Wq4&q3+M2=&rCr@L^Kx%(vpVI>gRMbe$!Tw~dCK^U@9N^+8P?3S#qB^^9=PdEKZ!t^K_C@Hc9H}py6{2|@AZkDwF(T%c!tSd`OHd^z`))dZA6G;MQkmXbtwZvb|bmfHxtBWd00vlPD!qnwq ziZeU}xD@3%4QrGE21)4;O;~Tmupzd())y~sq*Rs3xtPN^4_~O)#*Y^{rWyebeV^y| zokSki&SIE1w>LJH5=I~AIR4X&@ZBQmG&6vhGkQLXB8}>-w}9uTtq39%ckRRRuAVU| zq)}-tK&+e3k24o#cVV_b6QT%pRLb|vAzjsXe#Zi|HHMyZ&pJ;3I%h@U_`vpD%0n~} z!pn8T){>`V+AJuvS&A2zNk1qL5pemdz-sbvNfQamh*aO-N^17m6pYSQ?0aBMM0XvE z|8@IgJxTSC_5x|-xn(&L{is1dYR}IcNFUKAKn4j>3l&6~_9J+~{@asNNJrANf}&ds zuIwafddwBDN5hhM(%V$cFlaU(*glA)8FLh)_0`2qV@L*#@cggQy_Y+A09ZQ@io=8S zw_lJ9UOMv>sICW;wk#!2Z{Pe4Fi%xt0ph7URq^t&`TU`^%_SvsW`zHQR6`ggGko&M z@S$RFDH_cS4?~LDNCW5%JUnu;FW`W{;r1{z3qHppkaYvW>8HpN0`nXj<*k{tb` z;h;as=bk&!52u3@$&_r}E>SK>lY zTu`2*9+^N!K|$Lcy3&>->m(`E&J=LmqSuaMGh^5&urb_bUnJupQmLU)Iqqns%il=g=cY3M zR_i82NbCt+uIgy@9#OW!MT`!6c{_-`Qb<(@xIX!Z14MioV1K+-JToDaT|G$emz?ZR zNZ_{+xJ@1}#ziW7hPl0F?popwrhYEqyAEkRi9=H4$Ww6IG3+|vwA{&=W8kr7m8v2y zcc)i%06U?NuI+JE(7MIpz}^Y2X)C3ZW@|n<&Y%h6` z$3R$sp>MVOZlVVHNN6;EW7Nbv;FCa$Ram zF}l<{-0Yo6RmOso)|I#3KbVwUnGM5ypRsQ+*~Hs$bPG#yF;*{12IKfdMPeA+C>baj s#M1;N10@3`1D&Plp!9(ZN-DjH{b}z#tMCRHe8CR|_yzkO_g=8!Usx9%K>z>% literal 0 HcmV?d00001 diff --git a/BadMC_Launcher/Assets/Icons/MinecraftIcons/neoforge.png b/BadMC_Launcher/Assets/Icons/MinecraftIcons/neoforge.png new file mode 100644 index 0000000000000000000000000000000000000000..295aef4681a5c775836da530acec301c82ad9af4 GIT binary patch literal 15156 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 Iv%){_Fa2|y0{{R3 literal 0 HcmV?d00001 diff --git a/BadMC_Launcher/Assets/Icons/MinecraftIcons/optifine.png b/BadMC_Launcher/Assets/Icons/MinecraftIcons/optifine.png new file mode 100644 index 0000000000000000000000000000000000000000..fc5d62eacb9d7b26284122898e52a72ebf089297 GIT binary patch literal 14887 zcmeHOYgiLk8qN#}1OyBLK}4DX5ur*|q};S*K*V4Hv#3zDu3EH+#Tp6ipp0;p3b+XWn_= z^WA24i^CS0nM^Wau~=roqQGz#%Ye}Ra1Ft7Ut+icei=(d%i~$Bx2EWRu%s`ATUjiE z6&&clGzsf!xR}5G)-prYM+pX*>(`w${*LRg(i-D$_K;QCJqr|>%RdZoB#yMX?{+wD zqzr7MD$l0=(pwx<60v3YkL3MZ1&@~$b`E~Mx#s-fspgT+$Qm#06p~_LcopaPVr|pg zne|V&Jg!Awf!t?bu+Glr@(7Y54KPlw|E~QnhQ2Tn3rH+D_=oJ#|LX=$;<^xK0SWAv zQ^4ekn}`;Lw>r_Y?vNxF!#g=ecgfLfi!8)s_(At+V+*llhA?Rd&t8Vs-b3LB4<7O{ zre}HZ#N?#3b}m{woNXmPlzSWPSRteEpNYVQ^g@K(Q97Bu&~LrBbL2JbhT_Pq8P3MwJ2t^u)eva^Dk zY`rTESrV+pr0x3ZFTjH1Y}tOj6C-+VIpE=G_W?h zEy@>J&H*DM;(SdJBMX4F1wFIvktG5+`n9+HPQ=j$;AlgC)_&STP6r7u%Qi=XRmEbQ zmQnq`yprNDNchdLbR<|w5lDEe-)SW3JBz@(O*m751na#LBs^D8i$uL)s)D+_r*5o=p@a1j^gDb>XN#7#Y?X6`!wfM8an5lv2XQSJ>V0!!nt*u znM^v^X>&eKd?wpkZ6}X;b0!K#2uUP~eLKB<5UGS40-~s0`gas!k*a*)W#kxbO>_I3KBbV`l%zW zFAPrv$(5v*E!MmEWeRr>{e1xvD!bdng-GOlc0%vsF&Jmv(I58e-AmI1G1+Z0pgTOq zn7j~CPv!%nGHqF{p?LUBq+G+CM6GumWEFNhbFcXztv>&4!aIY_n#NsCC8R{X- ziak|ip~p;MKecfnRg!?>}~Fs_L4{nvNt2 z`kp)+fAiy>T1`(u*RwRgs${L&CM6SIr5y}$|d7GslVfSBzK zp3cY1?h9nuFbx8yy?14ZirL@^vXAY%g)EnW|BVYeNks2za4FSQ*ViFSBj~WpaSMTD z)&{<*?ZYT{Wa$DCY(3!1Ltw;%i(%k-d0M?j@FYpg-l@sy{@~I#F*D6oy0h8CB56R@ z

~^5KmXDD^6N_OSY6_#->#_5y!%TEq7aPhth{PAtsq2IGe#mcUHXuWOyK`iSB&V z>dc$2)(8ieKYHY|Lwan^#`fGyFKtR%P^4$C*XqITkvj)}y{3IyBVAeg{nO`yl%+Gg zLRa6}O#W=?Aw)+j0X0{b8K+R1BeD@QLs&8f7o9_X70Hk!omZQ=CI#PyXPzlf+Lm{u zFACH2MOjFl#WU4OJ&zZbUb6p+Gh~>%qJ9856|O0y7~&*4`XopNB;$Fb#kR2+Xg-PA zTD>v$7fe12ssC4>pVQCIp?PBXxeq(iEf|(;BSd=4c1BOF zSqwTf!~TohQ4K%ooh((0ov322XJSLNDu+ASN0XWsG9qyeIN0dbs!MOKH0LHZT1a_rXas=G)zj==Am^`?5^*bekFY>nPDzDLYTrm^ueVfE%Dy?_vD&Z2FYpIziXn*!2i1PLr14kb>p={ZWqP z4=*H$Ze^hD9fe7usR^cNZDY90fJGmoYWbZ&s66m^Ah{+0IwRy$6Pnf-{t+;p8N@*Fy0Jht+@BnFwe|2^JneD&^Pz5#&hhWc>hs=6 zDK35Qp>&|QyYhtR)1XvJ@bNv@elt4;%!uol%FmhCzpB z*#DF}(7)Lp@pvr|-jCm>URT<$G*f04Hts$lOT6ZmUuqdKO)^#GMMS>o zhgvD50wNmMwS_Kvq>cnd9o|!eqA8vWgmR1Cb6Z3QPm~hgZ~5fQhjUP@#9jpMiyyHU zg=K^UUS4@WuMahVSTa6@VQKeH>dEYVXs|F_Vo>_OatTUo@BUJ_;exIOnt5#G*!l8( z#~PGuKWouoiN;I#Wc^Gz^}Y);g4AgKo@!LdARsj}HvSqO~31 sE=A(&dKGFYYctU364h4|nxUB%9p9vh5Am15m!GWQ1z~~t0c%qK4T^-WB>(^b literal 0 HcmV?d00001 diff --git a/BadMC_Launcher/Assets/Icons/MinecraftIcons/quilt.png b/BadMC_Launcher/Assets/Icons/MinecraftIcons/quilt.png new file mode 100644 index 0000000000000000000000000000000000000000..cc7302ce8248cd3aaf02b4f742600b0568cd1835 GIT binary patch literal 39060 zcmeFZWl&sO7bXlHNRS`_0)ZfnL(rhXA-HSMAi>?;iQqwlySoH;3GVLh?$T&8hurtx zo0*#W{!M*VGw%fJ~7*|OHNp7pE~ASWY=f`o?z0|SF1E+(V^1M>v@_=oTmXqmHq zY7G2Cv=&pdgMpzZef)!U&f;@~fdRva3kfJW!|pFUi^bpa*t+)m;1G}S-1ccK@n=}F z4l0Vbff&?1NM=Qul?G~624)^x3tNYdDUEJ}PLPkT=0|o~C5>h?S{fXxOhx=}pM~jC z2z(}k`3xt%p7^xoE9%R`2R0Tm1gU+``t1BY4R>GWv4soYq1*HvPt6{+`RX?q*l_6l zFtC4rfS6`ceo(TgBLa_VuE1WJS z*t=asTKLZs`C&ex{&5{|esd69*mQ0l!k;%p0Qdj-72RLj8wTSw>r3K)JKzli`<3I* zub`iZ=={1F*(85I$zxZ*-i*)wr>A3s1&NuDD}DXvL4ZrZp>O{A6``GiA12^?eBhra zdc*v}|6`P3e5TB*nZ`rkqN?;!nmCH;51{nsY_*Kq&gmHzA9 z{tE&Aiwf%!5t6W1fitl0$sY+n9C7Y)n z`tgv^pj<2JZZhDTJabkyoWP*H3r(C?sw-~lA`OAci`K!L;)x{Za?>rnx@y`#cB-~y zh>IyXI-zo3FIXK^BUwFOj600O6x?GCj%@@_JbS2W5*4~LeIBI%4?040ZX`H^Rzo~D zDB-e2!AJJpy}#&e-L{%zc&+j*4{e59&Vz;OOj*w|+v13W>~JJ=U%R=rO|eF7=eS45 z)Gp#*vo~r-y_O`(KRPM>$lXzy=ba<4+&^!t7OwGTFMrPfj90NV_EF$8W{JE*_D;j* z7Tfr0xp9ow_H}fw-Pk_)*aL42~Wm#iM6Ds_4c-%cH+KPT`XT zH$M{31y$d@?^(Jru&Lva9jvmz?zM9@6o*zVy|B85SKFrdkO~6=I)N|Y6WLgaGPR6e zD)*%Yg?Ph9oA9plF19u&Q@d_L@eBuz7|J;GxkQc~TD1_VE0bN&<}eR)j5)oGQOSDo zT_&MpWxwIiA5m{%oh~tYG@&*&5(~I{91BS@u%K@HT}3BNo#^V1Xw7vmQQ+dSRio>r zqSuw#H3!9D4Uf9~B&Q@o`-nDQU^cN+4DUEjZbejr3n*jikq0B@Ibzr+!ISTo$zYEf z3ha54Tt-Rn{Q1q`5x_+kS?A&iiBa{+oF5x?k&!{tNU?paLt|~%=5*x^yd0#>iFOg@ zK87{;c7~nLPPcYHWotTOowwULL2+066RmQ%C3-5n3(mUxDF=yr&sqE{&)~vTYxB%m ze7@Cw$l&SMLtr5rJ{Sy7)FPbfWEwk&!j%dAo=!!&1~MEHjUlw;oU61e_RWB8-$~Aj znc2YDz)ewitSdR|-kGptto{tQer za)uPqi+`h8F@K=#zsLPwGA{h|$Vr)@2;eXZpWN0?&Wnq55tWqGNijTz>2OSogjA$t z86SS;v(yt@mZ$yQ`b5{foqe4i)1NFu_Szy5z{3~-Ln5h4jRgxwL5eO;^<{;4hM<9> z{%&ertVZxIH@$$ZN?xDsJk+;73lBv$`vy_FoOGJ};bht?JVJ3a+849QvjXQ`-GrKb zU>RApnDXXO_=oGW%&CKsXtv3&k=^B=lL+JK@#dFH;ZtT-yAV1ibkuEHV{Q?pjC}Jc z4gru^ z@AVRBg>!)=dd|2ox(Qx12%TSt7TA=kOxz(bAUX{Hb-B_HgbWW^=7qe&>6{TNh1cuc z<6##P4qwcRldhERkrz_JXDo@_1Tk1Xw#lmz5_*1YdVBSR;}yPyT%Y>%4>2Pn1G&%D zT0eB=%px9!jk2uAtOCZk{Ln|=I|hn?`#_0blQ%|kju522wD3F25#m9|q`rkJ#`&G2 z|8(;u`q9ha~{~D^8XZA9$=sHA+=&DX=qg63w!wCpS zS^{BU+mT4WfxTPw;Y@FKP9ry(!>dhYr8YM#?(yt+TSzx3*K-6R0UYao1~>3p6OD>X zxOXqo^LVu^UV1dZ{ZVlIT z=Du^J*fZ|K*PcR`Pj7RoiN*6Y(faavPk0a^7UB{?#?L?q72zxUI+a2I-VDUGqkB0EwacO-oJXqWQI* zhBRB$<;z+&;_;_vJR{>Y-&!Q^IiR8wgz>2XJd#b2A`uAp<*Seo=q|+?_CxwVN^GY%# z?wm`+6gVXt#$o$3M8@zsZB~pYZA-8^za!vTwf_{kZIf<;kO}ysh+hI3JqVfdj~eH-u zaOkfzb+YTlqSxt1o_u$n<50_8#?t=)<=$~{lktpA(Zkvv=CQ-U8I0jr+<#>zE%3oo zrs1p@BWF79bLXfK9J*K}j0VUAk8U=QKOY{yHuu8mvW5yvX zwqOBB=urlK81aW!qfg)zNOeAUZFCIv?XKo1j%_Nlj+-BQR_(3X+I3y*-y6R?#p>e` zZR@gf@Y2F|#a)uzs*7m8mW6(b*;{VNB7GG63)@E+`nqOLEK^Z z0F}3raUPdxrG8`J!!GODxEFaE9+J=j_aa&!Ay)8b@o3wMZDTXT65d@}L$;IX(Clh| zEX}usX4={UUg`)2!=l@B99TGA41ivTlV(K#A1CwYj8RTSd#a%E)G28dFVbn44vDdj zzE0lpa>Uly*rr22=X)KL^DNn+Hpy1=#PnKqtH?EXXeK@9YL+UVi54lAtL&qELxrd6 z{FgSf^`;fS4Sr`atMna>ypBcuhYxmz^BIChE>0=ygU!meQ|=-S1~~pT{n9i~WQc(W z&4+>2SHdO~g7HyCj&=K-7}YGJyj~JP+A1@%Q4$HYuD(*RtTDCwR&?KLIJ3)Vv{Afg zH?L+Zy@T|2%Tx%1ZN50-(!sx>Is2M3 z$8r29davmBYZwdHP_^5_iBVWPomu`1mmEzi=I z<&nE-IS>dzii#g5F3cYX?9ERD&)u`PAv=`oHIr+kcL9sSTw)xS$D%p^YaVp1J7r|h z#9qBqMg{f&ZH5)b9X_wkb{4)bm?6YR3GE4iE+~Wi6}QokekEjD_r)YwVDFIvHt;91 zHHPc{x{^N(s0a%o)3oS{5y_!h^h*l8h8aA3We`7IzFMNJYi!z}>|?$K{2j=8u!P`Q zi2O?gfU|(MAE@{Pf42SiIR5{R%m2~!;$s7sXp_7~4VNw7^2t&rgZBfeH~(iiTSQZ2 zX~3BVBYnjXL!TfUJxYUaZF_yEuQXQe3&7L7_t=Z8dM;{!8|=FXxl;0adv9|=v$ft) z@G$QDkgd*MVkH9}uU+4p=YGrFmW}ip$**6^DnHmsCB#1D_CrALlhJW|cEypAnH^UW zEv@zqyB??S*RZf~>Ok_%1eXq;)Vt*h6t2Wd`&{UmLCiy7gQA-R>bE(2y^>KO7#kMG zb4l{i?@Y*j*k1K_ME72Ak~6HL48N4LlIQF(Tw-^3d_&f+^c*nP5Q$@5QE#7C(==G%WRc!f6R_OkU?*{94y&h1WR3Q$5Stk zo^^0RBy4b!6dyFDz@G$w-KtIobnpdj2jHi#Ku-X4EZ3+q`Qbqg6)vI6>x6|zW3rLR z@X2^*SzeVIA@zeo^d@$nCP8&y5dnKQZS|1I$d6BIEnh=XCZtaz({9%TddC!k-1}Hn zsp!W&n7dHNn`wVgw7wqlFT4gq;|1{b9xvshTFlNO`g?yAjb45jpD_So0Pn1FM}99lZAJI&Lnu4ZD2usab*Ngr;lf!eO;>aFRoPQeY<(;^?D-eeu^ z)j6|DA5ZB!6~br$X)4s*JCS>BP|D&*8&qN-2?CFJeujb$I4z%d@V@D!r_;wNeK)&2 zuG_9vzqyTnAghV0 zZl`CSw4%SD)J0Pv3?aTD5*N_sXlqEq!8FeekhdM91q}HnY^p0<8CmI^HbaTBSANQa zk=;;No}L9hAp;+2$pl;S4OVj(En_B*kaOnU*GfB2T}w~Nd}Oqvh}pHJmxvh7s8W)y zQfUBqhylO@y~!>xvojyvK9-RE__?-A`3iFH`XO`6URF$+;i8v`2eer>Q2(Xz)P2L? zKJTO;Nm_PKL$yHbdSEJYYzBGsy&eG1GXU!yjLN+r0=D#t*OE8&YgXnv+Zr2>JQ#R- zG*?;VinvNj$=5&h7U@bJJa?CLQ_0h*uBb3^>UdKZE!^%i`mnjVPnG*YycpbTh1fif*Tc+II_|&Tob8YTb29 zw9XE=m{f6K+#|gU0Zbc-nJd&qF131(MKN_3-DLU>e^cl@8Yxt}h6Beax2Jv~R9mnv zg~z7aVQ@|YLN)3N7eNl(eA0Os4{lbuC9=VP(IIZb9(L&D+;VUJ{J=i$im(T{x&u!! z;Wb8xcpD}VHpaqeJo#Sx6C3cf@~M4Eq{2J#tLih(*HTWt_FMpLHpWS8=pVc8v90sY zAi{gcymhwHy2HZ#83rT`dEGmp?SNq123;6PR_d0CzHC-;?`^)!mhzP;gHi0*{pIB zRUGERgejrdqObl@Jatd}Re)K)HpnV`es@lR(Uk@0&?sOF#pnD-w16d0O6BA;zj%FQ zkX`?7gU6)d+ECA_iCwm7{@!Kb_R}T8Pcnhjv7ImmdoN|nof-i_G2aL7-87Y2WXrH$ z1YY3uE$`At#=Q!@<}lSlz88p85a9<0yi}2rlFG90V#*k%$pkXlxyIbyR^00HstxVE zj2Y}N3S)45K)w$1TpdhP>A`cbd+S|taaVQD!Mp)I&0uh+eHcauPhu3+#(aTuIl@{HAaKC1tc;675oZrmuJ532Zni)Tc-O zL?04RNt%?hu%jl@uTexAx%}*Fva?rk zHGFGOTV@}}&3Py3QduScl*Rw*MmzI?6%TI!1&Gkfp2nwM7bmoY(TqR&A|&1Kpct~a z)kf_QP=D^;<8iDPq2cn~KL>K~znb)Rkmew5ZNrsIBht90?YrqWer*S?qQ|hBKYyaU z!8CWgF6r%@eS-Jim(sEYu7q*RaDK$5yx-bwFU3dp_*6c{@j`LKlBdGR$2U}X(S2tu zGD&Te*jjBxx3XBeL zG5a19(-$8%nWciSb&~Fv1K(2*l&0~5o4r};SPxjlqr|Iaj83@ zl2svc^GUb4RkVBI8C%@JWo7o-k9cRF#6x(ERl0mH*12iD6&p1THA=3mYZ%>2&l;nT zBmh%CVP39E1c+t)HNkC0GaZ)F-vGP#g+J9#hqdn6#`xwpd8!XQw88MOuR(_N-%t)0 zxEehdBwyX+@b!}dkvBgQ&@1X!Wbpv@{agLQUk~ibSp%{iAh!P}(L)W$aWZwnj7k1z zI{>VlNlbVq(Z7cwWby;S>1ToTfIr$Qf&hX*QzXLkpQ`~37eI-MAw3PCAbAwu{Pn{y zJ!sy)^zp!U62?~q(NLY7=OTWY*wGyh+&jZu8bj7Ny;4p;7l}C*;&_MWAOvU-Ne<38 z0_#Cr>j14!&2z|ofNO>GQ;O-0Kq?A+y52J~?gou?A5xNuGXL5qZYn7?*7 zg%ISx8;Hrnr5MXNgTk2GvzMIbsAt(;lI=TjQHRhGS2%TW3$`$_9Cg_}T))V*MkVEX z(kycswjzh7Y7zCSfih0JH=eTi?GR?)!0Q|mGDuwYA{ID+)4*LW%V`&zhI}7Il@1Q z)&wv17LZq;;@R9_v&mx?kPK@*Ze2WC*D;V!5|q;=`ws22>OtQl<8J&701V2CF5lmq zDPDZK);X~Q(n@*b`)?V2*1q*Z^z9B#ZWcooZ=Jx-8egWy%0?QspG;oZx|{?7X`Qq2 zm=i8wzK(f)mcJWi-fXk)z1~{g)AE7P)lKn30^wd?>|NxLIUmUPXg|RBXgYS?YDJA} zr&C4f957_wOjnc5Uu*^p+t}*0<&U?;AnE|wq~&=Ua<4X=j+_XqjcWbmQApGlbq)+2*EZdyoVpVGv?r= zXHae`Sy`L#RWIxF5=N7}b;}cWWuiuYoH-g;J5-^AJR*sjts-Bk{($+3u4bB*COVX& zrQN7sjYs2X_4z4MOZ*0%S(oc*vWdY3=BePW1VycOH%y$aDt z_2Ab=CsQ}6dMN}GLqxVah0k=DM3=Kt1cgETqX0}6CnBE3srRnE8AE+Az(u$)rIV%= zP%0oQW_d+unT~Z^5Z{QcVK%gz^)d@ou4}#V>M7ECwNr_gwd1Z^pE_7D?p|T zXD4T3*9SWLH)%`bW$?GT96jy)W*j9@u!iGIo9iLTZUg5_C5Z-w3 z?;APHqZoI58irI{4{>pWv8u>$2I_my?->!&%RTT4hQpRQg$Rf z?9;LJl}){ocn{;VgKnLjF^V-Ap!j%%20-Aewr5iPA&)_Sr41y@n$U*+Fzepl!T`N1 zEEV{t-V`8u5x{G=$FzSN|3^2V`u}mkPVh2<%98*e4#5wMDNHQW_Aeh*rvDjJ^?KHs zNgnFifp1V2ic}}95x3#FT4k?X@|i|`8$A!*qDyo}yPo-PUA-7P8zlpcWUA<;;KhNvGqVgU_cwk`KyfM*>*!-qxmD<)%X5&F z20Qjf=hFTB8P~;w<6);en49X^XTh;q$~RVMz;;@bb8eq?5A09+6}nIUwW8}h_EJk| z;!^FU3rOyY5)qxRnH?zs*> zPeD=_955DeZTV4H)IhS4Yc2}T6|aHN1)!Q&D-veutAl5&g}27I;@DEpPLR;~S1+=w zs)dpv>TI6GV{G0*~GsTTLW~@iaBU=$d+!Hi$Uhx=}2lYX!7Wfo?zFpNd@v z$S0c|6Z1SHn{WPbH$`Yx3ZpEz%me!{Axg$A7V9DVHAS5czy_6!8?sc(dv7nTl!(Ho z3eaS()U~`@j2}6C0%+f;7E-(>@vFL~)rhm+e9rnO%1V{oy|n5s4ta+YV` zrEDC`Do%zh4MpoXx|xBxEWH}JdGBIe-S0K%d}_R|URP4qN+D7D2ie!83qO8oWrstWo%89QRTD>B8Twe_s)g4A;E$Z%AbF~)@4b*HI z_0@^DD#P_Re--Qfq~-|kwtkrAw!X5`rQu2_UvuV==l&2%?saA*et5Unv9tg3pQ!=0ZT`F8ca`bGx)n1zWTy}pe5&{bi zFki}H7ez?;$dDdEK`#=kO~S}CB=$aYh!i!)0-g|(@*ZwUDQx4Z{J>~H`ewdVSKB=R zvh$}5@`F_@%!ddNoy3fH6oNKQ6*u!0{qT9Pd9tB#%kohItP5IvTWxUY8Y+!=R_Id0 zOkKxTxfT&-K`K4M-##$)CFPx!Q-ug3;11E#3<=lS7|}1x6J73cy9h#dd9%_Sv}qU6 zF7(fPLm#Y8hCGyPaptKG=Qmb=)Uo)tLyQ(H1l%S4_;1ia3+;!WQ;6B$JZs`^$vbi@{nhp{mExNvKsw+yB7vn;F2k2~e_KgItiy@2*4*5wuPX;0h#k(EZO5RfPQI4slzM3XJ28mDY?hN-yWM~iCv(|; z_nFH{LsaY~K&E`)sW7OEiQ_Cz3Yo$DHBvangDsxBG{2=sg*ORfYd@Q?2Ef7XWOT|L zxA(g0yD?9BU0Vi4>h=Q07AP+~RhQ0&5&RXK*KJs=RT(~*t>in``Sm8fg|sK<$KK%V zB!?P{ZBal%P4q#fAqId|HINH@Bz^uC2>`h1YTDBLb@C(G^>-s|AE1)&OU3g02WSJf zRu8BO=&V}7{r4z1^iqJG`T1PJ<`3u&W~>6z1OKmGkl%7Y$N8zx4$ih?eP-&z20lYo zC!9R^e&sFVd9xvo%Ez}J+xDDf;|~#~|L0$t_zmb@8Ic*u1_h(z|8cO z-7#w`{N@fJv&HW6iMl!dF*r6?v_?u9g*>lznom+GpNY^etzt8zFn!f5{h1)z3BD7Nawe_t<$Tx^BC8cGtY*&}LZ^u}3 zcd(@DBriTua{+e{|8oFiyb8QKvN zt}=#q!`-__8aaIjKe#w8qiF(T0!zFSbKGp&!!4jP*PF{|`e1zXIu1aFb8WuWweg%F zrv?;_Nc3bR)%>KoXRmUgtm($p+~GB&(I)qaav`?U&h_e`I+?=$@OK1|*jQv93X*@n zuZe?dI;k7^^iTQE)l(Ao71xmPp0OH*?IzVzO&rPMHCment)v9JFg-PV#Qb^#>!B&u zF9%k2BAC3KTOImzz~dH~ziG=j zU1%i=y_+3}d|uyZxKlfA{k5Cj`?JyFdvdMJr zro18kDj!Lb?7TE3n5{5MN>wAvlDyW|lw4*NJzWZ(A3RhY-g6w}QS&X=)E(8|Vo;xd zvQQm-stmcCwL3Q>eM9?$}A1i|3@OEP_iM z)H+etB0WsE>xgR#H#f+rQ%$}^5Q_@s#^t- zD4M%mDR_)abZhWP{BV>@ebk~P)$f${#sh_D%ItdV6|edz7m`JuH=(lOrZgnIWGDF* z4^}X|&np0tzSUKn*angF1aHl*zO=R5apf^c;7iS*IoWmw87_WQsF6F|Z;;*!Tc~Cg z9XiWBy55fG(86>^^?3`Qm`-SEH>c8`RPWwD#d7{Nc}YJ00+D*)%383X90NpA5p6h6 zmc@(G{Z^|K#szL4n$?Nv^AygorqMP1l1>*j?~_2PJS--6@d((hIN46m!Un&`>sW7f zQ2SGn7*cPxHzERLY29=CT3IQrRgO<%m$zkND95IQWV(;2FD))gO zIc3$*{RO?_u>F`Ef@v6+5(-4qF!(!#S9`>f&p8)#2WiTFzH<#ld&~Y>U!di)_nOP< zd4H8$1c$Bmlkbb`Kj2|CKr+RmTQB|I&z)u_{wIzwe-8R~(@6qL_Haw ziKhaE9Wy2-Wwgw$D4mO>-&q{b8`qNO*l^~E@6ykDCf#z1MC4`W031B)XskH?R%7bB ztbB}#DGfZWW=?aIbmsm((sW{SgOi~XVP)nP8>NvXo>-a%832_sS~F?>@RMW!Z?i`&MIxu~LthJM0(LNALJ zN#LJkx@8`}Jl~3X6rU_wqN$}yJ;!-3TpW3=FrCGb5^~DHKt#Enk(5K_n3ff2(iTOf z{3F+=%?c!E0Ou%>FK-%(H|@PgwwUCp%qs5~U?`P~ZX{{=rP~uVSfQYkW>)Eo3-SjP zn&MeN#we;yBtwH*2bHES^%$0;yyyEl{X&PQ;*L7cbkE?5Ox2C~WiOzoP;#9=%nsbQ zGwR*=Cb{cp&-wwK2FR|uA#4-pd`m8fUlemXE6-wF7|ld9fh*)BudGjkuz0KAeOrVK-gY>-7wR>fMyMyoWRnF0br6 z<)P*u5qdjcrTSbwTo*fYfNeC#YT43<3I(z_{G;M?AA*^>86aLP;=|lXczv8 z5DXAjxRJh;W%N3z@;3vALp_w7N4eTPrs-haWOkKUb+J(=Cf0yo+(!^4K#TTPt)*6g%`qhElPQ&Q4f)LS7GS=ZoVoe{0k4r zI1kb0anWMdgG_^N*^-8B*2~fQeXo&Atzwn3-aUWWaXt^f3C#0>1 z3HCCcwFx25?4qsDjO*u%qdk!u1)jLO#WX*CFK4-4dEw99F>)mLZY19TLem1R-Loa}4sT;Z*rMW+eBcPO^5m>L`Q&tOEc- zbn&(JDCSV4!$yGF$8<@on=$}F}TtIjzeg5oJL&z9b| zgI#JgA0;4AQQ&cB;gx~4)4j=I^`D=yseitc3@XQIw>gj1;?Zv3ClEW+Jw!Pj3DH<@ zbDb#u(n`$niZI$#sR&|G%r3fFSB^+%LZ~wv(!zoiTfiGvLPaZy^?V!ZBM0%?CIrb^ z?dPyVByRyss`RBZYqnb8U@h!&XrBPG>&6w~NM2H*F$TQ^Tx-RU>S$yvTz|mSf$OP* z-{HYqzXZCdO{?}-W7cvg0LLlR@)5RoHfa=d+Q@F}GIODk$480<(WefEGL8AgKjGLT zZT0_ODRXxPe-o7}L_rcxJ!DZj5gv#W#WG;nNu<_tM+_gMK_FlIi~rXbE;3Facd}b5 z_KNMJ70WckNK3fy6rW26Rbe1sg?#UQsQ=>U+x496%ks5=y$gR8Raz~Z@M1F>uyhe_ z10F0~8IXnUnRFi0_9hcqw%mQ;Zz1p)lsGQ%%ih!y26b~F`! z^lA9BtkGr>$sjxi`6vEs4rVZFRJ9>d3h~#U06d(w!8+U1neZzf@GS&@8+GiAPyS6a zO1%ejR|uM--8Ww0@d8;Nil3eK4MJ^Fsw3O-CQY^vxo}aM3Ovwsr4U|o!e~va>3{P*;&rKl{yNHi87C?nfKn|El@k?rNJbr?7D@ABV8OU7FhU% z08{)F0MjVHe*QH$ZU{n~hnslsRYh?8N$g5qfV#IixdUN9-+@FUp1dBx@9tH-u;y-j z?VMI_aidpF8nQ^;C>o@1*IG=IMI2@UyC`4A13f4F-9K#%qeUcq5lm~_)tA_zm(N2V z!4wKGjd`yu%uTQPu}` zhoi1H8o~;wzzN62FhphzlC5aJZ=i;4&1odIGFh@s2@Sa#dQeJV@sYBvxt_t}Z6YJE zdeJ%lI0fJ^4A>l}5Uj(i_!_&IfQMf^82hfI%n$^d2KpW+O|qnN zFKLPL!{HZp3QVTIl_?Z|%Mu=!doA8mwr+_7BgH_GZ2 zS=KiI^@IbUtsfsy1#%d`dU^sn{9NAdF1!I7@H8ZG8WV%nQ}oz)J6Fl;hKPK+s>y_B z>L4OS&1v_OLi6NDs!^~Wke>O}X(K6J9RvvVVSIXkDWk|}H~T%VOf))&n7U2zn(3{c z;ptgi#aymCIt#bqG)e#F!o3T0I%H(N{T|ggtm6WbPndqzjcC%4cA?f=!WEpyUeN(d zz9JawKz|BXQ6e<8&&+q#`c8CqghF7$LN8$fz`cw1s z_hA5f;|Fx%Prr!a{M&>s24us@=tzaR{;1+Hegf>P*Uw2b|1IqKZwG&m+5bZ$C|1p1 z3|^hRDc|#dr&Y&e%mYHuR|dz-B#+trwah5c{oj1Suv`MKKrJw$o(ZS(PYr*65Q#qZ z7V>jsFWWTP0~kW3P`;c{GmZ3FlOfp~Sd_ORQ*^bf3O!E6`451$--Q^k8N;c70TFno z{F^y8*7IRR_gWBCa68PwIP}nH|LQk9_5D7#R_0dv>$gbLkY9mHAv{II>np}trk4$w~uB@vL6mlpeUY zF~EI55HFCHR)7&K;7|fkb>Y1uU0H4;L=wgJ+210lA75MZ4v3>|>kvbK3qthe`5~5H zpH+!(9P))PUr?4)rMkKJX1T8uBi?)NXkK>Vy;s&B^#Pm_P)lf@gfca&tiTC8A7B{i zu>C`bfUw|!wR~kwe{uH&M_*^^f%22}{<_~aAoM~n1+*(ae~AHcDsXfjw*UJRc5dQU zU+wI=*KDt~Ic_8uUY~jokWeE7$NupKoj4r-kV70G&lTY@DB7QawKGxai?&Gj=|HZZ zRgnNtbprJanG2$^(BJWWFax@;YgU01*?gJh-IT%MjM(SEeNhwzMB z3dn4K)5J{zefdKM_AbQ}Ulu!|#vIVR#eddc8o!==9DA_e0BQqlgGy!ZRQ_ z9toH}DO9ec-(q!Vm6ib@`v5sCxw9_wrm?il=1p~yGJ4D)&;s=|v;qpxAIFrR6F%|1 z_`C~^P=h-s*YGc8E*Y(c)l=+A{t>_n0U2H~Y|$j%ziHJ-`CuQ!(SLqZWL;WQVFWLQ{#5IL*j{%EViHQK|5i7e1Hm= zqY7zEg~x~S2AGOd;T}y_Kj%JrDGwEM2k?|li2dMgdeJJ?BZzVa(zvJe@O*!*9kmus z>*#f>dkY(TE3rwOl2ZOU91m%TXJI!d{JkiQ4>rQOx*Ub@UwP^<37`4=*XPkV;p2x7 zW{8eW$-TTRbH?Rc8Ez{oSuAJShC#X>z}V|30e&r)mixC_3IIbqL}X4YejQ2WO25fo z6{7H5zSr#3ER=~chMuaNo9-f~Nn1v?S34{qgmzNk%|u;s>c7pJ0@*S>w+50EG;N)s zS@JX89@#u3MCi*sNz;-u!(AX87h5t_&WXaV*(5`#hI+A|SW+IBxhYD_<~#Vtp|0SY zEJx&pf<4MaE-k0Fjh~OAEJj?QYx+N&fj9&hs!g~=-I#X(DQ!kSv^PbD1mv7n)V?qN zVBoCMe#3XQMDDz`kxfTXEhynpEjiWTHKDKO`bD4%6Vtfg>359-Dlnn=z2iQ=F@_dw zqpUxcJ!#_%;Wi=q3GMxi!^gM8UmITzpdtYk6fO1$)-MZp zz|Hj$(EgrVplu&Gb-E`H{ht$Id>+kD8Q0}G{vU1A0Ff8Qed(x33>qUr52!_q6C=;x zRS~w8k>SK|#BS!@WbumecAXi!Zw}{8o)2-{nd|W|?MvBX?|GeNBs1nz`YLNUmI!Yr zK|3m!Df403UKyL~q6u&FsjJ0sb1X+5DsZ#dzw4t-;Y`CBMB6gTs%`=sK6*%BK6|zY z+djti3{uN%U;xFhEpv{ey~LIfIHF3dLb;TCkBjikK(thHQiZ*zSf}K&UXfP7iq-gCH)e^vz=P zhiW9(x;Jc-ZO1}ORfUnufC!7bMw1Vg5mv~meTqYH{@Tdj30k>I&+{Mz9_dp1J>C&O zl3x7sYPik>o6+q_h~JY_r45(sljWgx0h{yL6r29bQrc1T5@T$hQ#j z(iNLL9=qzVZfrr@Pj7Fr8-uF3%)-~{>jiCN7Ksn%4Ja@18jge!?}Wd6P@<8%nha9V zJR?9{bQSm#?d2+1d33stMpnHm(zA30e}Y}Y{h~s~i~KJyK_&!HuVFr^xII|gQ;md6 z1b090%(tO8pH$W=Pj#Hdns|;w%YNSY-f0b4^}1Y_ce%NcBr~t9rLeraH{Ld~rRC-| zOpu~-0kq}~3YrW6zw={$#wFp9fcR@LBK8>O%He=Q<3n@c!>pd(l=1uCRssc&Wh*l0 zH8pDYbFmfnStUt5v7VA>e$Vho^}iYv^bJTW`2mm zJ+|e1z=tUKHLr~2RqJu--9k(C2GKJwrrqR-NbSC%qL&B|tEk>kXvs-i7qv7(Rg=0l z<@9+lVY?=alYArztS96?C1%YN;Sfo%Gw_s45=!fE=6Td2gZdyVV{OIjLZMx-jMu-z|S zG$Y5;ZX2DZlJ@#mJT+haBJN>ZR1dZup$-@s*xj_jOdg35-W*4IPNkxUxSpkXFee`! zinujL)+RA)%rBhA+a}~#=H>Q6c30FlODi&uHcWEus8xG_w`iP9u@l04vDoYIf^L!2 z#bt5KT1h4o>wqYDI!{8lS@V*S@IS z@}fwO$*?edOH9FCQ65L4US?T(=77k?vtU01r9qQ))|VaIko#@Mygh*Iy@#TNR4xC9 zC*2~AZ%F~+LmWs4{W)V2?FZ&8UG=4OTY|YL0%PX2nH5`ok6d((ptraJ+ zqn@RRIXWH=c`|nV;?Ol?$Cm21QEh1g>V%u9$+JJEl6;uS zYi;dhLPzPH)babCUKsVMc;Da<@=0%|LdD zAlewMI&%Be&@AK{5*Q_10)0ttjTRc!Bo7p^fWvHoRnz+{Y;z9h*a6KS5tS_(jMR=F z7?s(vzw)zkD!p(k>^WJXmw1__utxftpGY&2$df2x(F^V%#iQ4w{2Y_YZ_`>uYM4-% zATNHFQg)~>QT=|K;Iby*&g!x5yju``FmWg=?E)0+iiL8g;v{-)(|I@_#Qjh6{7V6~FoI;(o`{ z|HswPiS#;KwzD}geWY<%)=V>IoIKLN$}{<#GYf&cX@lM@FfF=$O+h#QsPiu0pJ=8Q zBC)P=p6&Hl$_gR&H61G2G?lp3Qo6ynHs#)Qbhu#tSI>7F%FY%8s6dziSfjvLy^cn1 z*szKkp7#b)niTN;bl7O{ep!XY?VT7Xgi*%J{*Q0J*aKZ~mG3=W{CV$4W-s{m9BuDA znIPAOyhIheJ>j=X!Tuccq0g#rvM>Qr3B4ki&P}Hg&qduM*yB+`rKNSi_+b{UgLy?P zg9RBGw}1wWRm};RD5sG-%G}3#$S~mPZ4nDopy_H%wFv@;aTYgHPZhu19D{&C0?F|w zohqaE?v0e*?MBkldIlK6s{(fy_wx$jv zeuSGJQTRP<%DVKePG$}4{fd08*Ofd6)+~>H@6ve%+}>2Cs&6)>09f^*2F{Axtde>Y zy>O)sP=*;fA5|bF{QUK678aK`^Q@aM{%7*o!p`IS3UYWIrr^)J6=#&(6q{JD1UZWR zhD*VWAADMk#SRH?gv~B9cf_|RZky>_H@9+TX|+Q6HNn$WTKQ=1jpS~l`CZA;tsYCu zU+p*51wrA-&b&2{BL`VLQDPRjZV43Rbv&)emoG}GbY$>6t*_qZ?br;Y9NkpV4$)Pr zatc?LwWtCpxiwmG^kbN_Hs`DRt9L0qqkhb{Y) zp}W+vbJ}Scw~}W=)3c(<)jm;Qx1|VxNL6xQzyy3B#mQiUP+~~3I2ZZpw~rpht(BrHCmewHRj_Fq%ir2qLicY72{a(t##Qp09|L0YOC&x#(Jq&a8KcI*;sx6^ z%wTMb|18qN?+Op}RB%!qI%C{=9(PnlU(2;qRbTur%hJYmE0D{sNen`3!+oYE^V}+{ zn6fq60poB^VJR%uKB3DwZLC_Zp_~Czv`_jMMqDIx$x}SNtv=o=WbmcaNbM@!wRiN( zw&_@Pkame}R*dE0k_H;V$gzzZWs zAciuUnA}3amK(lqNmoVilc*4YqY@$eP5J%@Ap;>W&NA6~G^Qf(X4ik(5Q6`=2Li!m zVk`ik|Ha`t0H|UjX?=Xv#6OM3wLomU(XRBDt^5xdCk0l@3&h`i_TRVR?*jlk9c4D4 zI{WwJR{#?oEOt!rFE|IPG3kLsI>%cew*42`w*c?6(HHvsm@xaNarn{6^abSo)04-` ziU3p{DTezWu>(M70vxcqj1+MDe@|uv0)5=@<;S9he;O-30<@g1?wfzR2Sn8`0Egob zxAX@q$Dg_Zs*RrFheu$cTV~PxHID3`-PBuSCM8PLX%;pBl@?txukzx~>EQ;1l@<`5 z!%JEH_)F-F<%5tGcPP;POj!V$HoY~w#pYTK+*;3?iz8*87gn%$-EEeX@|r4OBICM` z$-+Qku}HEDWSZj9xS7wIy^G~!6e#e^AT4Xtru0z)6#nh9IEnOX>qQYVM#|>*$e9$C z#$qA9^&8F=+IPA64t|*Ilan-wi8Wd=&fhv#*9`;K9Q@*X%I4&DYxMb$L<#kM_RuugaiX8xRms zWCK#tEs}yrcT0&NNTYN}cWy#LiOohjm6GmmQM$WB8l)SEGYFpNJ%7Xd_|f0yzUQ7b zbFFJ#Yt0&2+njh7^Cu`Vm~~=Js+b=)7Khh+4HOG?#AIBaNIcuoP@6g@Vd$w;y$(_9 z_uXymJTN~GPCaRLx{STATAzNJdW!IBwfdz|?g_5V)H}P7;>x3b=BtSNkj5B~flch&BY8kJ7J!p2njQ|3n~w)b$dvlE#6U)zt_7^I{{kO&P} z@*fyoZ_@7~C_h2hJ-$EoN4)Mb*7B1kf8;Of>3yY=@(QYfkhzz#!ER68NS2+AM;buG zgwL7&SE?hUo?j>pDh=h^Bco)GzZaODoCK~~hD8l?*fe$D4GZV}+7_Hxw

0{-maS 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 literal 0 HcmV?d00001 diff --git a/BadMC_Launcher/Assets/Icons/MinecraftIcons/unknown.png b/BadMC_Launcher/Assets/Icons/MinecraftIcons/unknown.png new file mode 100644 index 0000000000000000000000000000000000000000..12f3e698be74ada6d72ecb67cd281905cbd7572b GIT binary patch literal 15938 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 P3dh;*w%^6w!8rGK>9guX literal 0 HcmV?d00001 From 5f8d2bad73b44d4c7385b7e3cdc32b291c7e84b2 Mon Sep 17 00:00:00 2001 From: Starcloudsea <84891987+Starcloudsea@users.noreply.github.com> Date: Thu, 20 Mar 2025 10:21:00 +0800 Subject: [PATCH 05/40] ??? --- .../Assets/Icons/MinecraftIcons/Creeper.png | Bin 4548 -> 0 bytes .../Assets/Icons/MinecraftIcons/Drowned.png | Bin 16128 -> 0 bytes .../Assets/Icons/MinecraftIcons/Fabric.png | Bin 14999 -> 0 bytes .../Assets/Icons/MinecraftIcons/Forge.png | Bin 14350 -> 0 bytes .../Assets/Icons/MinecraftIcons/NeoForge.png | Bin 15156 -> 0 bytes .../Assets/Icons/MinecraftIcons/OptiFine.png | Bin 14887 -> 0 bytes .../Assets/Icons/MinecraftIcons/Quilt.png | Bin 39060 -> 0 bytes .../Assets/Icons/MinecraftIcons/Unknown.png | Bin 15938 -> 0 bytes .../{LiteLoader.png => liteloader.png} | Bin BadMC_Launcher/BadMC_Launcher.csproj.user | 98 ------------------ 10 files changed, 98 deletions(-) delete mode 100644 BadMC_Launcher/Assets/Icons/MinecraftIcons/Creeper.png delete mode 100644 BadMC_Launcher/Assets/Icons/MinecraftIcons/Drowned.png delete mode 100644 BadMC_Launcher/Assets/Icons/MinecraftIcons/Fabric.png delete mode 100644 BadMC_Launcher/Assets/Icons/MinecraftIcons/Forge.png delete mode 100644 BadMC_Launcher/Assets/Icons/MinecraftIcons/NeoForge.png delete mode 100644 BadMC_Launcher/Assets/Icons/MinecraftIcons/OptiFine.png delete mode 100644 BadMC_Launcher/Assets/Icons/MinecraftIcons/Quilt.png delete mode 100644 BadMC_Launcher/Assets/Icons/MinecraftIcons/Unknown.png rename BadMC_Launcher/Assets/Icons/MinecraftIcons/{LiteLoader.png => liteloader.png} (100%) delete mode 100644 BadMC_Launcher/BadMC_Launcher.csproj.user diff --git a/BadMC_Launcher/Assets/Icons/MinecraftIcons/Creeper.png b/BadMC_Launcher/Assets/Icons/MinecraftIcons/Creeper.png deleted file mode 100644 index 94a72e342e7ec5eaf5195df6d01685307634a3d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4548 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 diff --git a/BadMC_Launcher/Assets/Icons/MinecraftIcons/Fabric.png b/BadMC_Launcher/Assets/Icons/MinecraftIcons/Fabric.png deleted file mode 100644 index 93530b47979693c1225c64c12cc56639f12e7668..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14999 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 diff --git a/BadMC_Launcher/Assets/Icons/MinecraftIcons/Forge.png b/BadMC_Launcher/Assets/Icons/MinecraftIcons/Forge.png deleted file mode 100644 index 48b4eb45423e8767099df1bcbef083c52834153d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14350 zcmeHO`BM}}6z&-oSwM6^#RG*=P_R7E5Kllx4i}V5qeg-ij2JQTLaitgV0*odl#9_M z8Zm&x3K|a%?^0OH3r*zkLWIZ$wJ-{bg0OOJ-Yzgb|3IvY^bcDUP4AmGAK&-h>u+|q zhXyOGECyI0gscMmePo8RmF^|77Slzy{Xvhp)VVRdgl7UjvXcHp#_6uL-O zmcj~6h&W3Wq4&q3+M2=&rCr@L^Kx%(vpVI>gRMbe$!Tw~dCK^U@9N^+8P?3S#qB^^9=PdEKZ!t^K_C@Hc9H}py6{2|@AZkDwF(T%c!tSd`OHd^z`))dZA6G;MQkmXbtwZvb|bmfHxtBWd00vlPD!qnwq ziZeU}xD@3%4QrGE21)4;O;~Tmupzd())y~sq*Rs3xtPN^4_~O)#*Y^{rWyebeV^y| zokSki&SIE1w>LJH5=I~AIR4X&@ZBQmG&6vhGkQLXB8}>-w}9uTtq39%ckRRRuAVU| zq)}-tK&+e3k24o#cVV_b6QT%pRLb|vAzjsXe#Zi|HHMyZ&pJ;3I%h@U_`vpD%0n~} z!pn8T){>`V+AJuvS&A2zNk1qL5pemdz-sbvNfQamh*aO-N^17m6pYSQ?0aBMM0XvE z|8@IgJxTSC_5x|-xn(&L{is1dYR}IcNFUKAKn4j>3l&6~_9J+~{@asNNJrANf}&ds zuIwafddwBDN5hhM(%V$cFlaU(*glA)8FLh)_0`2qV@L*#@cggQy_Y+A09ZQ@io=8S zw_lJ9UOMv>sICW;wk#!2Z{Pe4Fi%xt0ph7URq^t&`TU`^%_SvsW`zHQR6`ggGko&M z@S$RFDH_cS4?~LDNCW5%JUnu;FW`W{;r1{z3qHppkaYvW>8HpN0`nXj<*k{tb` z;h;as=bk&!52u3@$&_r}E>SK>lY zTu`2*9+^N!K|$Lcy3&>->m(`E&J=LmqSuaMGh^5&urb_bUnJupQmLU)Iqqns%il=g=cY3M zR_i82NbCt+uIgy@9#OW!MT`!6c{_-`Qb<(@xIX!Z14MioV1K+-JToDaT|G$emz?ZR zNZ_{+xJ@1}#ziW7hPl0F?popwrhYEqyAEkRi9=H4$Ww6IG3+|vwA{&=W8kr7m8v2y zcc)i%06U?NuI+JE(7MIpz}^Y2X)C3ZW@|n<&Y%h6` z$3R$sp>MVOZlVVHNN6;EW7Nbv;FCa$Ram zF}l<{-0Yo6RmOso)|I#3KbVwUnGM5ypRsQ+*~Hs$bPG#yF;*{12IKfdMPeA+C>baj s#M1;N10@3`1D&Plp!9(ZN-DjH{b}z#tMCRHe8CR|_yzkO_g=8!Usx9%K>z>% diff --git a/BadMC_Launcher/Assets/Icons/MinecraftIcons/NeoForge.png b/BadMC_Launcher/Assets/Icons/MinecraftIcons/NeoForge.png deleted file mode 100644 index 295aef4681a5c775836da530acec301c82ad9af4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15156 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 Iv%){_Fa2|y0{{R3 diff --git a/BadMC_Launcher/Assets/Icons/MinecraftIcons/OptiFine.png b/BadMC_Launcher/Assets/Icons/MinecraftIcons/OptiFine.png deleted file mode 100644 index fc5d62eacb9d7b26284122898e52a72ebf089297..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14887 zcmeHOYgiLk8qN#}1OyBLK}4DX5ur*|q};S*K*V4Hv#3zDu3EH+#Tp6ipp0;p3b+XWn_= z^WA24i^CS0nM^Wau~=roqQGz#%Ye}Ra1Ft7Ut+icei=(d%i~$Bx2EWRu%s`ATUjiE z6&&clGzsf!xR}5G)-prYM+pX*>(`w${*LRg(i-D$_K;QCJqr|>%RdZoB#yMX?{+wD zqzr7MD$l0=(pwx<60v3YkL3MZ1&@~$b`E~Mx#s-fspgT+$Qm#06p~_LcopaPVr|pg zne|V&Jg!Awf!t?bu+Glr@(7Y54KPlw|E~QnhQ2Tn3rH+D_=oJ#|LX=$;<^xK0SWAv zQ^4ekn}`;Lw>r_Y?vNxF!#g=ecgfLfi!8)s_(At+V+*llhA?Rd&t8Vs-b3LB4<7O{ zre}HZ#N?#3b}m{woNXmPlzSWPSRteEpNYVQ^g@K(Q97Bu&~LrBbL2JbhT_Pq8P3MwJ2t^u)eva^Dk zY`rTESrV+pr0x3ZFTjH1Y}tOj6C-+VIpE=G_W?h zEy@>J&H*DM;(SdJBMX4F1wFIvktG5+`n9+HPQ=j$;AlgC)_&STP6r7u%Qi=XRmEbQ zmQnq`yprNDNchdLbR<|w5lDEe-)SW3JBz@(O*m751na#LBs^D8i$uL)s)D+_r*5o=p@a1j^gDb>XN#7#Y?X6`!wfM8an5lv2XQSJ>V0!!nt*u znM^v^X>&eKd?wpkZ6}X;b0!K#2uUP~eLKB<5UGS40-~s0`gas!k*a*)W#kxbO>_I3KBbV`l%zW zFAPrv$(5v*E!MmEWeRr>{e1xvD!bdng-GOlc0%vsF&Jmv(I58e-AmI1G1+Z0pgTOq zn7j~CPv!%nGHqF{p?LUBq+G+CM6GumWEFNhbFcXztv>&4!aIY_n#NsCC8R{X- ziak|ip~p;MKecfnRg!?>}~Fs_L4{nvNt2 z`kp)+fAiy>T1`(u*RwRgs${L&CM6SIr5y}$|d7GslVfSBzK zp3cY1?h9nuFbx8yy?14ZirL@^vXAY%g)EnW|BVYeNks2za4FSQ*ViFSBj~WpaSMTD z)&{<*?ZYT{Wa$DCY(3!1Ltw;%i(%k-d0M?j@FYpg-l@sy{@~I#F*D6oy0h8CB56R@ z

~^5KmXDD^6N_OSY6_#->#_5y!%TEq7aPhth{PAtsq2IGe#mcUHXuWOyK`iSB&V z>dc$2)(8ieKYHY|Lwan^#`fGyFKtR%P^4$C*XqITkvj)}y{3IyBVAeg{nO`yl%+Gg zLRa6}O#W=?Aw)+j0X0{b8K+R1BeD@QLs&8f7o9_X70Hk!omZQ=CI#PyXPzlf+Lm{u zFACH2MOjFl#WU4OJ&zZbUb6p+Gh~>%qJ9856|O0y7~&*4`XopNB;$Fb#kR2+Xg-PA zTD>v$7fe12ssC4>pVQCIp?PBXxeq(iEf|(;BSd=4c1BOF zSqwTf!~TohQ4K%ooh((0ov322XJSLNDu+ASN0XWsG9qyeIN0dbs!MOKH0LHZT1a_rXas=G)zj==Am^`?5^*bekFY>nPDzDLYTrm^ueVfE%Dy?_vD&Z2FYpIziXn*!2i1PLr14kb>p={ZWqP z4=*H$Ze^hD9fe7usR^cNZDY90fJGmoYWbZ&s66m^Ah{+0IwRy$6Pnf-{t+;p8N@*Fy0Jht+@BnFwe|2^JneD&^Pz5#&hhWc>hs=6 zDK35Qp>&|QyYhtR)1XvJ@bNv@elt4;%!uol%FmhCzpB z*#DF}(7)Lp@pvr|-jCm>URT<$G*f04Hts$lOT6ZmUuqdKO)^#GMMS>o zhgvD50wNmMwS_Kvq>cnd9o|!eqA8vWgmR1Cb6Z3QPm~hgZ~5fQhjUP@#9jpMiyyHU zg=K^UUS4@WuMahVSTa6@VQKeH>dEYVXs|F_Vo>_OatTUo@BUJ_;exIOnt5#G*!l8( z#~PGuKWouoiN;I#Wc^Gz^}Y);g4AgKo@!LdARsj}HvSqO~31 sE=A(&dKGFYYctU364h4|nxUB%9p9vh5Am15m!GWQ1z~~t0c%qK4T^-WB>(^b diff --git a/BadMC_Launcher/Assets/Icons/MinecraftIcons/Quilt.png b/BadMC_Launcher/Assets/Icons/MinecraftIcons/Quilt.png deleted file mode 100644 index cc7302ce8248cd3aaf02b4f742600b0568cd1835..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39060 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

0{-maS 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 diff --git a/BadMC_Launcher/Assets/Icons/MinecraftIcons/Unknown.png b/BadMC_Launcher/Assets/Icons/MinecraftIcons/Unknown.png deleted file mode 100644 index 12f3e698be74ada6d72ecb67cd281905cbd7572b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15938 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 P3dh;*w%^6w!8rGK>9guX diff --git a/BadMC_Launcher/Assets/Icons/MinecraftIcons/LiteLoader.png b/BadMC_Launcher/Assets/Icons/MinecraftIcons/liteloader.png similarity index 100% rename from BadMC_Launcher/Assets/Icons/MinecraftIcons/LiteLoader.png rename to BadMC_Launcher/Assets/Icons/MinecraftIcons/liteloader.png diff --git a/BadMC_Launcher/BadMC_Launcher.csproj.user b/BadMC_Launcher/BadMC_Launcher.csproj.user deleted file mode 100644 index 47233ad..0000000 --- a/BadMC_Launcher/BadMC_Launcher.csproj.user +++ /dev/null @@ -1,98 +0,0 @@ - - - - <_UnoSelectedTargetFramework>net9.0-windows10.0.26100 - BadMC_Launcher (WinAppSDK Packaged) - net9.0-windows10.0.26100 - False - <_LastSelectedProfileId>C:\Users\stars\Documents\Development\Tasks\Projects\Applications\BadMC_Launcher\BadMC_Launcher\Properties\PublishProfiles\win-x64.pubxml - - - ProjectDebugger - - - ProjectDebugger - - - ProjectDebugger - - - ProjectDebugger - - - ProjectDebugger - - - ProjectDebugger - - - ProjectDebugger - - - ProjectDebugger - - - ProjectDebugger - - - ProjectDebugger - - - ProjectDebugger - - - ProjectDebugger - - - ProjectDebugger - - - - Designer - - - - - Designer - - - - - Designer - - - - - Designer - - - Designer - - - Designer - - - Designer - - - Designer - - - Designer - - - Designer - - - Designer - - - - - Designer - - - Designer - - - \ No newline at end of file From 9a927114b692c8b42da49355b676e3ec84df9e23 Mon Sep 17 00:00:00 2001 From: Starcloudsea <84891987+Starcloudsea@users.noreply.github.com> Date: Sun, 23 Mar 2025 00:19:56 +0800 Subject: [PATCH 06/40] =?UTF-8?q?smpp=E6=94=B9=E4=BC=BC=E6=88=91=E4=BA=86?= =?UTF-8?q?=F0=9F=98=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BadMC_Launcher/App.xaml.cs | 5 +- BadMC_Launcher/Classes/ConfigClass.cs | 19 + .../Classes/Minecraft/MinecraftFolderEntry.cs | 54 ++- .../MainMenuSearchMinecraftEntryFilter.cs | 6 +- .../Minecraft/MinecraftEntryItem.cs} | 14 +- ...ngerTokenEnum.cs => MessengerTokenEnum.cs} | 12 +- .../MinecraftFolderEntryExtension.cs | 23 +- .../{JsonList.cs => ObservableDataList.cs} | 0 BadMC_Launcher/GlobalUsings.cs | 2 +- BadMC_Launcher/Interfaces/IConfigClass.cs | 12 - .../Datas/SettingsDatas/MinecraftConfig.cs | 8 +- .../SettingsDatas/SingleMinecraftConfig.cs | 3 +- .../Services/ExceptionHandlingService.cs | 2 +- BadMC_Launcher/Services/FileService.cs | 102 +++-- .../Settings/MinecraftConfigService.cs | 81 ++-- .../Settings/SingleMinecraftConfigService.cs | 52 ++- .../Services/Settings/ThemeSettingService.cs | 57 ++- .../ViewServices/MainSideBarManagerService.cs | 2 +- BadMC_Launcher/Strings/en-US/Resources.resw | 28 +- BadMC_Launcher/Strings/zh-Hans/Resources.resw | 26 +- .../MinecraftFolderContentDialogViewModel.cs | 166 +++++++- .../ViewModels/Pages/MainPageViewModel.cs | 32 +- .../MainSideBar/MainMenuPageViewModel.cs | 18 +- .../Settings/LaunchSettingsPageViewModel.cs | 28 +- .../SettingsDashboardPageViewModel.cs | 5 +- .../UserControls/LaunchPadViewModel.cs | 227 +++++------ .../MinecraftFolderContentDialog.xaml | 79 +++- .../MinecraftFolderContentDialog.xaml.cs | 12 +- BadMC_Launcher/Views/Pages/MainPage.xaml | 30 +- BadMC_Launcher/Views/Pages/MainPage.xaml.cs | 4 +- .../Views/Pages/MainSideBar/MainMenuPage.xaml | 10 +- .../Pages/Settings/LaunchSettingsPage.xaml | 29 +- .../Pages/Settings/SettingsDashboardPage.xaml | 4 +- .../Settings/SettingsDashboardPage.xaml.cs | 1 - .../MinecraftFolderItemsTemplate.xaml | 88 ++++- .../Views/UserControls/LaunchPad.xaml | 355 +++++++++--------- 36 files changed, 1080 insertions(+), 516 deletions(-) create mode 100644 BadMC_Launcher/Classes/ConfigClass.cs rename BadMC_Launcher/Classes/{Minecraft/MinecraftItem.cs => ViewClasses/Minecraft/MinecraftEntryItem.cs} (63%) rename BadMC_Launcher/Enums/{MessengerTokenEnum/MainPageMessengerTokenEnum.cs => MessengerTokenEnum.cs} (60%) rename BadMC_Launcher/Extensions/{JsonList.cs => ObservableDataList.cs} (100%) delete mode 100644 BadMC_Launcher/Interfaces/IConfigClass.cs diff --git a/BadMC_Launcher/App.xaml.cs b/BadMC_Launcher/App.xaml.cs index 7676331..263efc1 100644 --- a/BadMC_Launcher/App.xaml.cs +++ b/BadMC_Launcher/App.xaml.cs @@ -4,8 +4,7 @@ using BadMC_Launcher.Models.Datas; using BadMC_Launcher.Services; using BadMC_Launcher.Services.ViewServices; -using BadMC_Launcher.Servicess; -using BadMC_Launcher.Servicess.Settings; +using BadMC_Launcher.Services.Settings; using BadMC_Launcher.ViewModels.Pages; using BadMC_Launcher.Views.ContentDialogs.Settings; using BadMC_Launcher.Views.Pages; @@ -30,7 +29,7 @@ public App() { public static new App Current => (App)Application.Current; - protected Window? MainWindow { get; private set; } + public Window? MainWindow { get; private set; } public IHost? Host { get; private set; } diff --git a/BadMC_Launcher/Classes/ConfigClass.cs b/BadMC_Launcher/Classes/ConfigClass.cs new file mode 100644 index 0000000..7dccaff --- /dev/null +++ b/BadMC_Launcher/Classes/ConfigClass.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BadMC_Launcher.Classes; +public abstract class ConfigClass { + public abstract bool SyncSettingGet(); + + public abstract bool SyncSettingSet(); + + public event PropertyChangedEventHandler? PropertyChanged; + + protected void OnPropertyChanged(string propertyName) { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } +} diff --git a/BadMC_Launcher/Classes/Minecraft/MinecraftFolderEntry.cs b/BadMC_Launcher/Classes/Minecraft/MinecraftFolderEntry.cs index 3167d76..1566c4b 100644 --- a/BadMC_Launcher/Classes/Minecraft/MinecraftFolderEntry.cs +++ b/BadMC_Launcher/Classes/Minecraft/MinecraftFolderEntry.cs @@ -6,7 +6,7 @@ using System.Text.Json.Serialization; using System.Threading.Tasks; using BadMC_Launcher.Extensions; -using BadMC_Launcher.Servicess.Settings; +using BadMC_Launcher.Services.Settings; using MinecraftLaunch.Base.Models.Game; using MinecraftLaunch.Components.Parser; using Uno.Extensions.Specialized; @@ -14,18 +14,20 @@ namespace BadMC_Launcher.Classes.Minecraft; public class MinecraftFolderEntry { private MinecraftParser? minecraftParser; - private string minecraftName = string.Empty; + private string minecraftFolderId = string.Empty; private string? activeMinecraftEntryId; private ObservableDataList starredMinecraftIds = new(); private IEnumerable minecraftList = new List(); public MinecraftFolderEntry() { } - public required string MinecraftId { - get => minecraftName; + public required string MinecraftFolderId { + get => minecraftFolderId; set { - minecraftName = value; - OnPropertyChanged(); + minecraftFolderId = value; + + // Trigger Event + OnPropertyChanged(nameof(MinecraftFolderId)); } } @@ -35,7 +37,9 @@ public string? ActiveMinecraftEntryId { get => activeMinecraftEntryId; set { activeMinecraftEntryId = value; - OnPropertyChanged(); + + // Trigger Event + OnPropertyChanged(nameof(ActiveMinecraftEntryId)); } } @@ -43,28 +47,33 @@ public ObservableDataList StarredMinecraftIds { get => starredMinecraftIds; set { starredMinecraftIds = value; - OnPropertyChanged(); - } - } - protected void OnPropertyChanged() { - App.GetService().SyncSettingSet(); + // Trigger Event + OnPropertyChanged(nameof(StarredMinecraftIds)); + } } public void SetMinecrafts() { - if (minecraftParser == null) { - minecraftParser = new MinecraftParser(MinecraftFolderPath); - } + // Get MinecraftParser + minecraftParser = GetMinecraftParser(); + + // Init MinecraftEntryList minecraftList = new List(); + + // Get MinecraftEntries minecraftParser.GetMinecrafts().ForEach(item => ((List)minecraftList).Add(item)); } public IEnumerable GetMinecrafts() { + // If MinecraftEntryList is empty, get MinecraftEntries if (!minecraftList.Any()) { - if (minecraftParser == null) { - minecraftParser = new MinecraftParser(MinecraftFolderPath); - } + // Get MinecraftParser + minecraftParser = GetMinecraftParser(); + + // Init MinecraftEntryList minecraftList = new List(); + + // Get MinecraftEntries minecraftParser.GetMinecrafts().ForEach(item => ( (List)minecraftList ).Add(item)); } return minecraftList; @@ -76,4 +85,13 @@ public MinecraftParser GetMinecraftParser() { } return minecraftParser; } + + public event PropertyChangedEventHandler? PropertyChanged; + + protected void OnPropertyChanged(string propertyName) { + // Sync Setting + App.GetService().SyncSettingSet(); + + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } } diff --git a/BadMC_Launcher/Classes/ViewClasses/MainSearch/MainMenuSearchMinecraftEntryFilter.cs b/BadMC_Launcher/Classes/ViewClasses/MainSearch/MainMenuSearchMinecraftEntryFilter.cs index 7cbd740..f22d12c 100644 --- a/BadMC_Launcher/Classes/ViewClasses/MainSearch/MainMenuSearchMinecraftEntryFilter.cs +++ b/BadMC_Launcher/Classes/ViewClasses/MainSearch/MainMenuSearchMinecraftEntryFilter.cs @@ -3,11 +3,11 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -using BadMC_Launcher.Classes.ViewClasses; using BadMC_Launcher.Classes.Minecraft; +using BadMC_Launcher.Classes.ViewClasses.Minecraft; using BadMC_Launcher.Extensions; using BadMC_Launcher.Interfaces; -using BadMC_Launcher.Servicess.Settings; +using BadMC_Launcher.Services.Settings; using MinecraftLaunch.Base.Models.Game; using Uno.Extensions.Specialized; @@ -40,7 +40,7 @@ public IEnumerable Search(string searchText) { return returnList; } - public Action NavigateTo(MinecraftItem minecraftItem) { + public Action NavigateTo(MinecraftEntryItem minecraftItem) { return () => { Debug.WriteLine($"诶诶还妹写呢Σ(っ °Д °;)っ {minecraftItem.MinecraftId}"); }; diff --git a/BadMC_Launcher/Classes/Minecraft/MinecraftItem.cs b/BadMC_Launcher/Classes/ViewClasses/Minecraft/MinecraftEntryItem.cs similarity index 63% rename from BadMC_Launcher/Classes/Minecraft/MinecraftItem.cs rename to BadMC_Launcher/Classes/ViewClasses/Minecraft/MinecraftEntryItem.cs index 62d45d9..8f921c2 100644 --- a/BadMC_Launcher/Classes/Minecraft/MinecraftItem.cs +++ b/BadMC_Launcher/Classes/ViewClasses/Minecraft/MinecraftEntryItem.cs @@ -2,11 +2,13 @@ using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Collections.Specialized; +using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; +using BadMC_Launcher.Classes.Minecraft; using BadMC_Launcher.Extensions; -using BadMC_Launcher.Classes; using CommunityToolkit.WinUI.Controls; using Microsoft.CodeAnalysis; using Microsoft.UI.Xaml.Media.Imaging; @@ -14,8 +16,8 @@ using MinecraftLaunch.Components.Parser; using static System.Runtime.InteropServices.JavaScript.JSType; -namespace BadMC_Launcher.Classes.Minecraft; -public class MinecraftItem { +namespace BadMC_Launcher.Classes.ViewClasses.Minecraft; +public class MinecraftEntryItem { public string MinecraftId => MinecraftEntry.Id; public required MinecraftEntry MinecraftEntry { get; set; } @@ -25,4 +27,10 @@ public class MinecraftItem { public required HashSet MinecraftTags { get; init; } public bool IsStarred { get; set; } + + public void SetIsStarredEvent(object? sender, NotifyCollectionChangedEventArgs e) { + if (sender is ObservableDataList folderEntry) { + IsStarred = folderEntry.IndexOf(MinecraftId) >= 0; + } + } } diff --git a/BadMC_Launcher/Enums/MessengerTokenEnum/MainPageMessengerTokenEnum.cs b/BadMC_Launcher/Enums/MessengerTokenEnum.cs similarity index 60% rename from BadMC_Launcher/Enums/MessengerTokenEnum/MainPageMessengerTokenEnum.cs rename to BadMC_Launcher/Enums/MessengerTokenEnum.cs index 20d6094..566bdff 100644 --- a/BadMC_Launcher/Enums/MessengerTokenEnum/MainPageMessengerTokenEnum.cs +++ b/BadMC_Launcher/Enums/MessengerTokenEnum.cs @@ -4,7 +4,7 @@ using System.Text; using System.Threading.Tasks; -namespace BadMC_Launcher.Enums.MessengerTokenEnum; +namespace BadMC_Launcher.Enums; public enum MainPageMessengerTokenEnum { //Func Token PageNavigateToken, @@ -15,3 +15,13 @@ public enum MainPageMessengerTokenEnum { MainSideBarFrameToken, XamlRootToken } + +public enum MinecraftFolderContentDialogMessengerTokenEnum { + //GetValue Token + RenameFlyoutToken, +} + + +public enum MinecraftConfigMessengerTokenEnum { + ActiveMinecraftFolder +} diff --git a/BadMC_Launcher/Extensions/MinecraftFolderEntryExtension.cs b/BadMC_Launcher/Extensions/MinecraftFolderEntryExtension.cs index fa75519..2dce520 100644 --- a/BadMC_Launcher/Extensions/MinecraftFolderEntryExtension.cs +++ b/BadMC_Launcher/Extensions/MinecraftFolderEntryExtension.cs @@ -5,6 +5,7 @@ using System.Text; using System.Threading.Tasks; using BadMC_Launcher.Classes.Minecraft; +using BadMC_Launcher.Classes.ViewClasses.Minecraft; using BadMC_Launcher.Enums; using BadMC_Launcher.Services; using CommunityToolkit.WinUI.Controls; @@ -14,7 +15,7 @@ namespace BadMC_Launcher.Extensions; public static class MinecraftFolderEntryExtension { - public static MinecraftItem? GetMinecraftItem(this MinecraftFolderEntry minecraftPath, string minecraftEntryId) { + public static MinecraftEntryItem? GetMinecraftItem(this MinecraftFolderEntry minecraftPath, string minecraftEntryId) { try { return minecraftPath.GetMinecraftItem(minecraftPath.GetMinecraftParser().GetMinecraft(minecraftEntryId)); } @@ -24,7 +25,7 @@ public static class MinecraftFolderEntryExtension { return null; } - public static MinecraftItem? GetMinecraftItem(this MinecraftFolderEntry minecraftPath, MinecraftEntry minecraftEntry) { + public static MinecraftEntryItem? GetMinecraftItem(this MinecraftFolderEntry minecraftFolderEntry, MinecraftEntry minecraftEntry) { try { if (minecraftEntry != null) { var isStarred = false; @@ -47,16 +48,22 @@ public static class MinecraftFolderEntryExtension { image = new(new Uri($@"ms-appx:///Assets/Icons/MinecraftIcons/{MinecraftEntryImageEnum.Unknown.ToString().ToLower()}.png")); } - if (minecraftPath.StarredMinecraftIds != null) { - isStarred = minecraftPath.StarredMinecraftIds.IndexOf(minecraftEntry.Id) >= 0; + if (minecraftFolderEntry.StarredMinecraftIds != null) { + isStarred = minecraftFolderEntry.StarredMinecraftIds.IndexOf(minecraftEntry.Id) >= 0; } - return new MinecraftItem() { + var entryItem = new MinecraftEntryItem() { MinecraftEntry = minecraftEntry, MinecraftImage = image, MinecraftTags = (HashSet)minecraftEntry.GetMinecraftEntryTags(), IsStarred = isStarred }; + + if (minecraftFolderEntry.StarredMinecraftIds != null) { + minecraftFolderEntry.StarredMinecraftIds.CollectionChanged += entryItem.SetIsStarredEvent; + } + + return entryItem; } } @@ -66,9 +73,9 @@ public static class MinecraftFolderEntryExtension { return null; } - public static IEnumerable GetMinecraftItems(this MinecraftFolderEntry minecraftPath) { + public static IEnumerable GetMinecraftItems(this MinecraftFolderEntry minecraftPath) { var minecraftParser = minecraftPath.GetMinecraftParser(); - var items = new ObservableCollection(); + var items = new ObservableCollection(); foreach (var entry in minecraftParser.GetMinecrafts()) { var isStarred = false; string path; @@ -89,7 +96,7 @@ public static IEnumerable GetMinecraftItems(this MinecraftFolderE if (minecraftPath.StarredMinecraftIds != null) { isStarred = minecraftPath.StarredMinecraftIds.IndexOf(entry.Id) >= 0; } - items.Add(new MinecraftItem() { + items.Add(new MinecraftEntryItem() { MinecraftEntry = entry, MinecraftImage = new BitmapImage() { UriSource = new Uri(path) }, MinecraftTags = (HashSet)entry.GetMinecraftEntryTags(), diff --git a/BadMC_Launcher/Extensions/JsonList.cs b/BadMC_Launcher/Extensions/ObservableDataList.cs similarity index 100% rename from BadMC_Launcher/Extensions/JsonList.cs rename to BadMC_Launcher/Extensions/ObservableDataList.cs diff --git a/BadMC_Launcher/GlobalUsings.cs b/BadMC_Launcher/GlobalUsings.cs index a7653ee..0c6b06d 100644 --- a/BadMC_Launcher/GlobalUsings.cs +++ b/BadMC_Launcher/GlobalUsings.cs @@ -1,5 +1,5 @@ global using System.Diagnostics; -global using BadMC_Launcher.Servicess; +global using BadMC_Launcher.Services; global using CommunityToolkit.Mvvm.ComponentModel; global using Microsoft.Extensions.DependencyInjection; global using Microsoft.Extensions.Hosting; diff --git a/BadMC_Launcher/Interfaces/IConfigClass.cs b/BadMC_Launcher/Interfaces/IConfigClass.cs deleted file mode 100644 index e9bc4a6..0000000 --- a/BadMC_Launcher/Interfaces/IConfigClass.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace BadMC_Launcher.Interfaces; -public interface IConfigClass { - public bool SyncSettingGet(); - - public bool SyncSettingSet(); -} diff --git a/BadMC_Launcher/Models/Datas/SettingsDatas/MinecraftConfig.cs b/BadMC_Launcher/Models/Datas/SettingsDatas/MinecraftConfig.cs index 4a1a959..902a60a 100644 --- a/BadMC_Launcher/Models/Datas/SettingsDatas/MinecraftConfig.cs +++ b/BadMC_Launcher/Models/Datas/SettingsDatas/MinecraftConfig.cs @@ -11,11 +11,11 @@ namespace BadMC_Launcher.Models.Datas.SettingsDatas; internal static class MinecraftConfig { - internal static IEnumerable minecraftAccounts = new ObservableDataList(); + internal static ObservableDataList minecraftAccounts = new(); - internal static IEnumerable javaPaths = new ObservableDataList(); + internal static ObservableDataList javaPaths = new(); - internal static IEnumerable minecraftPaths = new ObservableDataList(); + internal static ObservableDataList minecraftPaths = new(); internal static JavaEntry? activeJavaPath; @@ -35,5 +35,5 @@ internal static class MinecraftConfig { internal static string? launcherName = App.GetService().GetString("MinecraftConfig_MinecraftTitleNameResource"); - internal static IEnumerable? jvmArguments; + internal static ObservableDataList jvmArguments = new(); } diff --git a/BadMC_Launcher/Models/Datas/SettingsDatas/SingleMinecraftConfig.cs b/BadMC_Launcher/Models/Datas/SettingsDatas/SingleMinecraftConfig.cs index 5f8a466..80ec285 100644 --- a/BadMC_Launcher/Models/Datas/SettingsDatas/SingleMinecraftConfig.cs +++ b/BadMC_Launcher/Models/Datas/SettingsDatas/SingleMinecraftConfig.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using BadMC_Launcher.Extensions; using MinecraftLaunch.Base.Models.Game; namespace BadMC_Launcher.Models.Datas.SettingsDatas; @@ -23,5 +24,5 @@ internal class SingleMinecraftConfig { internal string? launcherName; - internal IEnumerable? jvmArguments; + internal ObservableDataList jvmArguments = new(); } diff --git a/BadMC_Launcher/Services/ExceptionHandlingService.cs b/BadMC_Launcher/Services/ExceptionHandlingService.cs index 65a8447..6db8acb 100644 --- a/BadMC_Launcher/Services/ExceptionHandlingService.cs +++ b/BadMC_Launcher/Services/ExceptionHandlingService.cs @@ -1,4 +1,4 @@ -namespace BadMC_Launcher.Servicess; +namespace BadMC_Launcher.Services; internal class ExceptionHandlingService { public void ToastException(string title, string message, Exception? exception = null, Action? action = null) { action?.Invoke(); diff --git a/BadMC_Launcher/Services/FileService.cs b/BadMC_Launcher/Services/FileService.cs index a869e1a..462f343 100644 --- a/BadMC_Launcher/Services/FileService.cs +++ b/BadMC_Launcher/Services/FileService.cs @@ -1,3 +1,4 @@ +using System.ComponentModel; using System.Reflection; using System.Security; using System.Text.Encodings.Web; @@ -10,7 +11,8 @@ using Microsoft.UI.Xaml.Controls; using MinecraftLaunch.Extensions; -namespace BadMC_Launcher.Servicess; +namespace BadMC_Launcher.Services; + public class FileService { public bool CheckFolderAndFile(string path, bool isCheckFile) { if (isCheckFile ? File.Exists(path) : Path.Exists(path)) { @@ -57,9 +59,6 @@ public bool CheckFolderAndFile(string path, bool isCheckFile) { public bool ReadConfig(string filePath, JsonTypeInfo jsonTypeInfo, out T? returnValue, Dictionary? updateMapping = null) { if (CheckFolderAndFile(filePath, true)) { try { - if (updateMapping != null) { - TryReadConfigWithMappings(filePath, jsonTypeInfo, updateMapping); - } var fileValue = File.ReadAllText(filePath); if (!string.IsNullOrWhiteSpace(fileValue)) { returnValue = fileValue.Deserialize(jsonTypeInfo); @@ -81,7 +80,12 @@ public bool ReadConfig(string filePath, JsonTypeInfo jsonTypeInfo, out T? //TODO break; case JsonException: - //TODO + if (updateMapping != null && TryReadConfigWithMappings(filePath, jsonTypeInfo, updateMapping)) { + ReadConfig(filePath, jsonTypeInfo, out _, updateMapping); + } + else { + //TODO + } break; default: throw; @@ -166,28 +170,21 @@ public bool WriteConfig(string filePath, JsonTypeInfo jsonTypeInfo, T valu public bool TryReadConfigWithMappings(string filePath, JsonTypeInfo jsonTypeInfo, Dictionary updateMapping) { try { if (CheckFolderAndFile(filePath, true)) { - var fileValue = File.ReadAllText(filePath); - if (!string.IsNullOrWhiteSpace(fileValue)) { - - using JsonDocument doc = JsonDocument.Parse(fileValue); + var content = File.ReadAllText(filePath); - JsonObject? jsonObject = JsonObject.Create(doc.RootElement); - if (jsonObject != null) { - foreach (var item in jsonObject.ToList()) { - var updateKey = updateMapping.FirstOrDefault(mappingItem => mappingItem.Key == item.Key).Value; - if (updateKey != null) { - JsonNode? valueCopy = item.Value?.DeepClone(); + if (string.IsNullOrWhiteSpace(content)) { + return false; + } - jsonObject.Add(updateKey, valueCopy); - jsonObject.Remove(item.Key); + using JsonDocument doc = JsonDocument.Parse(content); + JsonObject? root = JsonObject.Create(doc.RootElement); + if (root == null) return false; - File.WriteAllText(filePath, jsonObject.ToJsonString(new() { WriteIndented = true })); - return true; - } - } - } - - + bool modified = ProcessJsonNode(root, updateMapping); + + if (modified) { + File.WriteAllText(filePath, root.ToJsonString(new() { WriteIndented = true })); + return true; } } } @@ -214,4 +211,61 @@ public bool TryReadConfigWithMappings(string filePath, JsonTypeInfo jsonTy } return false; } + + public bool TryOpenFolderFromPath(string path) { + try { + using (Process.Start(new ProcessStartInfo(path) { + UseShellExecute = true, + Verb = "open" + })) { + return true; + } + } + catch (Exception ex) { + switch (ex) { + case Win32Exception: + //TODO: Dialog + break; + case FileNotFoundException: + //TODO: Dialog + break; + default: + throw; + } + } + return false; + } + + //TODO: TEST + private bool ProcessJsonNode(JsonNode node, Dictionary updateMapping) { + bool modified = false; + + switch (node) { + case JsonObject obj: + // Loop to find nested objects + foreach (var prop in obj.ToList()) { + if (prop.Value != null && ProcessJsonNode(prop.Value, updateMapping)) { + modified = true; + } + + // Modify the key name to correspond to the mapping + if (prop.Value != null && updateMapping.TryGetValue(prop.Key, out var newKey)) { + obj.Add(newKey, prop.Value.DeepClone()); + obj.Remove(prop.Key); + modified = true; + } + } + break; + case JsonArray arr: + // 处理数组元素 + for (int i = 0; i < arr.Count; i++) { + if (arr[i] is JsonNode element && ProcessJsonNode(element, updateMapping)) { + arr[i] = element.DeepClone(); // 更新修改后的元素 + modified = true; + } + } + break; + } + return modified; + } } diff --git a/BadMC_Launcher/Services/Settings/MinecraftConfigService.cs b/BadMC_Launcher/Services/Settings/MinecraftConfigService.cs index 0368eed..39db78f 100644 --- a/BadMC_Launcher/Services/Settings/MinecraftConfigService.cs +++ b/BadMC_Launcher/Services/Settings/MinecraftConfigService.cs @@ -11,7 +11,6 @@ using Newtonsoft.Json.Linq; using MinecraftLaunch.Base.Models.Game; using Microsoft.Windows.ApplicationModel.Resources; -using BadMC_Launcher.Interfaces; using System.Text.Json.Serialization; using System.Text.Json.Serialization.Metadata; using CommunityToolkit.Mvvm.Messaging.Messages; @@ -24,46 +23,52 @@ using BadMC_Launcher.Classes.Minecraft; using BadMC_Launcher.Models.Datas; using BadMC_Launcher.Models.Datas.Mappings; +using BadMC_Launcher.Classes; -namespace BadMC_Launcher.Servicess.Settings; -public class MinecraftConfigService : IConfigClass { +namespace BadMC_Launcher.Services.Settings; +public class MinecraftConfigService : ConfigClass { internal bool isSyncEnabled = false; public MinecraftConfigService() { - if (MinecraftConfig.minecraftAccounts is ObservableDataList minecraftAccountsObservableDataList - && MinecraftConfig.javaPaths is ObservableDataList javaPathsObservableDataList - && MinecraftConfig.minecraftPaths is ObservableDataList minecraftPathsObservableDataList) { - - //Triggers an event when a property is changed - minecraftAccountsObservableDataList.CollectionChanged += OnCollectionChanged; - javaPathsObservableDataList.CollectionChanged += OnCollectionChanged; - minecraftPathsObservableDataList.CollectionChanged += OnCollectionChanged; - } + //Triggers an event when a property is changed + if (MinecraftAccounts != null) { MinecraftAccounts.CollectionChanged += OnCollectionChanged; } + if (JavaPaths != null) { JavaPaths.CollectionChanged += OnCollectionChanged; } + if (MinecraftFolders != null) { MinecraftFolders.CollectionChanged += OnCollectionChanged; } + if (JvmArguments != null) { JvmArguments.CollectionChanged += OnCollectionChanged; } } - public IEnumerable MinecraftAccounts { + public ObservableDataList MinecraftAccounts { get => MinecraftConfig.minecraftAccounts; set { MinecraftConfig.minecraftAccounts = value; - //Write to Json + // Trigger Event + OnPropertyChanged(nameof(MinecraftAccounts)); + + // Write to Json SyncSettingSet(); } } - public IEnumerable JavaPaths { + public ObservableDataList JavaPaths { get => MinecraftConfig.javaPaths; set { MinecraftConfig.javaPaths = value; + // Trigger Event + OnPropertyChanged(nameof(JavaPaths)); + //Write to Json SyncSettingSet(); } } - public IEnumerable MinecraftFolders { + public ObservableDataList MinecraftFolders { get => MinecraftConfig.minecraftPaths; set { MinecraftConfig.minecraftPaths = value; + // Trigger Event + OnPropertyChanged(nameof(MinecraftFolders)); + //Write to Json SyncSettingSet(); } @@ -74,6 +79,9 @@ public JavaEntry? ActiveJavaPath { set { MinecraftConfig.activeJavaPath = value; + // Trigger Event + OnPropertyChanged(nameof(ActiveJavaPath)); + //Write to Json SyncSettingSet(); } @@ -84,6 +92,9 @@ public string? ActiveMinecraftFolderPath { set { MinecraftConfig.activeMinecraftFolder = value; + // Trigger Event + OnPropertyChanged(nameof(ActiveMinecraftFolderPath)); + //Write to Json SyncSettingSet(); } @@ -94,6 +105,9 @@ public Account? ActiveMinecraftAccount { set { MinecraftConfig.activeMinecraftAccount = value; + // Trigger Event + OnPropertyChanged(nameof(ActiveMinecraftAccount)); + //Write to Json SyncSettingSet(); } @@ -104,6 +118,9 @@ public bool IsFullscreen { set { MinecraftConfig.isFullscreen = value; + // Trigger Event + OnPropertyChanged(nameof(JavaPaths)); + //Write to Json SyncSettingSet(); } @@ -114,6 +131,9 @@ public bool IsEnableIndependencyCore { set { MinecraftConfig.isEnableIndependencyCore = value; + // Trigger Event + OnPropertyChanged(nameof(IsEnableIndependencyCore)); + //Write to Json SyncSettingSet(); } @@ -124,6 +144,9 @@ public bool IsAutoMemorySize { set { MinecraftConfig.isAutoMemorySize = value; + // Trigger Event + OnPropertyChanged(nameof(IsAutoMemorySize)); + //Write to Json SyncSettingSet(); } @@ -134,6 +157,9 @@ public int MinMemorySize { set { MinecraftConfig.minMemorySize = value; + // Trigger Event + OnPropertyChanged(nameof(MinMemorySize)); + //Write to Json SyncSettingSet(); } @@ -144,6 +170,9 @@ public int MaxMemorySize { set { MinecraftConfig.maxMemorySize = value; + // Trigger Event + OnPropertyChanged(nameof(MaxMemorySize)); + //Write to Json SyncSettingSet(); } @@ -154,29 +183,34 @@ public string? LauncherName { set { MinecraftConfig.launcherName = value; + // Trigger Event + OnPropertyChanged(nameof(LauncherName)); + //Write to Json SyncSettingSet(); } } - public IEnumerable? JvmArguments { + public ObservableDataList JvmArguments { get => MinecraftConfig.jvmArguments; set { MinecraftConfig.jvmArguments = value; + // Trigger Event + OnPropertyChanged(nameof(JvmArguments)); + //Write to Json SyncSettingSet(); } } private void OnCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e) { - if (!SyncSettingSet()) { //TODO: Dialog } } - public bool SyncSettingGet() { + public override bool SyncSettingGet() { if (App.GetService().ReadConfig(Path.Combine(AppDataPath.ConfigsPath, "MinecraftConfigs.json"), MinecraftConfigServiceContext.Default.MinecraftConfigService, out var jsonClass, UpdateMapping.MinecraftConfig) && jsonClass != null) { //TODO: 解蜜 MinecraftConfig.minecraftAccounts = jsonClass.MinecraftAccounts; @@ -197,20 +231,13 @@ public bool SyncSettingGet() { return false; } - private void PropertyChanged(object? sender, PropertyChangedEventArgs e) { - if (!SyncSettingSet()) { - //TODO: Dialog - } - } - - public bool SyncSettingSet() { + public override bool SyncSettingSet() { if (isSyncEnabled == false) { return false; } MinecraftConfigService classValue = this; //TODO: 加蜜 return App.GetService().WriteConfig(Path.Combine(AppDataPath.ConfigsPath, "MinecraftConfigs.json"), MinecraftConfigServiceContext.Default.MinecraftConfigService, classValue); - } } diff --git a/BadMC_Launcher/Services/Settings/SingleMinecraftConfigService.cs b/BadMC_Launcher/Services/Settings/SingleMinecraftConfigService.cs index 1412d54..3625da3 100644 --- a/BadMC_Launcher/Services/Settings/SingleMinecraftConfigService.cs +++ b/BadMC_Launcher/Services/Settings/SingleMinecraftConfigService.cs @@ -1,22 +1,31 @@ using System; using System.Collections.Generic; +using System.Collections.Specialized; using System.Linq; using System.Text; using System.Text.Json.Serialization; using System.Threading.Tasks; +using BadMC_Launcher.Classes; +using BadMC_Launcher.Extensions; using BadMC_Launcher.Models.Datas.SettingsDatas; -using BadMC_Launcher.Interfaces; using MinecraftLaunch.Base.Models.Game; -namespace BadMC_Launcher.Servicess.Settings; -public class SingleMinecraftConfigService : IConfigClass { +namespace BadMC_Launcher.Services.Settings; +public class SingleMinecraftConfigService : ConfigClass { private SingleMinecraftConfig singleMinecraftConfigInstance = new(); + public SingleMinecraftConfigService() { + JvmArguments.CollectionChanged += OnCollectionChanged; + } + public string? TargetMinecraftEntryPath { get => singleMinecraftConfigInstance.targetMinecraftEntryPath; set { singleMinecraftConfigInstance.targetMinecraftEntryPath = value; + // Trigger Event + OnPropertyChanged(nameof(TargetMinecraftEntryPath)); + //Write to Json or other logic SyncSettingSet(); } @@ -27,6 +36,9 @@ public bool? IsFullscreen { set { singleMinecraftConfigInstance.isFullscreen = value; + // Trigger Event + OnPropertyChanged(nameof(IsFullscreen)); + //Write to Json SyncSettingSet(); } @@ -37,6 +49,9 @@ public bool? IsEnableIndependencyCore { set { singleMinecraftConfigInstance.isEnableIndependencyCore = value; + // Trigger Event + OnPropertyChanged(nameof(IsEnableIndependencyCore)); + //Write to Json SyncSettingSet(); } @@ -47,6 +62,9 @@ public bool? IsAutoMemorySize { set { singleMinecraftConfigInstance.isAutoMemorySize = value; + // Trigger Event + OnPropertyChanged(nameof(IsAutoMemorySize)); + //Write to Json SyncSettingSet(); } @@ -57,6 +75,9 @@ public int? MinMemorySize { set { singleMinecraftConfigInstance.minMemorySize = value; + // Trigger Event + OnPropertyChanged(nameof(MinMemorySize)); + //Write to Json SyncSettingSet(); } @@ -67,6 +88,9 @@ public int? MaxMemorySize { set { singleMinecraftConfigInstance.maxMemorySize = value; + // Trigger Event + OnPropertyChanged(nameof(MaxMemorySize)); + //Write to Json SyncSettingSet(); } @@ -77,6 +101,9 @@ public JavaEntry? JavaPath { set { singleMinecraftConfigInstance.javaPath = value; + // Trigger Event + OnPropertyChanged(nameof(JavaPath)); + //Write to Json SyncSettingSet(); } @@ -87,22 +114,35 @@ public string? LauncherName { set { singleMinecraftConfigInstance.launcherName = value; + // Trigger Event + OnPropertyChanged(nameof(LauncherName)); + //Write to Json SyncSettingSet(); } } - public IEnumerable? JvmArguments { + public ObservableDataList JvmArguments { get => singleMinecraftConfigInstance.jvmArguments; set { singleMinecraftConfigInstance.jvmArguments = value; + // Trigger Event + OnPropertyChanged(nameof(JvmArguments)); + //Write to Json SyncSettingSet(); } } - public bool SyncSettingGet() { + private void OnCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e) { + + if (!SyncSettingSet()) { + //TODO: Dialog + } + } + + public override bool SyncSettingGet() { if (TargetMinecraftEntryPath != null) { if (File.Exists(Path.Combine(TargetMinecraftEntryPath, @"BadBCConfigs\MinecraftConfig.json"))) { if(App.GetService().ReadConfig(Path.Combine(TargetMinecraftEntryPath, @"BadBCConfigs\MinecraftConfig.json"), SingleMinecraftConfigServiceContext.Default.SingleMinecraftConfigService, out var jsonClass) && jsonClass != null) { @@ -122,7 +162,7 @@ public bool SyncSettingGet() { return false; } - public bool SyncSettingSet() { + public override bool SyncSettingSet() { if (TargetMinecraftEntryPath != null) { return App.GetService().WriteConfig(Path.Combine(TargetMinecraftEntryPath, @"BadBCConfigs\MinecraftConfig.json"), SingleMinecraftConfigServiceContext.Default.SingleMinecraftConfigService, this); } diff --git a/BadMC_Launcher/Services/Settings/ThemeSettingService.cs b/BadMC_Launcher/Services/Settings/ThemeSettingService.cs index 0c51ce3..ce93511 100644 --- a/BadMC_Launcher/Services/Settings/ThemeSettingService.cs +++ b/BadMC_Launcher/Services/Settings/ThemeSettingService.cs @@ -6,22 +6,30 @@ using System.Text.Encodings.Web; using System.Text.Json; using System.Text.Json.Serialization; +using BadMC_Launcher.Classes; using BadMC_Launcher.Enums; -using BadMC_Launcher.Interfaces; using BadMC_Launcher.Models.Datas; using BadMC_Launcher.Models.Datas.SettingsDatas; using CommunityToolkit.Mvvm.Messaging; using CommunityToolkit.Mvvm.Messaging.Messages; using Microsoft.UI.Xaml.Media.Imaging; -namespace BadMC_Launcher.Servicess.Settings; -public class ThemeSettingService : IConfigClass { +namespace BadMC_Launcher.Services.Settings; +public class ThemeSettingService : ConfigClass { internal bool isSyncEnabled = false; public BackgroundTypeEnum BackgroundType { get => ThemeSetting.backgroundType; set { ThemeSetting.backgroundType = value; + + // Trigger Event + OnPropertyChanged(nameof(BackgroundType)); + + // Sync Setting + SyncSettingSet(); + + // Set Background SetBackground(); } } @@ -30,6 +38,12 @@ public ThemeTypeEnum ThemeType { get => ThemeSetting.themeType; set { ThemeSetting.themeType = value; + + // Trigger Event + OnPropertyChanged(nameof(ThemeType)); + + // Sync Setting + SyncSettingSet(); } } @@ -37,6 +51,14 @@ public string ImageBackgroundName { get => ThemeSetting.imageBackgroundName; set { ThemeSetting.imageBackgroundName = value; + + // Trigger Event + OnPropertyChanged(nameof(ImageBackgroundName)); + + // Sync Setting + SyncSettingSet(); + + // Set Background SetBackground(); } } @@ -45,6 +67,14 @@ public Stretch BackgroundStretch { get => ThemeSetting.backgroundStretch; set { ThemeSetting.backgroundStretch = value; + + // Trigger Event + OnPropertyChanged(nameof(BackgroundStretch)); + + // Sync Setting + SyncSettingSet(); + + // Set Background SetBackground(); } } @@ -53,6 +83,14 @@ public string SolidColorBackgroundCode { get => ThemeSetting.solidColorBackgroundCode; set { ThemeSetting.solidColorBackgroundCode = value; + + // Trigger Event + OnPropertyChanged(nameof(SolidColorBackgroundCode)); + + // Sync Setting + SyncSettingSet(); + + // Set Background SetBackground(); } } @@ -61,10 +99,12 @@ public string WindowName { get => ThemeSetting.windowName; set { ThemeSetting.windowName = value; - if (!SyncSettingSet()) { - //TODO: Exception Dialog - } + // Trigger Event + OnPropertyChanged(nameof(WindowName)); + + // Sync Setting + SyncSettingSet(); } } @@ -99,7 +139,7 @@ public async void SetBackground(Action? backgroundChanged = null) { } } - public bool SyncSettingGet() { + public override bool SyncSettingGet() { if (App.GetService().ReadConfig(Path.Combine(AppDataPath.ConfigsPath, @"Settings\ThemeSettings.json"), ThemeSettingServiceContext.Default.ThemeSettingService, out var jsonClass) && jsonClass != null) { ThemeSetting.backgroundType = jsonClass.BackgroundType; ThemeSetting.themeType = jsonClass.ThemeType; @@ -112,7 +152,7 @@ public bool SyncSettingGet() { return false; } - public bool SyncSettingSet() { + public override bool SyncSettingSet() { if (App.GetService().WriteConfig(Path.Combine(AppDataPath.ConfigsPath, @"Settings\ThemeSettings.json"), ThemeSettingServiceContext.Default.ThemeSettingService, this)) { WeakReferenceMessenger.Default.Send(new ValueChangedMessage(this), "MinecraftConfigChanged"); return true; @@ -141,6 +181,7 @@ public static async Task GetBingWallpaperUrl() { var status = doc.RootElement.TryGetProperty("images", out var imagesjsonElement); status = imagesjsonElement[0].TryGetProperty("url", out var urljsonElement); if (status == true) { + // TODO: Toast Exception return "https://cn.bing.com" + urljsonElement.GetString() ?? throw new Exception("Can't get Bing wallpapers."); } } diff --git a/BadMC_Launcher/Services/ViewServices/MainSideBarManagerService.cs b/BadMC_Launcher/Services/ViewServices/MainSideBarManagerService.cs index 0bb398a..e7ad697 100644 --- a/BadMC_Launcher/Services/ViewServices/MainSideBarManagerService.cs +++ b/BadMC_Launcher/Services/ViewServices/MainSideBarManagerService.cs @@ -13,7 +13,7 @@ using CommunityToolkit.Mvvm.Messaging; using Newtonsoft.Json.Linq; using BadMC_Launcher.Classes.ViewClasses; -using BadMC_Launcher.Enums.MessengerTokenEnum; +using BadMC_Launcher.Enums; namespace BadMC_Launcher.Services.ViewServices; public class MainSideBarManagerService { diff --git a/BadMC_Launcher/Strings/en-US/Resources.resw b/BadMC_Launcher/Strings/en-US/Resources.resw index cd397db..3e9d7f8 100644 --- a/BadMC_Launcher/Strings/en-US/Resources.resw +++ b/BadMC_Launcher/Strings/en-US/Resources.resw @@ -124,19 +124,19 @@ Launch with BadMCL (NOT BMCL!!!) - No ontology selected_( ゚Д゚)ノ + No ontology selected _( ゚Д゚)ノ Launch Minecraft! - + Refresh - + Manage Minecraft ontologies folders - - Browse Minecraft ontologies folders + + Browse Minecraft ontologies folder Can't find any ontologies. @@ -217,4 +217,22 @@ If something in this setting has been changed in an ontology-specific customizat Adding a new Minecraft ontologies folder + + Rename the item (without changing the folder name) + + + Apply + + + Cancel + + + Path + + + Minecraft ontology folder not selected (´-ω-`) + + + View in File Manager + \ No newline at end of file diff --git a/BadMC_Launcher/Strings/zh-Hans/Resources.resw b/BadMC_Launcher/Strings/zh-Hans/Resources.resw index 2e106e2..921056f 100644 --- a/BadMC_Launcher/Strings/zh-Hans/Resources.resw +++ b/BadMC_Launcher/Strings/zh-Hans/Resources.resw @@ -124,18 +124,18 @@ 启动 Minecraft! - 未选择本体_( ゚Д゚)ノ + 未选择本体 _( ゚Д゚)ノ 使用 BadMCL(不是 BMCL!!!)启动 - + 刷新 - + 管理 Minecraft 本体文件夹 - + 浏览 Minecraft 本体文件夹 @@ -217,4 +217,22 @@ 添加新的 Minecraft 本体文件夹 + + 重命名该项(不更改文件夹名) + + + 应用 + + + 取消 + + + 路径 + + + 未选择 Minecraft 本体文件夹 (´-ω-`) + + + 在文件管理器中显示 + \ No newline at end of file diff --git a/BadMC_Launcher/ViewModels/ContentDialogs/Settings/MinecraftFolderContentDialogViewModel.cs b/BadMC_Launcher/ViewModels/ContentDialogs/Settings/MinecraftFolderContentDialogViewModel.cs index a9c1c30..74cf661 100644 --- a/BadMC_Launcher/ViewModels/ContentDialogs/Settings/MinecraftFolderContentDialogViewModel.cs +++ b/BadMC_Launcher/ViewModels/ContentDialogs/Settings/MinecraftFolderContentDialogViewModel.cs @@ -2,20 +2,182 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; +using System.Reflection.Metadata; using System.Text; using System.Threading.Tasks; using BadMC_Launcher.Classes.Minecraft; -using BadMC_Launcher.Servicess.Settings; +using BadMC_Launcher.Enums; +using BadMC_Launcher.Extensions; +using BadMC_Launcher.Services; +using BadMC_Launcher.Services.Settings; +using CommunityToolkit.Mvvm.Input; +using CommunityToolkit.Mvvm.Messaging; +using CommunityToolkit.Mvvm.Messaging.Messages; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Controls.Primitives; +using Windows.Storage.Pickers; +using WinRT.Interop; namespace BadMC_Launcher.ViewModels.ContentDialogs.Settings; public partial class MinecraftFolderContentDialogViewModel : ObservableObject { private MinecraftConfigService minecraftCOnfigService = App.GetService(); + private MinecraftConfigService MinecraftService = App.GetService(); public MinecraftFolderContentDialogViewModel() { - MinecraftFoldersList = minecraftCOnfigService.MinecraftFolders.ToObservableCollection(); + MinecraftFoldersListSelectedItem = MinecraftFoldersList.FirstOrDefault(item => item.MinecraftFolderPath == MinecraftService.ActiveMinecraftFolderPath); + + OldRenameMinecraftFolderId = string.Empty; + NewRenameMinecraftFolderId = string.Empty; + RenameMinecraftFolderPath = string.Empty; + + CanAddMinecraftFolder = true; + RenameFlyoutCanApply = false; } + [ObservableProperty] + [NotifyCanExecuteChangedFor(nameof(AddMinecraftFolderCommand))] + public partial bool CanAddMinecraftFolder { get; set; } + + + [ObservableProperty] + [NotifyCanExecuteChangedFor(nameof(ApplyRenameCommand))] + public partial bool RenameFlyoutCanApply { get; set; } + [ObservableProperty] public partial ObservableCollection MinecraftFoldersList { get; set; } + + [ObservableProperty] + public partial MinecraftFolderEntry? MinecraftFoldersListSelectedItem { get; set; } + + [ObservableProperty] + public partial string OldRenameMinecraftFolderId { get; set; } + + [ObservableProperty] + public partial string NewRenameMinecraftFolderId { get; set; } + + [ObservableProperty] + public partial string RenameMinecraftFolderPath { get; set; } + + [RelayCommand(CanExecute = nameof(CanAddMinecraftFolder), FlowExceptionsToTaskScheduler = true)] + private async Task AddMinecraftFolder(Button parameter) { + CanAddMinecraftFolder = false; + + // Create bew folder picker + FolderPicker folderPicker = new FolderPicker(); + + // Get window handle + var hwnd = WindowNative.GetWindowHandle(App.Current.MainWindow); + InitializeWithWindow.Initialize(folderPicker, hwnd); + + // Show folder picker dialog + StorageFolder folder = await folderPicker.PickSingleFolderAsync(); + + if (folder != null) { + + // Set init folder name + var folderId = "NewFolder"; + + // Add folder to list + MinecraftService.MinecraftFolders.Add(new() { + MinecraftFolderId = folderId, + MinecraftFolderPath = folder.Path + }); + + // Refresh list + MinecraftFoldersList = minecraftCOnfigService.MinecraftFolders.ToObservableCollection(); + + // Set new folder name + OldRenameMinecraftFolderId = folderId; + RenameMinecraftFolderPath = folder.Path; + FlyoutBase.ShowAttachedFlyout(parameter); + } + + CanAddMinecraftFolder = true; + } + + [RelayCommand] + private void OpenMinecraftFolder() { + if (RenameMinecraftFolderPath != null) { + // Open folder + App.GetService().TryOpenFolderFromPath(RenameMinecraftFolderPath); + } + } + + [RelayCommand] + private void SetRenameFlyoutCanApply(TextBox parameter) { + // Check if text is not empty and not equal to old folder name + if (!string.IsNullOrWhiteSpace(parameter.Text) && parameter.Text != OldRenameMinecraftFolderId) { + RenameFlyoutCanApply = true; + return; + } + RenameFlyoutCanApply = false; + } + + [RelayCommand(CanExecute = nameof(RenameFlyoutCanApply))] + private void ApplyRename() { + // Get minecraft folder entry + var minecraftPathEntry = MinecraftService.MinecraftFolders.FirstOrDefault(item => item.MinecraftFolderPath == RenameMinecraftFolderPath); + if (minecraftPathEntry != null) { + // Check if folder with new name already exists + if (MinecraftService.MinecraftFolders.Any(item => item.MinecraftFolderId == NewRenameMinecraftFolderId)) { + //Show tip toast + //TODO: Tip Toast + return; + } + + if (string.IsNullOrWhiteSpace(NewRenameMinecraftFolderId) && NewRenameMinecraftFolderId == OldRenameMinecraftFolderId) { + //TODO tip toast + return; + } + + // Rename folder + minecraftPathEntry.MinecraftFolderId = NewRenameMinecraftFolderId; + + // Refresh list + MinecraftFoldersList = minecraftCOnfigService.MinecraftFolders.ToObservableCollection(); + + // Hide flyout + var message = SendGetValueMessage(MinecraftFolderContentDialogMessengerTokenEnum.RenameFlyoutToken); + message.Response.Hide(); + return; + } + //TODO: Tip Toast + } + + [RelayCommand] + private void HideFlyout(Button parameter) { + //Get Flyout + var message = SendGetValueMessage(MinecraftFolderContentDialogMessengerTokenEnum.RenameFlyoutToken); + + //Hide flyout + message.Response.Hide(); + } + + [RelayCommand] + private void DeleteRenameFlyoutData() { + // Clear data + RenameMinecraftFolderPath = string.Empty; + OldRenameMinecraftFolderId = string.Empty; + NewRenameMinecraftFolderId = string.Empty; + } + + [RelayCommand] + private void SetActiveMinecraftFolder() { + if (MinecraftFoldersListSelectedItem != null) { + MinecraftService.ActiveMinecraftFolderPath = MinecraftFoldersListSelectedItem.MinecraftFolderPath; + } + } + + [RelayCommand] + private void ViewFolderInLocal(string parameter) { + if (!App.GetService().TryOpenFolderFromPath(parameter)) { + // Toast Tip + } + } + + private RequestMessage SendGetValueMessage(Enum tokenEnum) { + return WeakReferenceMessenger.Default.Send(new RequestMessage(), tokenEnum.ToString()); + } } diff --git a/BadMC_Launcher/ViewModels/Pages/MainPageViewModel.cs b/BadMC_Launcher/ViewModels/Pages/MainPageViewModel.cs index 7de4dd6..63837ab 100644 --- a/BadMC_Launcher/ViewModels/Pages/MainPageViewModel.cs +++ b/BadMC_Launcher/ViewModels/Pages/MainPageViewModel.cs @@ -2,7 +2,7 @@ using BadMC_Launcher.Classes; using BadMC_Launcher.Extensions; using BadMC_Launcher.Models.Datas.ViewDatas; -using BadMC_Launcher.Servicess.Settings; +using BadMC_Launcher.Services.Settings; using BadMC_Launcher.Views.Pages; using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Messaging.Messages; @@ -11,7 +11,7 @@ using Microsoft.UI.Xaml.Media.Animation; using Uno.UI.RemoteControl; using BadMC_Launcher.Classes.ViewClasses; -using BadMC_Launcher.Enums.MessengerTokenEnum; +using BadMC_Launcher.Enums; namespace BadMC_Launcher.ViewModels.Pages; @@ -54,39 +54,37 @@ public MainPageViewModel() { public partial Visibility MainSideBarToolVisibility { get; set; } [RelayCommand] - private void MainSideBarFrameNavigated(object parameter) { - if (parameter is Frame frame) { - if (frame.Content == null) { - MainSideBarToolVisibility = Visibility.Collapsed; - } - else { - MainSideBarToolVisibility = Visibility.Visible; - } + private void ChangeToolVisibility(Frame parameter) { + if (parameter.Content == null) { + MainSideBarToolVisibility = Visibility.Collapsed; } - } + else { + MainSideBarToolVisibility = Visibility.Visible; + } + } [RelayCommand] - private void MainSideBarSelectionChanged(object parameter) { - if (parameter is NavigationView mainSideBar && mainSideBar.SelectedItem != null) { - SendInvokeFuncMessage(((MainSideBarItem)mainSideBar.SelectedItem).NavigatePage, MainPageMessengerTokenEnum.FlyoutPageNavigateToken); + private void ShowFlyoutPage(NavigationView parameter) { + if (parameter.SelectedItem != null) { + SendInvokeFuncMessage(((MainSideBarItem)parameter.SelectedItem).NavigatePage, MainPageMessengerTokenEnum.FlyoutPageNavigateToken); } } [RelayCommand(CanExecute = nameof(MainSideBarFrameCanGoBack))] - private void BackButton(Frame parameter) { + private void PageGoBack(Frame parameter) { if (parameter.CanGoBack) { parameter.GoBack(); } } [RelayCommand] - private void CloseButton(Frame parameter) { + private void ClosePage(Frame parameter) { parameter.Content = null; MainSideBarToolVisibility = Visibility.Collapsed; } [RelayCommand] - private void MainSideBarFlyoutClosed() { + private void DeselectItem() { MainSideBarSelectedItem = null; } diff --git a/BadMC_Launcher/ViewModels/Pages/MainSideBar/MainMenuPageViewModel.cs b/BadMC_Launcher/ViewModels/Pages/MainSideBar/MainMenuPageViewModel.cs index ad6fe3c..03df5e4 100644 --- a/BadMC_Launcher/ViewModels/Pages/MainSideBar/MainMenuPageViewModel.cs +++ b/BadMC_Launcher/ViewModels/Pages/MainSideBar/MainMenuPageViewModel.cs @@ -8,7 +8,7 @@ using BadMC_Launcher.Classes; using BadMC_Launcher.Classes.ViewClasses; using BadMC_Launcher.Classes.ViewClasses.MainSearch; -using BadMC_Launcher.Enums.MessengerTokenEnum; +using BadMC_Launcher.Enums; using BadMC_Launcher.Extensions; using BadMC_Launcher.Interfaces; using BadMC_Launcher.Models.Datas.ViewDatas; @@ -53,26 +53,26 @@ public MainMenuPageViewModel() { //TODO: 该写Blog了,还能这样的啊???Σ(っ °Д °;)っ [RelayCommand] - private void MainMenuSearchButtonClicked(AutoSuggestBoxQuerySubmittedEventArgs args) { - MainMenuSearch(args.QueryText); + private void SearchTextChanged_SearchItem(AutoSuggestBoxQuerySubmittedEventArgs e) { + MainMenuSearch(e.QueryText); } [RelayCommand] - private void SearchTextChanged(AutoSuggestBoxTextChangedEventArgs args) { - if (SearchFilterRealTimeToggleIsOn && args.Reason == AutoSuggestionBoxTextChangeReason.UserInput) { + private void SearchButtonClicked_SearchItem(AutoSuggestBoxTextChangedEventArgs e) { + if (SearchFilterRealTimeToggleIsOn && e.Reason == AutoSuggestionBoxTextChangeReason.UserInput) { MainMenuSearch(SearchText); } } [RelayCommand] - private void MainMenuSearchSuggestionChosen(AutoSuggestBoxSuggestionChosenEventArgs args) { - if (args.SelectedItem is MainMenuSearchResultItem selectedItem) { + private void SearchItemNavigateToPage(AutoSuggestBoxSuggestionChosenEventArgs e) { + if (e.SelectedItem is MainMenuSearchResultItem selectedItem) { selectedItem.Navigate.Invoke(); } } [RelayCommand] - private void MainMenuSearchFilterTokenViewSelected(TokenView parameter) { + private void AddSearchFilter(TokenView parameter) { parameter.SelectedItems.ForEach(item => { if (item is IMainMenuSharchFilterItem mainMenuSharchFilterItem) { SearchFilterSelectedItems.Add(mainMenuSharchFilterItem); @@ -81,7 +81,7 @@ private void MainMenuSearchFilterTokenViewSelected(TokenView parameter) { } [RelayCommand] - private void SettingsButtonClicked() { + private void NavigateToSettingsPage() { WeakReferenceMessenger.Default.Send(new ValueChangedMessage(typeof(SettingsDashboardPage)), MainPageMessengerTokenEnum.PageNavigateToken.ToString()); } diff --git a/BadMC_Launcher/ViewModels/Pages/Settings/LaunchSettingsPageViewModel.cs b/BadMC_Launcher/ViewModels/Pages/Settings/LaunchSettingsPageViewModel.cs index 5747c07..5fbf47c 100644 --- a/BadMC_Launcher/ViewModels/Pages/Settings/LaunchSettingsPageViewModel.cs +++ b/BadMC_Launcher/ViewModels/Pages/Settings/LaunchSettingsPageViewModel.cs @@ -1,13 +1,13 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; using BadMC_Launcher.Classes.Minecraft; using BadMC_Launcher.Enums; -using BadMC_Launcher.Enums.MessengerTokenEnum; using BadMC_Launcher.Models.Datas.SettingsDatas; -using BadMC_Launcher.Servicess.Settings; +using BadMC_Launcher.Services.Settings; using BadMC_Launcher.Views.ContentDialogs.Settings; using BadMC_Launcher.Views.Pages.Settings; using CommunityToolkit.Mvvm.Input; @@ -20,13 +20,15 @@ namespace BadMC_Launcher.ViewModels.Pages.Settings; public partial class LaunchSettingsPageViewModel : ObservableObject { private readonly XamlRoot? mainPageXamlRoot; - private MinecraftConfigService service = App.GetService(); + private MinecraftConfigService minecraftService = App.GetService(); public LaunchSettingsPageViewModel() { mainPageXamlRoot = SendGetValueMessage(MainPageMessengerTokenEnum.XamlRootToken).Response; - Java = service.ActiveJavaPath; - MinecraftFolder = service.MinecraftFolders.First(item => item.MinecraftFolderPath == service.ActiveMinecraftFolderPath); - IsAutoMemorySize = service.IsAutoMemorySize; + Java = minecraftService.ActiveJavaPath; + MinecraftFolder = minecraftService.MinecraftFolders.FirstOrDefault(item => item.MinecraftFolderPath == minecraftService.ActiveMinecraftFolderPath); + IsAutoMemorySize = minecraftService.IsAutoMemorySize; + + minecraftService.PropertyChanged += MinecraftConfig_PropertyChanged; } [ObservableProperty] @@ -39,7 +41,7 @@ public LaunchSettingsPageViewModel() { public partial bool IsAutoMemorySize { get; set; } [RelayCommand(FlowExceptionsToTaskScheduler = true)] - private async Task MinecraftFolderSettingsCardClicked() { + private async Task ShowMinecraftFolderManagerDialog() { if (mainPageXamlRoot != null) { var dialog = App.GetService(); dialog.XamlRoot = mainPageXamlRoot; @@ -49,7 +51,7 @@ private async Task MinecraftFolderSettingsCardClicked() { } [RelayCommand(FlowExceptionsToTaskScheduler = true)] - private async Task JavaPathSettingsCardClicked() { + private async Task ShowJavaPathManagerDialog() { if (mainPageXamlRoot != null) { var dialog = App.GetService(); dialog.XamlRoot = mainPageXamlRoot; @@ -59,11 +61,17 @@ private async Task JavaPathSettingsCardClicked() { } [RelayCommand] - private void IsAutoMemorySizeSwitchToggled() { - service.IsAutoMemorySize = IsAutoMemorySize; + private void SetIsAutoMemorySize() { + minecraftService.IsAutoMemorySize = IsAutoMemorySize; } private RequestMessage SendGetValueMessage(Enum tokenEnum) { return WeakReferenceMessenger.Default.Send(new RequestMessage(), tokenEnum.ToString()); } + + private void MinecraftConfig_PropertyChanged(object? sender, PropertyChangedEventArgs e) { + if (e.PropertyName == nameof(minecraftService.ActiveMinecraftFolderPath)) { + MinecraftFolder = minecraftService.MinecraftFolders.FirstOrDefault(item => item.MinecraftFolderPath == minecraftService.ActiveMinecraftFolderPath); + } + } } diff --git a/BadMC_Launcher/ViewModels/Pages/Settings/SettingsDashboardPageViewModel.cs b/BadMC_Launcher/ViewModels/Pages/Settings/SettingsDashboardPageViewModel.cs index 924b3cd..78e97bf 100644 --- a/BadMC_Launcher/ViewModels/Pages/Settings/SettingsDashboardPageViewModel.cs +++ b/BadMC_Launcher/ViewModels/Pages/Settings/SettingsDashboardPageViewModel.cs @@ -6,7 +6,6 @@ using System.Text; using System.Threading.Tasks; using BadMC_Launcher.Classes.ViewClasses; -using BadMC_Launcher.Enums.MessengerTokenEnum; using BadMC_Launcher.Models.Datas.ViewDatas; using BadMC_Launcher.Services.ViewServices; using CommunityToolkit.Mvvm.Input; @@ -31,14 +30,14 @@ public SettingsDashboardPageViewModel() { public partial SettingsSideBarItem? SideBarSelectedItem { get; set; } [RelayCommand] - private void FrameLoaded() { + private void SetInitSelectedItem() { if (SideBarItems.Count > 0) { SideBarSelectedItem = SideBarItems[0]; } } [RelayCommand] - private void SideBarSelectionChanged(Frame parameter) { + private void NavigateToPage(Frame parameter) { if (SideBarSelectedItem != null) { parameter.Navigate(SideBarSelectedItem.NavigatePage); } diff --git a/BadMC_Launcher/ViewModels/UserControls/LaunchPadViewModel.cs b/BadMC_Launcher/ViewModels/UserControls/LaunchPadViewModel.cs index ecff8b2..621ffbc 100644 --- a/BadMC_Launcher/ViewModels/UserControls/LaunchPadViewModel.cs +++ b/BadMC_Launcher/ViewModels/UserControls/LaunchPadViewModel.cs @@ -1,54 +1,54 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Collections.Specialized; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; -using BadMC_Launcher.Servicess.Settings; +using BadMC_Launcher.Classes.Minecraft; +using BadMC_Launcher.Classes.ViewClasses.Minecraft; +using BadMC_Launcher.Enums; +using BadMC_Launcher.Extensions; +using BadMC_Launcher.Services.Settings; +using BadMC_Launcher.Views.ContentDialogs.Settings; using CommunityToolkit.Mvvm.Input; +using CommunityToolkit.Mvvm.Messaging; +using CommunityToolkit.Mvvm.Messaging.Messages; using Microsoft.UI.Xaml.Media.Imaging; using Microsoft.Windows.ApplicationModel.Resources; -using BadMC_Launcher.Classes.Minecraft; -using BadMC_Launcher.Extensions; +using MinecraftLaunch.Base.Models.Game; +using Newtonsoft.Json.Linq; +using Uno.Extensions.Specialized; namespace BadMC_Launcher.ViewModels.UserControls; public partial class LaunchPadViewModel : ObservableObject { - MinecraftConfigService MinecraftService = App.GetService(); - MinecraftFolderEntry? minecraftPathEntry; - ObservableCollection minecraftList = new ObservableCollection(); + MinecraftConfigService minecraftService = App.GetService(); public LaunchPadViewModel() { - //Check Active Minecraft Path - if (MinecraftService.ActiveMinecraftFolderPath != null) { - - //Get Minecraft Entry - minecraftPathEntry = MinecraftService.MinecraftFolders.FirstOrDefault(item => item.MinecraftFolderPath == MinecraftService.ActiveMinecraftFolderPath); - if (minecraftPathEntry != null) { - - //Get Minecraft Items - foreach (var minecraftEntry in minecraftPathEntry.GetMinecrafts()) { - var item = minecraftPathEntry.GetMinecraftItem(minecraftEntry); - if (item != null) - minecraftList.Add(item); - } - MinecraftList = minecraftList; - - - if (minecraftPathEntry.ActiveMinecraftEntryId != null) { - var minecraftItem = minecraftPathEntry.GetMinecraftItem(minecraftPathEntry.ActiveMinecraftEntryId); - if (minecraftItem != null) { - MinecraftListSelectedItem = MinecraftList.FirstOrDefault(item => item.MinecraftId == minecraftItem.MinecraftId); - } - } - MinecraftFolderListSelectedItem = minecraftPathEntry; + MinecraftFolderEntryList = minecraftService.MinecraftFolders; + MinecraftEntryList = new(); + //Check active Minecraft path + if (minecraftService.ActiveMinecraftFolderPath != null) { + //Get active Minecraft path entry + var activeMinecraftPathEntry = MinecraftFolderEntryList.FirstOrDefault(item => item.MinecraftFolderPath == minecraftService.ActiveMinecraftFolderPath); + + if (activeMinecraftPathEntry != null) { + + // Set MinecraftFolderEntryListSelectedItem + MinecraftFolderEntryListSelectedItem = activeMinecraftPathEntry; } } - MinecraftFolderList = new ObservableCollection(MinecraftService.MinecraftFolders); - SetLaunchButtonEntry(); + + minecraftService.PropertyChanged += MinecraftConfig_PropertyChanged; } + //Set CanExecute for ViewLoaclMinecraftFolderCommand + [ObservableProperty] + [NotifyCanExecuteChangedFor(nameof(ViewLoaclMinecraftFolderCommand), nameof(LaunchMinecraftJavaCommand))] + public partial bool IsNotActiveMinecraftEntryEmpty { get; set; } + //LaunchButton Property [ObservableProperty] public partial string? GameEntryName { get; set; } @@ -58,111 +58,128 @@ public LaunchPadViewModel() { //MinecraftsList [ObservableProperty] - public partial ObservableCollection? MinecraftList { get; set; } + public partial ObservableCollection MinecraftEntryList { get; set; } //MinecraftFolderPathsList [ObservableProperty] - public partial ObservableCollection? MinecraftFolderList { get; set; } + public partial ObservableCollection MinecraftFolderEntryList { get; set; } [ObservableProperty] - public partial MinecraftFolderEntry? MinecraftFolderListSelectedItem { get; set; } + public partial MinecraftFolderEntry? MinecraftFolderEntryListSelectedItem { get; set; } [ObservableProperty] - public partial MinecraftItem? MinecraftListSelectedItem { get; set; } + public partial MinecraftEntryItem? MinecraftEntryListSelectedItem { get; set; } [RelayCommand] - public void LaunchButton() { - + public void LaunchMinecraftJava() { + } - //Refresh MinecraftList + //Refresh MinecraftEntryList [RelayCommand] - public void RefreshMinecraftList() { + private void RefreshMinecraftEntryList() { //Get Configs From Json File - MinecraftService.SyncSettingGet(); - minecraftPathEntry = MinecraftService.MinecraftFolders.FirstOrDefault(item => item.MinecraftFolderPath == MinecraftService.ActiveMinecraftFolderPath); - if (MinecraftService.ActiveMinecraftFolderPath != null && minecraftPathEntry != null) { - minecraftPathEntry.GetMinecrafts(); - MinecraftList = minecraftList; - SetLaunchButtonEntry(); - } - } + minecraftService.SyncSettingGet(); + if (MinecraftFolderEntryListSelectedItem != null) { + // Init list + var minecraftEntries = new ObservableCollection(); - [RelayCommand] - public void ViewLoaclMinecraftFolder() { - if (MinecraftService.ActiveMinecraftFolderPath != null) { - try { - using (Process.Start(new ProcessStartInfo(MinecraftService.ActiveMinecraftFolderPath) { - UseShellExecute = true, - Verb = "open" - })) { - - } - } - catch (Exception ex) { - switch (ex) { - case Win32Exception: - //TODO: Dialog - break; - case FileNotFoundException: - //TODO: Dialog - break; - default: - throw; - } - } - } - } + // Get minecraftItems + MinecraftEntryList = MinecraftFolderEntryListSelectedItem.GetMinecraftItems().ToObservableCollection(); - [RelayCommand] - public void MinecraftListSelected(object parameter) { - if (parameter is ListView listView) { - var item = (MinecraftItem)listView.SelectedItem; - if (item != null && MinecraftService.ActiveMinecraftFolderPath != null && minecraftPathEntry != null) { - minecraftPathEntry.ActiveMinecraftEntryId = item.MinecraftId; - SetLaunchButtonEntry(); - } + IsNotActiveMinecraftEntryEmpty = MinecraftEntryListSelectedItem != null; } } - [RelayCommand] - public void MinecraftFoldersListSelected(object parameter) { - if (parameter is ComboBox comboBox) { - var item = (MinecraftFolderEntry)comboBox.SelectedItem; - MinecraftService.ActiveMinecraftFolderPath = item.MinecraftFolderPath; - minecraftPathEntry = MinecraftService.MinecraftFolders.FirstOrDefault(item => item.MinecraftFolderPath == MinecraftService.ActiveMinecraftFolderPath); - if (MinecraftService.ActiveMinecraftFolderPath != null && minecraftPathEntry != null) { - MinecraftList = (ObservableCollection)minecraftPathEntry.GetMinecraftItems(); - if (minecraftPathEntry.ActiveMinecraftEntryId != null) { - MinecraftListSelectedItem = minecraftPathEntry.GetMinecraftItem(minecraftPathEntry.ActiveMinecraftEntryId); - } - } - else { - MinecraftList = null; - } - SetLaunchButtonEntry(); - } - } + [RelayCommand(FlowExceptionsToTaskScheduler = true)] + private async Task OpenMinecraftFoldersManager() { + var mainPageXamlRoot = SendGetValueMessage(MainPageMessengerTokenEnum.XamlRootToken).Response; + if (mainPageXamlRoot != null) { + var dialog = App.GetService(); + dialog.XamlRoot = mainPageXamlRoot; - [RelayCommand] - public void MinecraftEmptyListHyperLink() { - if (MinecraftList != null && !MinecraftList.Any()) { - return; + await dialog.ShowAsync(); } + } + [RelayCommand(CanExecute = nameof(IsNotActiveMinecraftEntryEmpty))] + private void ViewLoaclMinecraftFolder() { + if (MinecraftFolderEntryListSelectedItem != null) { + App.GetService().TryOpenFolderFromPath(MinecraftFolderEntryListSelectedItem.MinecraftFolderPath); + } } - public void SetLaunchButtonEntry() { - if (minecraftPathEntry != null && minecraftPathEntry.ActiveMinecraftEntryId != null) { - var minecraftItem = minecraftPathEntry.GetMinecraftItem(minecraftPathEntry.ActiveMinecraftEntryId); + private void SetLaunchButtonEntry() { + if (MinecraftFolderEntryListSelectedItem != null && MinecraftFolderEntryListSelectedItem.ActiveMinecraftEntryId != null) { + // Get MinecraftItem + var minecraftItem = MinecraftFolderEntryListSelectedItem.GetMinecraftItem(MinecraftFolderEntryListSelectedItem.ActiveMinecraftEntryId); + + // Set GameEntryName and GameEntryImage if (minecraftItem != null) { GameEntryName = minecraftItem.MinecraftId; GameEntryImage = minecraftItem.MinecraftImage; return; } } + + // If MinecraftItem is null, set default values GameEntryName = App.GetService().GetString("LaunchPad_LaunchButtonTagDefaultResource"); GameEntryImage = new BitmapImage() { UriSource = new Uri(@"ms-appx:///Assets/Icons/MinecraftIcons/Drowned.png") }; } + + partial void OnMinecraftFolderEntryListSelectedItemChanged(MinecraftFolderEntry? value) { + if (value != null && MinecraftFolderEntryListSelectedItem != null) { + minecraftService.ActiveMinecraftFolderPath = value.MinecraftFolderPath; + } + + // Get active minecraft path entry + if (value != null && minecraftService.ActiveMinecraftFolderPath != null && MinecraftFolderEntryListSelectedItem != null) { + // Set MinecraftEntryList + MinecraftEntryList = value.GetMinecraftItems().ToObservableCollection(); + + // If ActiveMinecraftEntryId is not null, set ActiveMinecraftEntry + if (value.ActiveMinecraftEntryId != null) { + MinecraftEntryListSelectedItem = MinecraftEntryList.FirstOrDefault(item => item.MinecraftId == value.ActiveMinecraftEntryId); + } + } + + // Init MinecraftEntryList if null + if (MinecraftEntryList == null) { + MinecraftEntryList = new(); + } + + IsNotActiveMinecraftEntryEmpty = MinecraftEntryListSelectedItem != null; + + // Update LaunchBotton Entry + SetLaunchButtonEntry(); + } + + partial void OnMinecraftEntryListSelectedItemChanged(MinecraftEntryItem? value) { + if (value != null && MinecraftFolderEntryListSelectedItem != null) { + MinecraftFolderEntryListSelectedItem.ActiveMinecraftEntryId = value.MinecraftId; + } + + IsNotActiveMinecraftEntryEmpty = value != null; + + // Update LaunchBotton Entry + SetLaunchButtonEntry(); + } + + private void MinecraftConfig_PropertyChanged(object? sender, PropertyChangedEventArgs e) { + + // Update Property + switch (e.PropertyName) { + case nameof(MinecraftConfigService.ActiveMinecraftFolderPath): + if (sender is MinecraftConfigService activeMinecraftFolderPathService) { MinecraftFolderEntryListSelectedItem = MinecraftFolderEntryList.FirstOrDefault(item => item.MinecraftFolderPath == activeMinecraftFolderPathService.ActiveMinecraftFolderPath); } + break; + case nameof(MinecraftConfigService.MinecraftFolders): + if (sender is MinecraftConfigService minecraftFoldersService) { MinecraftFolderEntryList = minecraftFoldersService.MinecraftFolders; } + break; + } + } + + private RequestMessage SendGetValueMessage(Enum tokenEnum) { + return WeakReferenceMessenger.Default.Send(new RequestMessage(), tokenEnum.ToString()); + } } diff --git a/BadMC_Launcher/Views/ContentDialogs/Settings/MinecraftFolderContentDialog.xaml b/BadMC_Launcher/Views/ContentDialogs/Settings/MinecraftFolderContentDialog.xaml index ed95053..45fcbf2 100644 --- a/BadMC_Launcher/Views/ContentDialogs/Settings/MinecraftFolderContentDialog.xaml +++ b/BadMC_Launcher/Views/ContentDialogs/Settings/MinecraftFolderContentDialog.xaml @@ -1,6 +1,7 @@  - + - - - + + + + + + diff --git a/BadMC_Launcher/Views/ContentDialogs/Settings/MinecraftFolderContentDialog.xaml.cs b/BadMC_Launcher/Views/ContentDialogs/Settings/MinecraftFolderContentDialog.xaml.cs index 5a02628..fdeeb2e 100644 --- a/BadMC_Launcher/Views/ContentDialogs/Settings/MinecraftFolderContentDialog.xaml.cs +++ b/BadMC_Launcher/Views/ContentDialogs/Settings/MinecraftFolderContentDialog.xaml.cs @@ -3,8 +3,10 @@ using System.IO; using System.Linq; using System.Runtime.InteropServices.WindowsRuntime; -using Windows.Foundation; -using Windows.Foundation.Collections; +using BadMC_Launcher.Enums; +using BadMC_Launcher.ViewModels.ContentDialogs.Settings; +using CommunityToolkit.Mvvm.Messaging; +using CommunityToolkit.Mvvm.Messaging.Messages; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Controls.Primitives; @@ -12,7 +14,8 @@ using Microsoft.UI.Xaml.Input; using Microsoft.UI.Xaml.Media; using Microsoft.UI.Xaml.Navigation; -using BadMC_Launcher.ViewModels.ContentDialogs.Settings; +using Windows.Foundation; +using Windows.Foundation.Collections; namespace BadMC_Launcher.Views.ContentDialogs.Settings; @@ -21,6 +24,7 @@ public MinecraftFolderContentDialog() { this.InitializeComponent(); DataContext = new MinecraftFolderContentDialogViewModel(); + //Register Messenger + WeakReferenceMessenger.Default.Register, string>(this, MinecraftFolderContentDialogMessengerTokenEnum.RenameFlyoutToken.ToString(), (r, m) => m.Reply(RenameFlyout)); } - } diff --git a/BadMC_Launcher/Views/Pages/MainPage.xaml b/BadMC_Launcher/Views/Pages/MainPage.xaml index 7b0edc5..8b4779b 100644 --- a/BadMC_Launcher/Views/Pages/MainPage.xaml +++ b/BadMC_Launcher/Views/Pages/MainPage.xaml @@ -69,7 +69,7 @@ - + - + @@ -136,8 +136,6 @@ From="0,150,0" To="0" Duration="0:0:0.3" /> - - @@ -180,13 +178,13 @@ - + - + @@ -200,27 +198,27 @@ Spacing="6" Visibility="{Binding MainSideBarToolVisibility}"> - + diff --git a/BadMC_Launcher/Views/Pages/Settings/LaunchSettingsPage.xaml b/BadMC_Launcher/Views/Pages/Settings/LaunchSettingsPage.xaml index 7546831..5a41151 100644 --- a/BadMC_Launcher/Views/Pages/Settings/LaunchSettingsPage.xaml +++ b/BadMC_Launcher/Views/Pages/Settings/LaunchSettingsPage.xaml @@ -4,7 +4,6 @@ xmlns:Interactivity="using:Microsoft.Xaml.Interactivity" xmlns:controls="using:CommunityToolkit.WinUI.Controls" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" - xmlns:local="using:BadMC_Launcher.Views.Pages.Settings.LaunchSettingsPage" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> @@ -17,7 +16,7 @@ @@ -27,12 +26,18 @@ - - - + + + + + @@ -41,7 +46,7 @@ @@ -76,8 +81,8 @@ - @@ -91,7 +96,7 @@ IsOn="{Binding IsAutoMemorySize, Mode=Twoway}"> - + diff --git a/BadMC_Launcher/Views/Pages/Settings/SettingsDashboardPage.xaml b/BadMC_Launcher/Views/Pages/Settings/SettingsDashboardPage.xaml index 6fa77dd..7450dda 100644 --- a/BadMC_Launcher/Views/Pages/Settings/SettingsDashboardPage.xaml +++ b/BadMC_Launcher/Views/Pages/Settings/SettingsDashboardPage.xaml @@ -29,7 +29,7 @@ - + @@ -37,7 +37,7 @@ - + diff --git a/BadMC_Launcher/Views/Pages/Settings/SettingsDashboardPage.xaml.cs b/BadMC_Launcher/Views/Pages/Settings/SettingsDashboardPage.xaml.cs index d36eb92..6e70333 100644 --- a/BadMC_Launcher/Views/Pages/Settings/SettingsDashboardPage.xaml.cs +++ b/BadMC_Launcher/Views/Pages/Settings/SettingsDashboardPage.xaml.cs @@ -3,7 +3,6 @@ using System.IO; using System.Linq; using System.Runtime.InteropServices.WindowsRuntime; -using BadMC_Launcher.Enums.MessengerTokenEnum; using BadMC_Launcher.ViewModels.Pages.Settings; using CommunityToolkit.Mvvm.Messaging; using CommunityToolkit.Mvvm.Messaging.Messages; diff --git a/BadMC_Launcher/Views/Styles/Templates/ItemTemplate/MinecraftFolderItemsTemplate.xaml b/BadMC_Launcher/Views/Styles/Templates/ItemTemplate/MinecraftFolderItemsTemplate.xaml index 30a9954..9a82555 100644 --- a/BadMC_Launcher/Views/Styles/Templates/ItemTemplate/MinecraftFolderItemsTemplate.xaml +++ b/BadMC_Launcher/Views/Styles/Templates/ItemTemplate/MinecraftFolderItemsTemplate.xaml @@ -1,30 +1,96 @@ - + + Text="{Binding MinecraftFolderId}" /> - + - + - + + + + + + + + + + + - + Orientation="Horizontal" + Spacing="8"> + + + + + + + + + + diff --git a/BadMC_Launcher/Views/UserControls/LaunchPad.xaml b/BadMC_Launcher/Views/UserControls/LaunchPad.xaml index f84133a..fc1e371 100644 --- a/BadMC_Launcher/Views/UserControls/LaunchPad.xaml +++ b/BadMC_Launcher/Views/UserControls/LaunchPad.xaml @@ -19,187 +19,184 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + From 9cf30fec408f06aa4e521e524e7f7ca166a1b1d1 Mon Sep 17 00:00:00 2001 From: Starcloudsea <84891987+Starcloudsea@users.noreply.github.com> Date: Tue, 25 Mar 2025 22:46:36 +0800 Subject: [PATCH 07/40] =?UTF-8?q?Mvvm=E6=88=91=E8=A6=81=E6=8A=8A=E4=BD=A0?= =?UTF-8?q?=E5=81=9A=E6=88=90=E9=A6=99=E8=BE=A3=E7=9A=84=EF=BC=81(?= =?UTF-8?q?=E2=81=A0=E2=94=9B=E2=81=A0=E2=9C=A7=E2=81=A0=D0=94=E2=81=A0?= =?UTF-8?q?=E2=9C=A7=E2=81=A0))=E2=81=A0=E2=94=9B=E2=81=A0=E5=BD=A1?= =?UTF-8?q?=E2=81=A0=E2=94=BB=E2=81=A0=E2=94=81=E2=81=A0=E2=94=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BadMC_Launcher/App.xaml | 11 +- BadMC_Launcher/App.xaml.cs | 4 +- BadMC_Launcher/BadMC_Launcher.csproj | 22 +-- .../Classes/Minecraft/MinecraftFolderEntry.cs | 97 ---------- .../ViewClasses => Controls}/MainMenuItem.cs | 4 +- .../MainMenuSearchMinecraftEntryFilter.cs | 5 +- .../MainSearch/MainMenuSearchResultItem.cs | 2 +- .../MainSideBarItem.cs | 7 +- .../Minecraft/MinecraftEntryItem.cs | 5 +- .../Minecraft/MinecraftFolderEntry.cs | 62 +++++++ .../SettingsSideBarItem.cs | 2 +- .../Styles/ButtonStyle.xaml | 1 + .../MinecraftFolderItemsTemplate.xaml | 116 ++++++++++++ .../ItemTemplate/MinecraftItemsTemplate.xaml | 2 +- .../Templates/MainMenuSearchTemplate.xaml | 0 .../Extensions/DistinctiveItemBindingList.cs | 27 +++ .../Extensions/MinecraftEntryExtension.cs | 2 +- .../MinecraftFolderEntryExtension.cs | 5 +- BadMC_Launcher/GlobalUsings.cs | 1 + .../Interfaces/IMainMenuSharchFilterItem.cs | 2 +- BadMC_Launcher/Models/Datas/AppParameters.cs | 2 +- .../Datas/SettingsDatas/MinecraftConfig.cs | 11 +- .../SettingsDatas/SingleMinecraftConfig.cs | 3 +- .../Datas/SettingsDatas/ThemeSetting.cs | 2 +- .../Models/Datas/ViewDatas/MainMenuData.cs | 10 +- .../Models/Datas/ViewDatas/MainSideBarData.cs | 7 +- .../Models/Datas/ViewDatas/SettingsData.cs | 7 +- .../{ => Models}/Enums/BackgroundTypeEnum.cs | 2 +- .../Enums/MainMenuItemSizeEnum.cs | 2 +- .../{ => Models}/Enums/MessengerTokenEnum.cs | 12 +- .../Enums/MinecraftEntryImageEnum.cs | 2 +- .../{ => Models}/Enums/SharechTypeEnum.cs | 2 +- .../{ => Models}/Enums/ThemeTypeEnum.cs | 2 +- BadMC_Launcher/Services/AppAssetsService.cs | 2 +- .../Settings/MinecraftConfigService.cs | 71 +++----- .../Settings/SingleMinecraftConfigService.cs | 15 +- .../Services/Settings/ThemeSettingService.cs | 2 +- .../Services/ViewServices/MainMenuService.cs | 2 +- .../ViewServices/MainSideBarManagerService.cs | 4 +- .../Services/ViewServices/SettingsService.cs | 2 +- BadMC_Launcher/Strings/en-US/Resources.resw | 13 +- BadMC_Launcher/Strings/zh-Hans/Resources.resw | 11 +- .../MinecraftFolderContentDialogViewModel.cs | 120 ++++++------ .../ViewModels/Pages/MainPageViewModel.cs | 8 +- .../MainSideBar/MainMenuPageViewModel.cs | 16 +- .../Settings/LaunchSettingsPageViewModel.cs | 4 +- .../SettingsDashboardPageViewModel.cs | 7 +- .../UserControls/LaunchPadViewModel.cs | 105 +++++------ .../MinecraftFolderContentDialog.xaml | 80 ++++++-- .../MinecraftFolderContentDialog.xaml.cs | 5 +- BadMC_Launcher/Views/Pages/MainPage.xaml | 12 +- BadMC_Launcher/Views/Pages/MainPage.xaml.cs | 2 +- .../Pages/Settings/LaunchSettingsPage.xaml | 171 +++++++++--------- .../MinecraftFolderItemsTemplate.xaml | 96 ---------- .../Views/UserControls/LaunchPad.xaml | 83 +++++++-- Directory.Packages.props | 8 +- 56 files changed, 675 insertions(+), 605 deletions(-) delete mode 100644 BadMC_Launcher/Classes/Minecraft/MinecraftFolderEntry.cs rename BadMC_Launcher/{Classes/ViewClasses => Controls}/MainMenuItem.cs (81%) rename BadMC_Launcher/{Classes/ViewClasses => Controls}/MainSearch/MainMenuSearchMinecraftEntryFilter.cs (92%) rename BadMC_Launcher/{Classes/ViewClasses => Controls}/MainSearch/MainMenuSearchResultItem.cs (95%) rename BadMC_Launcher/{Classes/ViewClasses => Controls}/MainSideBarItem.cs (66%) rename BadMC_Launcher/{Classes/ViewClasses => Controls}/Minecraft/MinecraftEntryItem.cs (86%) create mode 100644 BadMC_Launcher/Controls/Minecraft/MinecraftFolderEntry.cs rename BadMC_Launcher/{Classes/ViewClasses => Controls}/SettingsSideBarItem.cs (89%) rename BadMC_Launcher/{Views => Dictionaries}/Styles/ButtonStyle.xaml (89%) create mode 100644 BadMC_Launcher/Dictionaries/Templates/ItemTemplate/MinecraftFolderItemsTemplate.xaml rename BadMC_Launcher/{Views/Styles => Dictionaries}/Templates/ItemTemplate/MinecraftItemsTemplate.xaml (98%) rename BadMC_Launcher/{Views/Styles => Dictionaries}/Templates/MainMenuSearchTemplate.xaml (100%) create mode 100644 BadMC_Launcher/Extensions/DistinctiveItemBindingList.cs rename BadMC_Launcher/{ => Models}/Enums/BackgroundTypeEnum.cs (84%) rename BadMC_Launcher/{ => Models}/Enums/MainMenuItemSizeEnum.cs (82%) rename BadMC_Launcher/{ => Models}/Enums/MessengerTokenEnum.cs (71%) rename BadMC_Launcher/{ => Models}/Enums/MinecraftEntryImageEnum.cs (88%) rename BadMC_Launcher/{ => Models}/Enums/SharechTypeEnum.cs (79%) rename BadMC_Launcher/{ => Models}/Enums/ThemeTypeEnum.cs (81%) delete mode 100644 BadMC_Launcher/Views/Styles/Templates/ItemTemplate/MinecraftFolderItemsTemplate.xaml diff --git a/BadMC_Launcher/App.xaml b/BadMC_Launcher/App.xaml index a91f150..a97bfe0 100644 --- a/BadMC_Launcher/App.xaml +++ b/BadMC_Launcher/App.xaml @@ -9,15 +9,12 @@ - - - - + + + + - diff --git a/BadMC_Launcher/App.xaml.cs b/BadMC_Launcher/App.xaml.cs index 263efc1..9f40f1f 100644 --- a/BadMC_Launcher/App.xaml.cs +++ b/BadMC_Launcher/App.xaml.cs @@ -1,6 +1,4 @@ using BadMC_Launcher.Classes; -using BadMC_Launcher.Classes.ViewClasses; -using BadMC_Launcher.Classes.ViewClasses.MainSearch; using BadMC_Launcher.Models.Datas; using BadMC_Launcher.Services; using BadMC_Launcher.Services.ViewServices; @@ -16,6 +14,8 @@ using Microsoft.Windows.ApplicationModel.Resources; using Serilog; using Uno.Resizetizer; +using BadMC_Launcher.Controls; +using BadMC_Launcher.Controls.MainSearch; namespace BadMC_Launcher; public partial class App : Application { diff --git a/BadMC_Launcher/BadMC_Launcher.csproj b/BadMC_Launcher/BadMC_Launcher.csproj index 58d3fb5..4cd54ff 100644 --- a/BadMC_Launcher/BadMC_Launcher.csproj +++ b/BadMC_Launcher/BadMC_Launcher.csproj @@ -57,6 +57,7 @@ en-US BadMC_Launcher_TemporaryKey.pfx True + true @@ -94,11 +95,6 @@ - - - - - @@ -111,6 +107,7 @@ + @@ -162,24 +159,9 @@ - - - - - - - - - - - - - - - diff --git a/BadMC_Launcher/Classes/Minecraft/MinecraftFolderEntry.cs b/BadMC_Launcher/Classes/Minecraft/MinecraftFolderEntry.cs deleted file mode 100644 index 1566c4b..0000000 --- a/BadMC_Launcher/Classes/Minecraft/MinecraftFolderEntry.cs +++ /dev/null @@ -1,97 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Linq; -using System.Text; -using System.Text.Json.Serialization; -using System.Threading.Tasks; -using BadMC_Launcher.Extensions; -using BadMC_Launcher.Services.Settings; -using MinecraftLaunch.Base.Models.Game; -using MinecraftLaunch.Components.Parser; -using Uno.Extensions.Specialized; - -namespace BadMC_Launcher.Classes.Minecraft; -public class MinecraftFolderEntry { - private MinecraftParser? minecraftParser; - private string minecraftFolderId = string.Empty; - private string? activeMinecraftEntryId; - private ObservableDataList starredMinecraftIds = new(); - private IEnumerable minecraftList = new List(); - - public MinecraftFolderEntry() { - } - public required string MinecraftFolderId { - get => minecraftFolderId; - set { - minecraftFolderId = value; - - // Trigger Event - OnPropertyChanged(nameof(MinecraftFolderId)); - } - } - - public required string MinecraftFolderPath { get; init; } - - public string? ActiveMinecraftEntryId { - get => activeMinecraftEntryId; - set { - activeMinecraftEntryId = value; - - // Trigger Event - OnPropertyChanged(nameof(ActiveMinecraftEntryId)); - } - } - - public ObservableDataList StarredMinecraftIds { - get => starredMinecraftIds; - set { - starredMinecraftIds = value; - - // Trigger Event - OnPropertyChanged(nameof(StarredMinecraftIds)); - } - } - - public void SetMinecrafts() { - // Get MinecraftParser - minecraftParser = GetMinecraftParser(); - - // Init MinecraftEntryList - minecraftList = new List(); - - // Get MinecraftEntries - minecraftParser.GetMinecrafts().ForEach(item => ((List)minecraftList).Add(item)); - } - - public IEnumerable GetMinecrafts() { - // If MinecraftEntryList is empty, get MinecraftEntries - if (!minecraftList.Any()) { - // Get MinecraftParser - minecraftParser = GetMinecraftParser(); - - // Init MinecraftEntryList - minecraftList = new List(); - - // Get MinecraftEntries - minecraftParser.GetMinecrafts().ForEach(item => ( (List)minecraftList ).Add(item)); - } - return minecraftList; - } - - public MinecraftParser GetMinecraftParser() { - if (minecraftParser == null) { - minecraftParser = new MinecraftParser(MinecraftFolderPath); - } - return minecraftParser; - } - - public event PropertyChangedEventHandler? PropertyChanged; - - protected void OnPropertyChanged(string propertyName) { - // Sync Setting - App.GetService().SyncSettingSet(); - - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); - } -} diff --git a/BadMC_Launcher/Classes/ViewClasses/MainMenuItem.cs b/BadMC_Launcher/Controls/MainMenuItem.cs similarity index 81% rename from BadMC_Launcher/Classes/ViewClasses/MainMenuItem.cs rename to BadMC_Launcher/Controls/MainMenuItem.cs index 2a58e48..25c19f2 100644 --- a/BadMC_Launcher/Classes/ViewClasses/MainMenuItem.cs +++ b/BadMC_Launcher/Controls/MainMenuItem.cs @@ -4,7 +4,7 @@ using System.Text; using System.Threading.Tasks; -namespace BadMC_Launcher.Classes.ViewClasses; +namespace BadMC_Launcher.Controls; public class MainMenuItem { public required string ItemName { get; set; } @@ -12,7 +12,7 @@ public class MainMenuItem { public required FrameworkElement? ItemHeader { get; set; } - public required Brush ItemBrush { get; set; } + public required Brush ItemBackground { get; set; } public required Brush ItemSize { get; set; } diff --git a/BadMC_Launcher/Classes/ViewClasses/MainSearch/MainMenuSearchMinecraftEntryFilter.cs b/BadMC_Launcher/Controls/MainSearch/MainMenuSearchMinecraftEntryFilter.cs similarity index 92% rename from BadMC_Launcher/Classes/ViewClasses/MainSearch/MainMenuSearchMinecraftEntryFilter.cs rename to BadMC_Launcher/Controls/MainSearch/MainMenuSearchMinecraftEntryFilter.cs index f22d12c..8337217 100644 --- a/BadMC_Launcher/Classes/ViewClasses/MainSearch/MainMenuSearchMinecraftEntryFilter.cs +++ b/BadMC_Launcher/Controls/MainSearch/MainMenuSearchMinecraftEntryFilter.cs @@ -3,15 +3,14 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -using BadMC_Launcher.Classes.Minecraft; -using BadMC_Launcher.Classes.ViewClasses.Minecraft; +using BadMC_Launcher.Controls.Minecraft; using BadMC_Launcher.Extensions; using BadMC_Launcher.Interfaces; using BadMC_Launcher.Services.Settings; using MinecraftLaunch.Base.Models.Game; using Uno.Extensions.Specialized; -namespace BadMC_Launcher.Classes.ViewClasses.MainSearch; +namespace BadMC_Launcher.Controls.MainSearch; public class MainMenuSearchMinecraftEntryFilter : IMainMenuSharchFilterItem { public required string ItemName { get; init; } diff --git a/BadMC_Launcher/Classes/ViewClasses/MainSearch/MainMenuSearchResultItem.cs b/BadMC_Launcher/Controls/MainSearch/MainMenuSearchResultItem.cs similarity index 95% rename from BadMC_Launcher/Classes/ViewClasses/MainSearch/MainMenuSearchResultItem.cs rename to BadMC_Launcher/Controls/MainSearch/MainMenuSearchResultItem.cs index 1ac3834..c589d48 100644 --- a/BadMC_Launcher/Classes/ViewClasses/MainSearch/MainMenuSearchResultItem.cs +++ b/BadMC_Launcher/Controls/MainSearch/MainMenuSearchResultItem.cs @@ -5,7 +5,7 @@ using System.Threading.Tasks; using System.Xml.Linq; -namespace BadMC_Launcher.Classes.ViewClasses.MainSearch; +namespace BadMC_Launcher.Controls.MainSearch; public class MainMenuSearchResultItem : IEquatable { public required string ItemTitle { get; init; } diff --git a/BadMC_Launcher/Classes/ViewClasses/MainSideBarItem.cs b/BadMC_Launcher/Controls/MainSideBarItem.cs similarity index 66% rename from BadMC_Launcher/Classes/ViewClasses/MainSideBarItem.cs rename to BadMC_Launcher/Controls/MainSideBarItem.cs index a2c2428..898d884 100644 --- a/BadMC_Launcher/Classes/ViewClasses/MainSideBarItem.cs +++ b/BadMC_Launcher/Controls/MainSideBarItem.cs @@ -6,14 +6,15 @@ using System.Text; using System.Threading.Tasks; -namespace BadMC_Launcher.Classes.ViewClasses; +namespace BadMC_Launcher.Controls; -public class MainSideBarItem { +public partial class MainSideBarItem : ObservableObject { public required string ItemName { get; set; } public required IconElement ItemIcon { get; set; } public required Type NavigatePage { get; set; } - public InfoBadge? ItemInfoBadge { get; set; } + [ObservableProperty] + public partial InfoBadge? ItemInfoBadge { get; set; } } diff --git a/BadMC_Launcher/Classes/ViewClasses/Minecraft/MinecraftEntryItem.cs b/BadMC_Launcher/Controls/Minecraft/MinecraftEntryItem.cs similarity index 86% rename from BadMC_Launcher/Classes/ViewClasses/Minecraft/MinecraftEntryItem.cs rename to BadMC_Launcher/Controls/Minecraft/MinecraftEntryItem.cs index 8f921c2..a3cf0ab 100644 --- a/BadMC_Launcher/Classes/ViewClasses/Minecraft/MinecraftEntryItem.cs +++ b/BadMC_Launcher/Controls/Minecraft/MinecraftEntryItem.cs @@ -7,7 +7,6 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -using BadMC_Launcher.Classes.Minecraft; using BadMC_Launcher.Extensions; using CommunityToolkit.WinUI.Controls; using Microsoft.CodeAnalysis; @@ -16,11 +15,11 @@ using MinecraftLaunch.Components.Parser; using static System.Runtime.InteropServices.JavaScript.JSType; -namespace BadMC_Launcher.Classes.ViewClasses.Minecraft; +namespace BadMC_Launcher.Controls.Minecraft; public class MinecraftEntryItem { public string MinecraftId => MinecraftEntry.Id; - public required MinecraftEntry MinecraftEntry { get; set; } + public required MinecraftEntry MinecraftEntry { get; init; } public required BitmapImage MinecraftImage { get; init; } diff --git a/BadMC_Launcher/Controls/Minecraft/MinecraftFolderEntry.cs b/BadMC_Launcher/Controls/Minecraft/MinecraftFolderEntry.cs new file mode 100644 index 0000000..a7e4622 --- /dev/null +++ b/BadMC_Launcher/Controls/Minecraft/MinecraftFolderEntry.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Text.Json.Serialization; +using System.Threading.Tasks; +using System.Xml.Linq; +using BadMC_Launcher.Extensions; +using BadMC_Launcher.Services.Settings; +using MinecraftLaunch.Base.Models.Game; +using MinecraftLaunch.Components.Parser; +using Uno.Extensions.Specialized; + +namespace BadMC_Launcher.Controls.Minecraft; + +public partial class MinecraftFolderEntry : ObservableObject { + private MinecraftParser? minecraftParser; + private IEnumerable minecraftList = new List(); + + public MinecraftFolderEntry() { + MinecraftFolderId = "NewFolder"; + StarredMinecraftIds = new(); + } + + [ObservableProperty] + public partial string MinecraftFolderId { get; set; } + + public required string MinecraftFolderPath { get; init; } + + [ObservableProperty] + public partial string? ActiveMinecraftEntryId { get; set; } + + [ObservableProperty] + public partial ObservableDataList StarredMinecraftIds { get; set; } + + public void StarMinecraftEntry() { + + } + + public IEnumerable GetMinecrafts() { + // If MinecraftEntryList is empty, get MinecraftEntries + if (!minecraftList.Any()) { + // Get MinecraftParser + minecraftParser = GetMinecraftParser(); + + // Init MinecraftEntryList + minecraftList = new List(); + + // Get MinecraftEntries + minecraftParser.GetMinecrafts().ForEach(item => ( (List)minecraftList ).Add(item)); + } + return minecraftList; + } + + public MinecraftParser GetMinecraftParser() { + if (minecraftParser == null) { + minecraftParser = new MinecraftParser(MinecraftFolderPath); + } + return minecraftParser; + } +} diff --git a/BadMC_Launcher/Classes/ViewClasses/SettingsSideBarItem.cs b/BadMC_Launcher/Controls/SettingsSideBarItem.cs similarity index 89% rename from BadMC_Launcher/Classes/ViewClasses/SettingsSideBarItem.cs rename to BadMC_Launcher/Controls/SettingsSideBarItem.cs index 76a3a9d..57a9a7e 100644 --- a/BadMC_Launcher/Classes/ViewClasses/SettingsSideBarItem.cs +++ b/BadMC_Launcher/Controls/SettingsSideBarItem.cs @@ -4,7 +4,7 @@ using System.Text; using System.Threading.Tasks; -namespace BadMC_Launcher.Classes.ViewClasses; +namespace BadMC_Launcher.Controls; public class SettingsSideBarItem { public required string ItemName { get; set; } diff --git a/BadMC_Launcher/Views/Styles/ButtonStyle.xaml b/BadMC_Launcher/Dictionaries/Styles/ButtonStyle.xaml similarity index 89% rename from BadMC_Launcher/Views/Styles/ButtonStyle.xaml rename to BadMC_Launcher/Dictionaries/Styles/ButtonStyle.xaml index 52934cb..9160bcd 100644 --- a/BadMC_Launcher/Views/Styles/ButtonStyle.xaml +++ b/BadMC_Launcher/Dictionaries/Styles/ButtonStyle.xaml @@ -4,5 +4,6 @@ + diff --git a/BadMC_Launcher/Dictionaries/Templates/ItemTemplate/MinecraftFolderItemsTemplate.xaml b/BadMC_Launcher/Dictionaries/Templates/ItemTemplate/MinecraftFolderItemsTemplate.xaml new file mode 100644 index 0000000..f5bb029 --- /dev/null +++ b/BadMC_Launcher/Dictionaries/Templates/ItemTemplate/MinecraftFolderItemsTemplate.xaml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BadMC_Launcher/Views/Styles/Templates/ItemTemplate/MinecraftItemsTemplate.xaml b/BadMC_Launcher/Dictionaries/Templates/ItemTemplate/MinecraftItemsTemplate.xaml similarity index 98% rename from BadMC_Launcher/Views/Styles/Templates/ItemTemplate/MinecraftItemsTemplate.xaml rename to BadMC_Launcher/Dictionaries/Templates/ItemTemplate/MinecraftItemsTemplate.xaml index c196ee2..f07c38e 100644 --- a/BadMC_Launcher/Views/Styles/Templates/ItemTemplate/MinecraftItemsTemplate.xaml +++ b/BadMC_Launcher/Dictionaries/Templates/ItemTemplate/MinecraftItemsTemplate.xaml @@ -3,7 +3,7 @@ xmlns:Interactivity="using:Microsoft.Xaml.Interactivity" xmlns:controls="using:CommunityToolkit.WinUI.Controls"> - + diff --git a/BadMC_Launcher/Views/Styles/Templates/MainMenuSearchTemplate.xaml b/BadMC_Launcher/Dictionaries/Templates/MainMenuSearchTemplate.xaml similarity index 100% rename from BadMC_Launcher/Views/Styles/Templates/MainMenuSearchTemplate.xaml rename to BadMC_Launcher/Dictionaries/Templates/MainMenuSearchTemplate.xaml diff --git a/BadMC_Launcher/Extensions/DistinctiveItemBindingList.cs b/BadMC_Launcher/Extensions/DistinctiveItemBindingList.cs new file mode 100644 index 0000000..08da118 --- /dev/null +++ b/BadMC_Launcher/Extensions/DistinctiveItemBindingList.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BadMC_Launcher.Extensions; + +public class DistinctiveItemBindingList : BindingList { + public DistinctiveItemBindingList(IList initialData) : base(initialData) { + + } + public DistinctiveItemBindingList() { + + } + protected override void InsertItem(int index, T item) { + if (!Contains(item)) { + base.InsertItem(index, item); + } + } + protected override void SetItem(int index, T item) { + if (!Contains(item)) { + base.SetItem(index, item); + } + } +} diff --git a/BadMC_Launcher/Extensions/MinecraftEntryExtension.cs b/BadMC_Launcher/Extensions/MinecraftEntryExtension.cs index 302f9f8..57a1b2e 100644 --- a/BadMC_Launcher/Extensions/MinecraftEntryExtension.cs +++ b/BadMC_Launcher/Extensions/MinecraftEntryExtension.cs @@ -5,7 +5,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -using BadMC_Launcher.Enums; +using BadMC_Launcher.Models.Enums; using CommunityToolkit.WinUI.Controls; using Microsoft.UI.Xaml.Media.Imaging; using MinecraftLaunch.Base.Enums; diff --git a/BadMC_Launcher/Extensions/MinecraftFolderEntryExtension.cs b/BadMC_Launcher/Extensions/MinecraftFolderEntryExtension.cs index 2dce520..12338d1 100644 --- a/BadMC_Launcher/Extensions/MinecraftFolderEntryExtension.cs +++ b/BadMC_Launcher/Extensions/MinecraftFolderEntryExtension.cs @@ -4,14 +4,13 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -using BadMC_Launcher.Classes.Minecraft; -using BadMC_Launcher.Classes.ViewClasses.Minecraft; -using BadMC_Launcher.Enums; using BadMC_Launcher.Services; +using BadMC_Launcher.Controls.Minecraft; using CommunityToolkit.WinUI.Controls; using Microsoft.UI.Xaml.Media.Imaging; using MinecraftLaunch.Base.Models.Game; using MinecraftLaunch.Components.Parser; +using BadMC_Launcher.Models.Enums; namespace BadMC_Launcher.Extensions; public static class MinecraftFolderEntryExtension { diff --git a/BadMC_Launcher/GlobalUsings.cs b/BadMC_Launcher/GlobalUsings.cs index 0c6b06d..6e5f759 100644 --- a/BadMC_Launcher/GlobalUsings.cs +++ b/BadMC_Launcher/GlobalUsings.cs @@ -4,3 +4,4 @@ global using Microsoft.Extensions.DependencyInjection; global using Microsoft.Extensions.Hosting; global using Microsoft.Extensions.Logging; +global using BadMC_Launcher.Extensions; diff --git a/BadMC_Launcher/Interfaces/IMainMenuSharchFilterItem.cs b/BadMC_Launcher/Interfaces/IMainMenuSharchFilterItem.cs index 6135d24..0eea8ea 100644 --- a/BadMC_Launcher/Interfaces/IMainMenuSharchFilterItem.cs +++ b/BadMC_Launcher/Interfaces/IMainMenuSharchFilterItem.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -using BadMC_Launcher.Classes.ViewClasses.MainSearch; +using BadMC_Launcher.Controls.MainSearch; namespace BadMC_Launcher.Interfaces; diff --git a/BadMC_Launcher/Models/Datas/AppParameters.cs b/BadMC_Launcher/Models/Datas/AppParameters.cs index 0cd52d4..0a3e3ca 100644 --- a/BadMC_Launcher/Models/Datas/AppParameters.cs +++ b/BadMC_Launcher/Models/Datas/AppParameters.cs @@ -15,7 +15,7 @@ namespace BadMC_Launcher.Models.Datas; public static class AppParameters { public readonly static SizeInt32 windowSize = new() { - Width = 948, + Width = 1000, Height = 624 }; } diff --git a/BadMC_Launcher/Models/Datas/SettingsDatas/MinecraftConfig.cs b/BadMC_Launcher/Models/Datas/SettingsDatas/MinecraftConfig.cs index 902a60a..0c39d4d 100644 --- a/BadMC_Launcher/Models/Datas/SettingsDatas/MinecraftConfig.cs +++ b/BadMC_Launcher/Models/Datas/SettingsDatas/MinecraftConfig.cs @@ -7,15 +7,16 @@ using Microsoft.Windows.ApplicationModel.Resources; using MinecraftLaunch.Base.Models.Authentication; using MinecraftLaunch.Base.Models.Game; -using BadMC_Launcher.Classes.Minecraft; +using BadMC_Launcher.Controls.Minecraft; +using System.ComponentModel; namespace BadMC_Launcher.Models.Datas.SettingsDatas; internal static class MinecraftConfig { - internal static ObservableDataList minecraftAccounts = new(); + internal static DistinctiveItemBindingList minecraftAccounts = new(); - internal static ObservableDataList javaPaths = new(); + internal static DistinctiveItemBindingList javaPaths = new(); - internal static ObservableDataList minecraftPaths = new(); + internal static DistinctiveItemBindingList minecraftFolders = new(); internal static JavaEntry? activeJavaPath; @@ -35,5 +36,5 @@ internal static class MinecraftConfig { internal static string? launcherName = App.GetService().GetString("MinecraftConfig_MinecraftTitleNameResource"); - internal static ObservableDataList jvmArguments = new(); + internal static BindingList jvmArguments = new(); } diff --git a/BadMC_Launcher/Models/Datas/SettingsDatas/SingleMinecraftConfig.cs b/BadMC_Launcher/Models/Datas/SettingsDatas/SingleMinecraftConfig.cs index 80ec285..65e46c4 100644 --- a/BadMC_Launcher/Models/Datas/SettingsDatas/SingleMinecraftConfig.cs +++ b/BadMC_Launcher/Models/Datas/SettingsDatas/SingleMinecraftConfig.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -24,5 +25,5 @@ internal class SingleMinecraftConfig { internal string? launcherName; - internal ObservableDataList jvmArguments = new(); + internal BindingList jvmArguments = new(); } diff --git a/BadMC_Launcher/Models/Datas/SettingsDatas/ThemeSetting.cs b/BadMC_Launcher/Models/Datas/SettingsDatas/ThemeSetting.cs index 09ca282..2d0b427 100644 --- a/BadMC_Launcher/Models/Datas/SettingsDatas/ThemeSetting.cs +++ b/BadMC_Launcher/Models/Datas/SettingsDatas/ThemeSetting.cs @@ -3,7 +3,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -using BadMC_Launcher.Enums; +using BadMC_Launcher.Models.Enums; namespace BadMC_Launcher.Models.Datas.SettingsDatas; internal static class ThemeSetting { diff --git a/BadMC_Launcher/Models/Datas/ViewDatas/MainMenuData.cs b/BadMC_Launcher/Models/Datas/ViewDatas/MainMenuData.cs index bb3477b..e3b03a0 100644 --- a/BadMC_Launcher/Models/Datas/ViewDatas/MainMenuData.cs +++ b/BadMC_Launcher/Models/Datas/ViewDatas/MainMenuData.cs @@ -1,17 +1,13 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using BadMC_Launcher.Classes; -using BadMC_Launcher.Classes.ViewClasses; using BadMC_Launcher.Interfaces; +using BadMC_Launcher.Controls; namespace BadMC_Launcher.Models.Datas.ViewDatas; internal static class MainMenuData { - internal static ObservableCollection MainMenuSharchFilterItems { get; set; } = new(); + internal static DistinctiveItemBindingList MainMenuSharchFilterItems { get; set; } = new(); - internal static ObservableCollection MainMenuItems { get; set; } = new(); + internal static DistinctiveItemBindingList MainMenuItems { get; set; } = new(); } diff --git a/BadMC_Launcher/Models/Datas/ViewDatas/MainSideBarData.cs b/BadMC_Launcher/Models/Datas/ViewDatas/MainSideBarData.cs index 2ca83b6..6059ead 100644 --- a/BadMC_Launcher/Models/Datas/ViewDatas/MainSideBarData.cs +++ b/BadMC_Launcher/Models/Datas/ViewDatas/MainSideBarData.cs @@ -5,11 +5,12 @@ using System.Text; using System.Threading.Tasks; using BadMC_Launcher.Classes; -using BadMC_Launcher.Classes.ViewClasses; +using BadMC_Launcher.Controls; +using BadMC_Launcher.Extensions; namespace BadMC_Launcher.Models.Datas.ViewDatas; internal static class MainSideBarData { - internal static ObservableCollection MainSideBarItems { get; set; } = new(); + internal static DistinctiveItemBindingList MainSideBarItems { get; set; } = new(); - internal static ObservableCollection MainSideBarFooterItems { get; set; } = new(); + internal static DistinctiveItemBindingList MainSideBarFooterItems { get; set; } = new(); } diff --git a/BadMC_Launcher/Models/Datas/ViewDatas/SettingsData.cs b/BadMC_Launcher/Models/Datas/ViewDatas/SettingsData.cs index b45cf92..9912d52 100644 --- a/BadMC_Launcher/Models/Datas/ViewDatas/SettingsData.cs +++ b/BadMC_Launcher/Models/Datas/ViewDatas/SettingsData.cs @@ -4,12 +4,13 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -using BadMC_Launcher.Classes.ViewClasses; +using BadMC_Launcher.Controls; + namespace BadMC_Launcher.Models.Datas.ViewDatas; internal static class SettingsData { - internal static ObservableCollection SettingsSideBarItems { get; set; } = new(); + internal static DistinctiveItemBindingList SettingsSideBarItems { get; set; } = new(); - internal static ObservableCollection SettingsSideBarFooterItems { get; set; } = new(); + internal static DistinctiveItemBindingList SettingsSideBarFooterItems { get; set; } = new(); } diff --git a/BadMC_Launcher/Enums/BackgroundTypeEnum.cs b/BadMC_Launcher/Models/Enums/BackgroundTypeEnum.cs similarity index 84% rename from BadMC_Launcher/Enums/BackgroundTypeEnum.cs rename to BadMC_Launcher/Models/Enums/BackgroundTypeEnum.cs index 6aa4547..d902899 100644 --- a/BadMC_Launcher/Enums/BackgroundTypeEnum.cs +++ b/BadMC_Launcher/Models/Enums/BackgroundTypeEnum.cs @@ -4,7 +4,7 @@ using System.Text; using System.Threading.Tasks; -namespace BadMC_Launcher.Enums; +namespace BadMC_Launcher.Models.Enums; public enum BackgroundTypeEnum { SolidColor, StaticImage, diff --git a/BadMC_Launcher/Enums/MainMenuItemSizeEnum.cs b/BadMC_Launcher/Models/Enums/MainMenuItemSizeEnum.cs similarity index 82% rename from BadMC_Launcher/Enums/MainMenuItemSizeEnum.cs rename to BadMC_Launcher/Models/Enums/MainMenuItemSizeEnum.cs index 41646fe..07fa8da 100644 --- a/BadMC_Launcher/Enums/MainMenuItemSizeEnum.cs +++ b/BadMC_Launcher/Models/Enums/MainMenuItemSizeEnum.cs @@ -4,7 +4,7 @@ using System.Text; using System.Threading.Tasks; -namespace BadMC_Launcher.Enums; +namespace BadMC_Launcher.Models.Enums; public enum MainMenuItemSizeEnum { Small, diff --git a/BadMC_Launcher/Enums/MessengerTokenEnum.cs b/BadMC_Launcher/Models/Enums/MessengerTokenEnum.cs similarity index 71% rename from BadMC_Launcher/Enums/MessengerTokenEnum.cs rename to BadMC_Launcher/Models/Enums/MessengerTokenEnum.cs index 566bdff..042a072 100644 --- a/BadMC_Launcher/Enums/MessengerTokenEnum.cs +++ b/BadMC_Launcher/Models/Enums/MessengerTokenEnum.cs @@ -4,7 +4,7 @@ using System.Text; using System.Threading.Tasks; -namespace BadMC_Launcher.Enums; +namespace BadMC_Launcher.Models.Enums; public enum MainPageMessengerTokenEnum { //Func Token PageNavigateToken, @@ -17,11 +17,7 @@ public enum MainPageMessengerTokenEnum { } public enum MinecraftFolderContentDialogMessengerTokenEnum { - //GetValue Token - RenameFlyoutToken, -} - - -public enum MinecraftConfigMessengerTokenEnum { - ActiveMinecraftFolder + //Func Token + HideRenameFlyoutToken, + ShowRenameFlyoutToken } diff --git a/BadMC_Launcher/Enums/MinecraftEntryImageEnum.cs b/BadMC_Launcher/Models/Enums/MinecraftEntryImageEnum.cs similarity index 88% rename from BadMC_Launcher/Enums/MinecraftEntryImageEnum.cs rename to BadMC_Launcher/Models/Enums/MinecraftEntryImageEnum.cs index f5613cb..f01e28b 100644 --- a/BadMC_Launcher/Enums/MinecraftEntryImageEnum.cs +++ b/BadMC_Launcher/Models/Enums/MinecraftEntryImageEnum.cs @@ -4,7 +4,7 @@ using System.Text; using System.Threading.Tasks; -namespace BadMC_Launcher.Enums; +namespace BadMC_Launcher.Models.Enums; public enum MinecraftEntryImageEnum { Creeper, Drowned, diff --git a/BadMC_Launcher/Enums/SharechTypeEnum.cs b/BadMC_Launcher/Models/Enums/SharechTypeEnum.cs similarity index 79% rename from BadMC_Launcher/Enums/SharechTypeEnum.cs rename to BadMC_Launcher/Models/Enums/SharechTypeEnum.cs index d7a18eb..2e26d1e 100644 --- a/BadMC_Launcher/Enums/SharechTypeEnum.cs +++ b/BadMC_Launcher/Models/Enums/SharechTypeEnum.cs @@ -4,7 +4,7 @@ using System.Text; using System.Threading.Tasks; -namespace BadMC_Launcher.Enums; +namespace BadMC_Launcher.Models.Enums; public enum SharechTypeEnum { } diff --git a/BadMC_Launcher/Enums/ThemeTypeEnum.cs b/BadMC_Launcher/Models/Enums/ThemeTypeEnum.cs similarity index 81% rename from BadMC_Launcher/Enums/ThemeTypeEnum.cs rename to BadMC_Launcher/Models/Enums/ThemeTypeEnum.cs index 85a3307..2396235 100644 --- a/BadMC_Launcher/Enums/ThemeTypeEnum.cs +++ b/BadMC_Launcher/Models/Enums/ThemeTypeEnum.cs @@ -4,7 +4,7 @@ using System.Text; using System.Threading.Tasks; -namespace BadMC_Launcher.Enums; +namespace BadMC_Launcher.Models.Enums; public enum ThemeTypeEnum { Light, Dark diff --git a/BadMC_Launcher/Services/AppAssetsService.cs b/BadMC_Launcher/Services/AppAssetsService.cs index 4a57174..4e1a542 100644 --- a/BadMC_Launcher/Services/AppAssetsService.cs +++ b/BadMC_Launcher/Services/AppAssetsService.cs @@ -3,7 +3,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -using BadMC_Launcher.Enums; +using BadMC_Launcher.Models.Enums; using Microsoft.UI.Xaml.Media.Imaging; namespace BadMC_Launcher.Services; diff --git a/BadMC_Launcher/Services/Settings/MinecraftConfigService.cs b/BadMC_Launcher/Services/Settings/MinecraftConfigService.cs index 39db78f..46eba70 100644 --- a/BadMC_Launcher/Services/Settings/MinecraftConfigService.cs +++ b/BadMC_Launcher/Services/Settings/MinecraftConfigService.cs @@ -1,29 +1,12 @@ -using System; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.Linq; -using System.Reflection.Metadata; -using System.Reflection; -using System.Text; -using System.Text.Json; -using System.Threading.Tasks; using MinecraftLaunch.Base.Models.Authentication; -using Newtonsoft.Json.Linq; using MinecraftLaunch.Base.Models.Game; -using Microsoft.Windows.ApplicationModel.Resources; using System.Text.Json.Serialization; -using System.Text.Json.Serialization.Metadata; -using CommunityToolkit.Mvvm.Messaging.Messages; -using CommunityToolkit.Mvvm.Messaging; -using NbtToolkit; -using System.Xml.Linq; using System.ComponentModel; using BadMC_Launcher.Models.Datas.SettingsDatas; -using BadMC_Launcher.Extensions; -using BadMC_Launcher.Classes.Minecraft; using BadMC_Launcher.Models.Datas; using BadMC_Launcher.Models.Datas.Mappings; using BadMC_Launcher.Classes; +using BadMC_Launcher.Controls.Minecraft; namespace BadMC_Launcher.Services.Settings; public class MinecraftConfigService : ConfigClass { @@ -31,45 +14,39 @@ public class MinecraftConfigService : ConfigClass { public MinecraftConfigService() { //Triggers an event when a property is changed - if (MinecraftAccounts != null) { MinecraftAccounts.CollectionChanged += OnCollectionChanged; } - if (JavaPaths != null) { JavaPaths.CollectionChanged += OnCollectionChanged; } - if (MinecraftFolders != null) { MinecraftFolders.CollectionChanged += OnCollectionChanged; } - if (JvmArguments != null) { JvmArguments.CollectionChanged += OnCollectionChanged; } + MinecraftConfig.minecraftAccounts.ListChanged += OnListChanged; + MinecraftConfig.javaPaths.ListChanged += OnListChanged; + MinecraftConfig.minecraftFolders.ListChanged += OnListChanged; + MinecraftConfig.jvmArguments.ListChanged += OnListChanged; } - public ObservableDataList MinecraftAccounts { + public DistinctiveItemBindingList MinecraftAccounts { get => MinecraftConfig.minecraftAccounts; set { - MinecraftConfig.minecraftAccounts = value; - - // Trigger Event - OnPropertyChanged(nameof(MinecraftAccounts)); + MinecraftConfig.minecraftAccounts.Clear(); + MinecraftConfig.minecraftAccounts.AddRange(value); // Write to Json SyncSettingSet(); } } - public ObservableDataList JavaPaths { + public DistinctiveItemBindingList JavaPaths { get => MinecraftConfig.javaPaths; set { - MinecraftConfig.javaPaths = value; - - // Trigger Event - OnPropertyChanged(nameof(JavaPaths)); + MinecraftConfig.javaPaths.Clear(); + MinecraftConfig.javaPaths.AddRange(value); - //Write to Json + // Write to Json SyncSettingSet(); } } - public ObservableDataList MinecraftFolders { - get => MinecraftConfig.minecraftPaths; + public DistinctiveItemBindingList MinecraftFolders { + get => MinecraftConfig.minecraftFolders; set { - MinecraftConfig.minecraftPaths = value; + MinecraftConfig.minecraftFolders.Clear(); + MinecraftConfig.minecraftFolders.AddRange(value); - // Trigger Event - OnPropertyChanged(nameof(MinecraftFolders)); - - //Write to Json + // Write to Json SyncSettingSet(); } } @@ -191,20 +168,18 @@ public string? LauncherName { } } - public ObservableDataList JvmArguments { + public BindingList JvmArguments { get => MinecraftConfig.jvmArguments; set { - MinecraftConfig.jvmArguments = value; + MinecraftConfig.jvmArguments.Clear(); + MinecraftConfig.jvmArguments.AddRange(value); - // Trigger Event - OnPropertyChanged(nameof(JvmArguments)); - - //Write to Json + // Write to Json SyncSettingSet(); } } - private void OnCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e) { + private void OnListChanged(object? sender, ListChangedEventArgs e) { if (!SyncSettingSet()) { //TODO: Dialog } @@ -215,7 +190,7 @@ public override bool SyncSettingGet() { //TODO: 解蜜 MinecraftConfig.minecraftAccounts = jsonClass.MinecraftAccounts; MinecraftConfig.javaPaths = jsonClass.JavaPaths; - MinecraftConfig.minecraftPaths = jsonClass.MinecraftFolders; + MinecraftConfig.minecraftFolders = jsonClass.MinecraftFolders; MinecraftConfig.activeJavaPath = jsonClass.ActiveJavaPath; MinecraftConfig.activeMinecraftFolder = jsonClass.ActiveMinecraftFolderPath; MinecraftConfig.activeMinecraftAccount = jsonClass.ActiveMinecraftAccount; diff --git a/BadMC_Launcher/Services/Settings/SingleMinecraftConfigService.cs b/BadMC_Launcher/Services/Settings/SingleMinecraftConfigService.cs index 3625da3..62a0ae0 100644 --- a/BadMC_Launcher/Services/Settings/SingleMinecraftConfigService.cs +++ b/BadMC_Launcher/Services/Settings/SingleMinecraftConfigService.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Collections.Specialized; +using System.ComponentModel; using System.Linq; using System.Text; using System.Text.Json.Serialization; @@ -15,7 +16,7 @@ public class SingleMinecraftConfigService : ConfigClass { private SingleMinecraftConfig singleMinecraftConfigInstance = new(); public SingleMinecraftConfigService() { - JvmArguments.CollectionChanged += OnCollectionChanged; + JvmArguments.ListChanged += OnListChanged; } public string? TargetMinecraftEntryPath { @@ -122,20 +123,18 @@ public string? LauncherName { } } - public ObservableDataList JvmArguments { + public BindingList JvmArguments { get => singleMinecraftConfigInstance.jvmArguments; set { - singleMinecraftConfigInstance.jvmArguments = value; + singleMinecraftConfigInstance.jvmArguments.Clear(); + singleMinecraftConfigInstance.jvmArguments.AddRange(value); - // Trigger Event - OnPropertyChanged(nameof(JvmArguments)); - - //Write to Json + // Write to Json SyncSettingSet(); } } - private void OnCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e) { + private void OnListChanged(object? sender, ListChangedEventArgs e) { if (!SyncSettingSet()) { //TODO: Dialog diff --git a/BadMC_Launcher/Services/Settings/ThemeSettingService.cs b/BadMC_Launcher/Services/Settings/ThemeSettingService.cs index ce93511..35fc6d5 100644 --- a/BadMC_Launcher/Services/Settings/ThemeSettingService.cs +++ b/BadMC_Launcher/Services/Settings/ThemeSettingService.cs @@ -7,9 +7,9 @@ using System.Text.Json; using System.Text.Json.Serialization; using BadMC_Launcher.Classes; -using BadMC_Launcher.Enums; using BadMC_Launcher.Models.Datas; using BadMC_Launcher.Models.Datas.SettingsDatas; +using BadMC_Launcher.Models.Enums; using CommunityToolkit.Mvvm.Messaging; using CommunityToolkit.Mvvm.Messaging.Messages; using Microsoft.UI.Xaml.Media.Imaging; diff --git a/BadMC_Launcher/Services/ViewServices/MainMenuService.cs b/BadMC_Launcher/Services/ViewServices/MainMenuService.cs index 58e6a86..644fb42 100644 --- a/BadMC_Launcher/Services/ViewServices/MainMenuService.cs +++ b/BadMC_Launcher/Services/ViewServices/MainMenuService.cs @@ -4,9 +4,9 @@ using System.Text; using System.Threading.Tasks; using BadMC_Launcher.Classes; -using BadMC_Launcher.Classes.ViewClasses; using BadMC_Launcher.Interfaces; using BadMC_Launcher.Models.Datas.ViewDatas; +using BadMC_Launcher.Controls; namespace BadMC_Launcher.Services.ViewServices; diff --git a/BadMC_Launcher/Services/ViewServices/MainSideBarManagerService.cs b/BadMC_Launcher/Services/ViewServices/MainSideBarManagerService.cs index e7ad697..19c56ef 100644 --- a/BadMC_Launcher/Services/ViewServices/MainSideBarManagerService.cs +++ b/BadMC_Launcher/Services/ViewServices/MainSideBarManagerService.cs @@ -12,8 +12,8 @@ using CommunityToolkit.Mvvm.Messaging.Messages; using CommunityToolkit.Mvvm.Messaging; using Newtonsoft.Json.Linq; -using BadMC_Launcher.Classes.ViewClasses; -using BadMC_Launcher.Enums; +using BadMC_Launcher.Controls; +using BadMC_Launcher.Models.Enums; namespace BadMC_Launcher.Services.ViewServices; public class MainSideBarManagerService { diff --git a/BadMC_Launcher/Services/ViewServices/SettingsService.cs b/BadMC_Launcher/Services/ViewServices/SettingsService.cs index 1af0c7a..c6d160d 100644 --- a/BadMC_Launcher/Services/ViewServices/SettingsService.cs +++ b/BadMC_Launcher/Services/ViewServices/SettingsService.cs @@ -3,8 +3,8 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -using BadMC_Launcher.Classes.ViewClasses; using BadMC_Launcher.Models.Datas.ViewDatas; +using BadMC_Launcher.Controls; namespace BadMC_Launcher.Services.ViewServices; diff --git a/BadMC_Launcher/Strings/en-US/Resources.resw b/BadMC_Launcher/Strings/en-US/Resources.resw index 3e9d7f8..40a40f4 100644 --- a/BadMC_Launcher/Strings/en-US/Resources.resw +++ b/BadMC_Launcher/Strings/en-US/Resources.resw @@ -1,4 +1,4 @@ - + - - + + + + + + + + + + + + + + - - - + + + + + + + + + + + - + @@ -58,12 +97,20 @@ Orientation="Horizontal" Spacing="8"> - - @@ -72,7 +119,6 @@ Orientation="Horizontal" Spacing="8"> - @@ -80,12 +126,12 @@ + ItemsSource="{Binding MinecraftFoldersList}" + SelectedItem="{Binding MinecraftFoldersListSelectedItem, Mode=TwoWay}"> - + diff --git a/BadMC_Launcher/Views/ContentDialogs/Settings/MinecraftFolderContentDialog.xaml.cs b/BadMC_Launcher/Views/ContentDialogs/Settings/MinecraftFolderContentDialog.xaml.cs index fdeeb2e..62378af 100644 --- a/BadMC_Launcher/Views/ContentDialogs/Settings/MinecraftFolderContentDialog.xaml.cs +++ b/BadMC_Launcher/Views/ContentDialogs/Settings/MinecraftFolderContentDialog.xaml.cs @@ -3,7 +3,7 @@ using System.IO; using System.Linq; using System.Runtime.InteropServices.WindowsRuntime; -using BadMC_Launcher.Enums; +using BadMC_Launcher.Models.Enums; using BadMC_Launcher.ViewModels.ContentDialogs.Settings; using CommunityToolkit.Mvvm.Messaging; using CommunityToolkit.Mvvm.Messaging.Messages; @@ -25,6 +25,7 @@ public MinecraftFolderContentDialog() { DataContext = new MinecraftFolderContentDialogViewModel(); //Register Messenger - WeakReferenceMessenger.Default.Register, string>(this, MinecraftFolderContentDialogMessengerTokenEnum.RenameFlyoutToken.ToString(), (r, m) => m.Reply(RenameFlyout)); + WeakReferenceMessenger.Default.Register, string>(this, MinecraftFolderContentDialogMessengerTokenEnum.ShowRenameFlyoutToken.ToString(), (r, m) => FlyoutBase.ShowAttachedFlyout(AddMinecraftFolderButton)); + WeakReferenceMessenger.Default.Register, string>(this, MinecraftFolderContentDialogMessengerTokenEnum.HideRenameFlyoutToken.ToString(), (r, m) => RenameFlyout.Hide()); } } diff --git a/BadMC_Launcher/Views/Pages/MainPage.xaml b/BadMC_Launcher/Views/Pages/MainPage.xaml index 8b4779b..8df60fa 100644 --- a/BadMC_Launcher/Views/Pages/MainPage.xaml +++ b/BadMC_Launcher/Views/Pages/MainPage.xaml @@ -116,10 +116,18 @@ + + + + - + @@ -200,8 +208,8 @@ - - - + + + + - - - - - - - - - + + + + + + + + + - + + - - - - - - + + + + + + + + + - - - - - - - - - + + + + + - - - - - + + + + + + - - - - - - + + + + + + + + - - - - - - - - + + + + + - - - - - + + + + + + + + - - - - - - - - + - + + - diff --git a/BadMC_Launcher/Views/Styles/Templates/ItemTemplate/MinecraftFolderItemsTemplate.xaml b/BadMC_Launcher/Views/Styles/Templates/ItemTemplate/MinecraftFolderItemsTemplate.xaml deleted file mode 100644 index 9a82555..0000000 --- a/BadMC_Launcher/Views/Styles/Templates/ItemTemplate/MinecraftFolderItemsTemplate.xaml +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/BadMC_Launcher/Views/UserControls/LaunchPad.xaml b/BadMC_Launcher/Views/UserControls/LaunchPad.xaml index fc1e371..10f8932 100644 --- a/BadMC_Launcher/Views/UserControls/LaunchPad.xaml +++ b/BadMC_Launcher/Views/UserControls/LaunchPad.xaml @@ -3,6 +3,7 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Interactivity="using:Microsoft.Xaml.Interactivity" xmlns:animatedvisuals="using:Microsoft.UI.Xaml.Controls.AnimatedVisuals" + xmlns:converters="using:CommunityToolkit.WinUI.Converters" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="using:BadMC_Launcher.Views.UserControls" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" @@ -10,6 +11,11 @@ d:DesignHeight="300" d:DesignWidth="400" mc:Ignorable="d"> + + + @@ -35,34 +41,60 @@ BorderThickness="0" Command="{Binding LaunchMinecraftJavaCommand}" CornerRadius="0" - Style="{StaticResource AccentButtonStyle}"> + Style="{StaticResource AccentButtonStyle}" + ToolTipService.ToolTip="{Binding LaunchButtonMinecraftId}"> - + - - - - + CornerRadius="8" /> + - + + + + + + + + + + + + + + + + + + + + + @@ -129,16 +161,23 @@ - + + + + + + + + @@ -161,14 +200,14 @@ + - + + + + + + + + + diff --git a/Directory.Packages.props b/Directory.Packages.props index a4b1244..cc3663c 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -8,7 +8,7 @@ - + @@ -20,16 +20,16 @@ - + - + - + \ No newline at end of file From fb16cf83778c098996e5678f28142df744dce576 Mon Sep 17 00:00:00 2001 From: Starcloudsea <84891987+Starcloudsea@users.noreply.github.com> Date: Tue, 1 Apr 2025 18:12:26 +0800 Subject: [PATCH 08/40] =?UTF-8?q?Bug=E6=94=B9=E7=96=AF=E4=BA=86.png?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controls/Minecraft/MinecraftEntryItem.cs | 34 +++++ .../Minecraft/MinecraftFolderEntry.cs | 46 +++--- .../Extensions/DistinctiveItemBindingList.cs | 19 +++ .../Extensions/IEnumerableExtension.cs | 22 +++ .../MinecraftFolderEntryExtension.cs | 2 +- BadMC_Launcher/GlobalUsings.cs | 1 + BadMC_Launcher/Models/Datas/AppParameters.cs | 2 +- .../Datas/SettingsDatas/MinecraftConfig.cs | 9 +- .../Datas/SettingsDatas/ThemeSetting.cs | 2 +- .../Settings/MinecraftConfigService.cs | 35 ++++- BadMC_Launcher/Strings/en-US/Resources.resw | 27 +++- BadMC_Launcher/Strings/zh-Hans/Resources.resw | 27 +++- .../MinecraftFolderContentDialogViewModel.cs | 90 +++++++----- .../Settings/LaunchSettingsPageViewModel.cs | 47 +++++- .../UserControls/LaunchPadViewModel.cs | 137 ++++++++++++------ .../MinecraftFolderContentDialog.xaml | 42 +++++- .../Pages/Settings/LaunchSettingsPage.xaml | 33 +++-- .../Views/UserControls/LaunchPad.xaml | 105 +++++--------- 18 files changed, 470 insertions(+), 210 deletions(-) create mode 100644 BadMC_Launcher/Extensions/IEnumerableExtension.cs diff --git a/BadMC_Launcher/Controls/Minecraft/MinecraftEntryItem.cs b/BadMC_Launcher/Controls/Minecraft/MinecraftEntryItem.cs index a3cf0ab..add94dc 100644 --- a/BadMC_Launcher/Controls/Minecraft/MinecraftEntryItem.cs +++ b/BadMC_Launcher/Controls/Minecraft/MinecraftEntryItem.cs @@ -32,4 +32,38 @@ public void SetIsStarredEvent(object? sender, NotifyCollectionChangedEventArgs e IsStarred = folderEntry.IndexOf(MinecraftId) >= 0; } } + + public static bool operator ==(MinecraftEntryItem? left, MinecraftEntryItem? right) { + return left is not null && right is not null ? + left.MinecraftId == right.MinecraftId && + left.MinecraftTags == right.MinecraftTags : + ReferenceEquals(left, right); + } + + public static bool operator !=(MinecraftEntryItem? left, MinecraftEntryItem? right) { + return left is not null && right is not null + ? + left.MinecraftId != right.MinecraftId && + left.MinecraftTags != right.MinecraftTags : + !ReferenceEquals(left, right); + } + + public override bool Equals(object? obj) { + if (obj is MinecraftEntryItem entryItem) { + if (ReferenceEquals(this.MinecraftId, entryItem.MinecraftId)) { + return true; + } + + if (!ReferenceEquals(this.MinecraftId, entryItem.MinecraftId)) { + return false; + } + } + throw new NotImplementedException(); + } + + public override int GetHashCode() { + // HashCode.Combine generates a hash code by combining the hash codes of the provided fields. + // This ensures that the hash code is unique based on the values of these fields. + return HashCode.Combine(MinecraftId, MinecraftImage, MinecraftTags); + } } diff --git a/BadMC_Launcher/Controls/Minecraft/MinecraftFolderEntry.cs b/BadMC_Launcher/Controls/Minecraft/MinecraftFolderEntry.cs index a7e4622..f64b7d3 100644 --- a/BadMC_Launcher/Controls/Minecraft/MinecraftFolderEntry.cs +++ b/BadMC_Launcher/Controls/Minecraft/MinecraftFolderEntry.cs @@ -15,48 +15,58 @@ namespace BadMC_Launcher.Controls.Minecraft; public partial class MinecraftFolderEntry : ObservableObject { - private MinecraftParser? minecraftParser; - private IEnumerable minecraftList = new List(); public MinecraftFolderEntry() { MinecraftFolderId = "NewFolder"; StarredMinecraftIds = new(); } + public event PropertyChangedEventHandler? ActiveMinecraftEntryIdChanged; + [ObservableProperty] public partial string MinecraftFolderId { get; set; } public required string MinecraftFolderPath { get; init; } + [IgnoreListChanged] [ObservableProperty] public partial string? ActiveMinecraftEntryId { get; set; } [ObservableProperty] public partial ObservableDataList StarredMinecraftIds { get; set; } - public void StarMinecraftEntry() { + public MinecraftParser GetMinecraftParser() => new MinecraftParser(MinecraftFolderPath); + + public IEnumerable GetMinecrafts() => GetMinecraftParser().GetMinecrafts(); + public static bool operator ==(MinecraftFolderEntry? left, MinecraftFolderEntry? right) { + return left is not null && right is not null ? + left.MinecraftFolderPath == right.MinecraftFolderPath : + ReferenceEquals(left, right); } - public IEnumerable GetMinecrafts() { - // If MinecraftEntryList is empty, get MinecraftEntries - if (!minecraftList.Any()) { - // Get MinecraftParser - minecraftParser = GetMinecraftParser(); + public static bool operator !=(MinecraftFolderEntry? left, MinecraftFolderEntry? right) { + return left is not null && right is not null ? + left.MinecraftFolderPath != right.MinecraftFolderPath : + !ReferenceEquals(left, right); + } - // Init MinecraftEntryList - minecraftList = new List(); + public override bool Equals(object? obj) { - // Get MinecraftEntries - minecraftParser.GetMinecrafts().ForEach(item => ( (List)minecraftList ).Add(item)); + if (obj is MinecraftFolderEntry folderEntry) { + return this.MinecraftFolderPath == folderEntry.MinecraftFolderPath; } - return minecraftList; + return false; } - public MinecraftParser GetMinecraftParser() { - if (minecraftParser == null) { - minecraftParser = new MinecraftParser(MinecraftFolderPath); - } - return minecraftParser; + partial void OnActiveMinecraftEntryIdChanged(string? value) { + ActiveMinecraftEntryIdChanged?.Invoke(this.ActiveMinecraftEntryId, new PropertyChangedEventArgs(nameof(ActiveMinecraftEntryId))); + App.GetService().SyncSettingSet(); + } + + public override int GetHashCode() { + // HashCode.Combine generates a hash code by combining the hash codes of the provided fields. + // This ensures that the hash code is unique based on the values of these fields. + return HashCode.Combine(MinecraftFolderPath); } } diff --git a/BadMC_Launcher/Extensions/DistinctiveItemBindingList.cs b/BadMC_Launcher/Extensions/DistinctiveItemBindingList.cs index 08da118..ac3dd6f 100644 --- a/BadMC_Launcher/Extensions/DistinctiveItemBindingList.cs +++ b/BadMC_Launcher/Extensions/DistinctiveItemBindingList.cs @@ -1,12 +1,16 @@ using System; using System.Collections.Generic; +using System.Collections.Specialized; using System.ComponentModel; using System.Linq; +using System.Reflection; using System.Text; using System.Threading.Tasks; +using Newtonsoft.Json.Linq; namespace BadMC_Launcher.Extensions; + public class DistinctiveItemBindingList : BindingList { public DistinctiveItemBindingList(IList initialData) : base(initialData) { @@ -14,6 +18,9 @@ public DistinctiveItemBindingList(IList initialData) : base(initialData) { public DistinctiveItemBindingList() { } + + public string? PropertyName { get; set; } + protected override void InsertItem(int index, T item) { if (!Contains(item)) { base.InsertItem(index, item); @@ -24,4 +31,16 @@ protected override void SetItem(int index, T item) { base.SetItem(index, item); } } + + protected override void OnListChanged(ListChangedEventArgs e) { + // Check if the property has the IgnoreListChangedAttribute + if (e.PropertyDescriptor?.Attributes[typeof(IgnoreListChangedAttribute)] != null) { return; } + + base.OnListChanged(e); + } +} + +[AttributeUsage(AttributeTargets.Property)] +public class IgnoreListChangedAttribute : Attribute { + } diff --git a/BadMC_Launcher/Extensions/IEnumerableExtension.cs b/BadMC_Launcher/Extensions/IEnumerableExtension.cs new file mode 100644 index 0000000..a0d4249 --- /dev/null +++ b/BadMC_Launcher/Extensions/IEnumerableExtension.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BadMC_Launcher.Extensions; +public static class IEnumerableExtension { + public static int GetIndex(this IEnumerable source, Func func) { + var item = source.FirstOrDefault(func); + return source.IndexOf(item); + } + + public static bool TryElementAt(this IEnumerable source, int index, out T? returnItem) { + if (index >= 0 && index < source.Count()) { + returnItem = source.ElementAtOrDefault(index); + return true; + } + returnItem = default; + return false; + } +} diff --git a/BadMC_Launcher/Extensions/MinecraftFolderEntryExtension.cs b/BadMC_Launcher/Extensions/MinecraftFolderEntryExtension.cs index 12338d1..ed44af4 100644 --- a/BadMC_Launcher/Extensions/MinecraftFolderEntryExtension.cs +++ b/BadMC_Launcher/Extensions/MinecraftFolderEntryExtension.cs @@ -88,7 +88,7 @@ public static IEnumerable GetMinecraftItems(this MinecraftFo } } else { - path = @$"ms-appx:///Assets/Icons/MinecraftIcons/{minecraftEntryImageEnum.ToString()}.png"; + path = @$"ms-appx:///Assets/Icons/MinecraftIcons/{minecraftEntryImageEnum.ToString().ToLower()}.png"; } //IsStarred diff --git a/BadMC_Launcher/GlobalUsings.cs b/BadMC_Launcher/GlobalUsings.cs index 6e5f759..e8a273a 100644 --- a/BadMC_Launcher/GlobalUsings.cs +++ b/BadMC_Launcher/GlobalUsings.cs @@ -5,3 +5,4 @@ global using Microsoft.Extensions.Hosting; global using Microsoft.Extensions.Logging; global using BadMC_Launcher.Extensions; +global using Microsoft.Windows.ApplicationModel.Resources; diff --git a/BadMC_Launcher/Models/Datas/AppParameters.cs b/BadMC_Launcher/Models/Datas/AppParameters.cs index 0a3e3ca..7981b6b 100644 --- a/BadMC_Launcher/Models/Datas/AppParameters.cs +++ b/BadMC_Launcher/Models/Datas/AppParameters.cs @@ -15,7 +15,7 @@ namespace BadMC_Launcher.Models.Datas; public static class AppParameters { public readonly static SizeInt32 windowSize = new() { - Width = 1000, + Width = 1024, Height = 624 }; } diff --git a/BadMC_Launcher/Models/Datas/SettingsDatas/MinecraftConfig.cs b/BadMC_Launcher/Models/Datas/SettingsDatas/MinecraftConfig.cs index 0c39d4d..ad429cc 100644 --- a/BadMC_Launcher/Models/Datas/SettingsDatas/MinecraftConfig.cs +++ b/BadMC_Launcher/Models/Datas/SettingsDatas/MinecraftConfig.cs @@ -9,16 +9,17 @@ using MinecraftLaunch.Base.Models.Game; using BadMC_Launcher.Controls.Minecraft; using System.ComponentModel; +using BadMC_Launcher.Services.Settings; namespace BadMC_Launcher.Models.Datas.SettingsDatas; internal static class MinecraftConfig { - internal static DistinctiveItemBindingList minecraftAccounts = new(); + internal static DistinctiveItemBindingList minecraftAccounts = new() { PropertyName = nameof(MinecraftConfigService.MinecraftAccounts) }; - internal static DistinctiveItemBindingList javaPaths = new(); + internal static DistinctiveItemBindingList javaPaths = new() { PropertyName = nameof(MinecraftConfigService.JavaPaths) }; - internal static DistinctiveItemBindingList minecraftFolders = new(); + internal static DistinctiveItemBindingList minecraftFolders = new() { PropertyName = nameof(MinecraftConfigService.MinecraftFolders) }; - internal static JavaEntry? activeJavaPath; + internal static string? activeJavaPath; internal static string? activeMinecraftFolder; diff --git a/BadMC_Launcher/Models/Datas/SettingsDatas/ThemeSetting.cs b/BadMC_Launcher/Models/Datas/SettingsDatas/ThemeSetting.cs index 2d0b427..2acdbc5 100644 --- a/BadMC_Launcher/Models/Datas/SettingsDatas/ThemeSetting.cs +++ b/BadMC_Launcher/Models/Datas/SettingsDatas/ThemeSetting.cs @@ -7,7 +7,7 @@ namespace BadMC_Launcher.Models.Datas.SettingsDatas; internal static class ThemeSetting { - internal static BackgroundTypeEnum backgroundType = BackgroundTypeEnum.StaticImage; + internal static BackgroundTypeEnum backgroundType = BackgroundTypeEnum.BingWallpaper; internal static ThemeTypeEnum themeType = ThemeTypeEnum.Light; diff --git a/BadMC_Launcher/Services/Settings/MinecraftConfigService.cs b/BadMC_Launcher/Services/Settings/MinecraftConfigService.cs index 46eba70..38ff04f 100644 --- a/BadMC_Launcher/Services/Settings/MinecraftConfigService.cs +++ b/BadMC_Launcher/Services/Settings/MinecraftConfigService.cs @@ -14,10 +14,10 @@ public class MinecraftConfigService : ConfigClass { public MinecraftConfigService() { //Triggers an event when a property is changed - MinecraftConfig.minecraftAccounts.ListChanged += OnListChanged; - MinecraftConfig.javaPaths.ListChanged += OnListChanged; - MinecraftConfig.minecraftFolders.ListChanged += OnListChanged; - MinecraftConfig.jvmArguments.ListChanged += OnListChanged; + MinecraftConfig.minecraftAccounts.ListChanged += OnListChanged; + MinecraftConfig.javaPaths.ListChanged += OnListChanged; + MinecraftConfig.minecraftFolders.ListChanged += OnListChanged; + MinecraftConfig.jvmArguments.ListChanged += OnListChanged; } public DistinctiveItemBindingList MinecraftAccounts { @@ -51,7 +51,7 @@ public DistinctiveItemBindingList MinecraftFolders { } } - public JavaEntry? ActiveJavaPath { + public string? ActiveJavaPath { get => MinecraftConfig.activeJavaPath; set { MinecraftConfig.activeJavaPath = value; @@ -179,7 +179,30 @@ public BindingList JvmArguments { } } - private void OnListChanged(object? sender, ListChangedEventArgs e) { + private void OnListChanged(object? sender, ListChangedEventArgs e) { + if (sender is DistinctiveItemBindingList senderList && !string.IsNullOrWhiteSpace(senderList.PropertyName)) { + switch (senderList.PropertyName) { + case nameof(MinecraftFolders): + if (!MinecraftFolders.Any(item => item.MinecraftFolderPath == ActiveMinecraftFolderPath) && !string.IsNullOrWhiteSpace(ActiveMinecraftFolderPath)) { + ActiveMinecraftFolderPath = string.Empty; + } + break; + case nameof(JavaPaths): + if (!JavaPaths.Any(item => item == ActiveJavaPath) && !string.IsNullOrWhiteSpace(ActiveJavaPath)) { + ActiveJavaPath = string.Empty; + } + break; + case nameof(MinecraftAccounts): + if (!MinecraftAccounts.Any(item => item.Uuid == ActiveMinecraftAccount?.Uuid) && ActiveMinecraftAccount != null) { + ActiveMinecraftAccount = null; + } + break; + } + + // Notify list changed + OnPropertyChanged(senderList.PropertyName); + } + if (!SyncSettingSet()) { //TODO: Dialog } diff --git a/BadMC_Launcher/Strings/en-US/Resources.resw b/BadMC_Launcher/Strings/en-US/Resources.resw index 40a40f4..635464f 100644 --- a/BadMC_Launcher/Strings/en-US/Resources.resw +++ b/BadMC_Launcher/Strings/en-US/Resources.resw @@ -138,10 +138,10 @@ Browse Minecraft ontologies folder - - Can't find any ontologies. + + Can't find any Minecraft ontologies :( - + Go to the Ontology page to manage Minecraft ontologies. @@ -244,4 +244,25 @@ If something in this setting has been changed in an ontology-specific customizat The name must not be empty or duplicated. + + Can't find the active Minecraft ontologies folder Σ(°ロ°) + + + Here you can display the active MInecraft body folder path, but only if you have an active Minecraft body folder path set 😏 + + + Unable to find an active Java Runtime ( `ε´ ) + + + Set an active Java runtime first to display available Java runtimes 😰 + + + Can't find any Minecraft ontologies folder :( + + + Add a new Minecraft ontologies folder + + + etc! Renaming will be turned off when clicked! (Flyout is too hard so I can't fix it QAQ) + \ No newline at end of file diff --git a/BadMC_Launcher/Strings/zh-Hans/Resources.resw b/BadMC_Launcher/Strings/zh-Hans/Resources.resw index 6780202..23994eb 100644 --- a/BadMC_Launcher/Strings/zh-Hans/Resources.resw +++ b/BadMC_Launcher/Strings/zh-Hans/Resources.resw @@ -138,10 +138,10 @@ 浏览 Minecraft 本体文件夹 - - 找不到任何本体. + + 找不到任何 Minecraft 本体 :( - + 转到本体页面以管理Minecraft本体. @@ -244,4 +244,25 @@ 名称不可为空或与其它项重名. + + 找不到活动的 Minecraft 本体文件夹 Σ(°ロ°) + + + 这里可以显示活动的 MInecraft 本体文件夹路径,但前提是你有设置一个活动的 Minecraft 本体文件夹路径 😏 + + + 找不到活动的 Java 运行时 ( `ε´ ) + + + 在显示 Java 运行时之前请设置活动的 Java 运行时 😰 + + + 找不到任何 Minecraft 本体文件夹 :( + + + 添加新的 Minecraft 本体文件夹 + + + 等等!点击时将会关闭重命名!(Flyout太难了所以修不了 QAQ) + \ No newline at end of file diff --git a/BadMC_Launcher/ViewModels/ContentDialogs/Settings/MinecraftFolderContentDialogViewModel.cs b/BadMC_Launcher/ViewModels/ContentDialogs/Settings/MinecraftFolderContentDialogViewModel.cs index bf6d7d3..f7449c6 100644 --- a/BadMC_Launcher/ViewModels/ContentDialogs/Settings/MinecraftFolderContentDialogViewModel.cs +++ b/BadMC_Launcher/ViewModels/ContentDialogs/Settings/MinecraftFolderContentDialogViewModel.cs @@ -1,35 +1,29 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; -using System.Reflection.Metadata; -using System.Text; -using System.Threading.Tasks; -using BadMC_Launcher.Extensions; -using BadMC_Launcher.Services; using BadMC_Launcher.Services.Settings; using BadMC_Launcher.Controls.Minecraft; using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Messaging; using CommunityToolkit.Mvvm.Messaging.Messages; -using Microsoft.UI.Xaml; -using Microsoft.UI.Xaml.Controls; -using Microsoft.UI.Xaml.Controls.Primitives; using Windows.Storage.Pickers; using WinRT.Interop; using BadMC_Launcher.Models.Enums; +using System.ComponentModel; +using System.Collections.ObjectModel; namespace BadMC_Launcher.ViewModels.ContentDialogs.Settings; public partial class MinecraftFolderContentDialogViewModel : ObservableObject { private MinecraftConfigService minecraftConfigService = App.GetService(); public MinecraftFolderContentDialogViewModel() { - MinecraftFoldersList = minecraftConfigService.MinecraftFolders; - MinecraftFoldersListSelectedItem = MinecraftFoldersList.FirstOrDefault(item => item.MinecraftFolderPath == minecraftConfigService.ActiveMinecraftFolderPath); + MinecraftFoldersList = minecraftConfigService.MinecraftFolders.ToObservableCollection(); + MinecraftFoldersListSelectedIndex = MinecraftFoldersList.GetIndex(item => item.MinecraftFolderPath == minecraftConfigService.ActiveMinecraftFolderPath); OldRenameMinecraftFolderId = string.Empty; NewRenameMinecraftFolderId = string.Empty; RenameMinecraftFolderPath = string.Empty; + + minecraftConfigService.PropertyChanged += MinecraftConfig_PropertyChanged; + + IsMinecraftFoldersListEmpty = !MinecraftFoldersList.Any(); } [ObservableProperty] @@ -37,10 +31,13 @@ public MinecraftFolderContentDialogViewModel() { public partial bool CanRename { get; set; } [ObservableProperty] - public partial DistinctiveItemBindingList MinecraftFoldersList { get; set; } + public partial ObservableCollection MinecraftFoldersList { get; set; } + + [ObservableProperty] + public partial bool IsMinecraftFoldersListEmpty { get; set; } [ObservableProperty] - public partial MinecraftFolderEntry? MinecraftFoldersListSelectedItem { get; set; } + public partial int MinecraftFoldersListSelectedIndex { get; set; } [ObservableProperty] public partial string OldRenameMinecraftFolderId { get; set; } @@ -52,7 +49,7 @@ public MinecraftFolderContentDialogViewModel() { public partial string RenameMinecraftFolderPath { get; set; } [RelayCommand(FlowExceptionsToTaskScheduler = true)] - private async Task AddMinecraftFolder(Button parameter) { + private async Task AddMinecraftFolder() { // Create bew folder picker FolderPicker folderPicker = new FolderPicker(); @@ -77,13 +74,10 @@ private async Task AddMinecraftFolder(Button parameter) { MinecraftFolderPath = folder.Path }); - // Refresh list - MinecraftFoldersList = minecraftConfigService.MinecraftFolders; - // Set new folder name OldRenameMinecraftFolderId = folderId; RenameMinecraftFolderPath = folder.Path; - FlyoutBase.ShowAttachedFlyout(parameter); + SendInvokeFuncMessage(string.Empty, MinecraftFolderContentDialogMessengerTokenEnum.ShowRenameFlyoutToken); } } @@ -101,24 +95,18 @@ private void ApplyRename() { var minecraftPathEntry = minecraftConfigService.MinecraftFolders.FirstOrDefault(item => item.MinecraftFolderPath == RenameMinecraftFolderPath); if (minecraftPathEntry != null) { // Check if folder with new name already exists - if (minecraftConfigService.MinecraftFolders.Any(item => item.MinecraftFolderId == NewRenameMinecraftFolderId)) { - //Show tip toast - //TODO: Tip Toast - return; - } + if ((string.IsNullOrWhiteSpace(NewRenameMinecraftFolderId) && + NewRenameMinecraftFolderId == OldRenameMinecraftFolderId) || + minecraftConfigService.MinecraftFolders.Any(item => item.MinecraftFolderId == NewRenameMinecraftFolderId)) { + + //TODO: tip toast - if (string.IsNullOrWhiteSpace(NewRenameMinecraftFolderId) && NewRenameMinecraftFolderId == OldRenameMinecraftFolderId) { - //TODO tip toast return; } // Rename folder minecraftPathEntry.MinecraftFolderId = NewRenameMinecraftFolderId; - // Refresh list - MinecraftFoldersList = minecraftConfigService.MinecraftFolders; - MinecraftFoldersListSelectedItem = MinecraftFoldersList.FirstOrDefault(item => item.MinecraftFolderPath == minecraftConfigService.ActiveMinecraftFolderPath); - // Hide Flyout HideRenameFlyout(); return; @@ -135,10 +123,15 @@ private void DeleteRenameFlyoutData() { } [RelayCommand] - private void SetActiveMinecraftFolder() { - if (MinecraftFoldersListSelectedItem != null) { - minecraftConfigService.ActiveMinecraftFolderPath = MinecraftFoldersListSelectedItem.MinecraftFolderPath; - MinecraftFoldersListSelectedItem = MinecraftFoldersList.FirstOrDefault(item => item.MinecraftFolderPath == minecraftConfigService.ActiveMinecraftFolderPath); + private void SetActiveMinecraftFolder(SelectionChangedEventArgs args) { + var selectedItem = MinecraftFoldersList.ElementAtOrDefault(MinecraftFoldersListSelectedIndex); + if (args.AddedItems.Any(item => { + if (item is MinecraftFolderEntry entry) { + return entry.MinecraftFolderPath != minecraftConfigService.ActiveMinecraftFolderPath; + } + return false; + })) { + minecraftConfigService.ActiveMinecraftFolderPath = selectedItem?.MinecraftFolderPath; } } @@ -154,7 +147,7 @@ private void RenameItem(string parameter) { var folderEntryPath = MinecraftFoldersList.FirstOrDefault(item => item.MinecraftFolderPath == parameter)?.MinecraftFolderId; if (folderEntryPath != null) { - SendInvokeFuncMessage(parameter, MinecraftFolderContentDialogMessengerTokenEnum.ShowRenameFlyoutToken); + SendInvokeFuncMessage(string.Empty, MinecraftFolderContentDialogMessengerTokenEnum.ShowRenameFlyoutToken); // Set new folder name OldRenameMinecraftFolderId = folderEntryPath; RenameMinecraftFolderPath = parameter; @@ -165,8 +158,6 @@ private void RenameItem(string parameter) { private void DeleteItem(string parameter) { var deleteItem = minecraftConfigService.MinecraftFolders.FirstOrDefault(item => item.MinecraftFolderPath == parameter); if (deleteItem != null && minecraftConfigService.MinecraftFolders.Remove(deleteItem)) { - // Refresh list - MinecraftFoldersList = minecraftConfigService.MinecraftFolders; // TODO: Toast Tip return; } @@ -192,4 +183,25 @@ private void SetCanRename() { private ValueChangedMessage SendInvokeFuncMessage(T value, Enum tokenEnum) { return WeakReferenceMessenger.Default.Send(new ValueChangedMessage(value), tokenEnum.ToString()); } + + + private void MinecraftConfig_PropertyChanged(object? sender, PropertyChangedEventArgs e) { + // Update Property + switch (e.PropertyName) { + case nameof(MinecraftConfigService.ActiveMinecraftFolderPath): + MinecraftFoldersListSelectedIndex = MinecraftFoldersList.GetIndex(item => item.MinecraftFolderPath == minecraftConfigService.ActiveMinecraftFolderPath); + break; + case nameof(MinecraftConfigService.MinecraftFolders): + MinecraftFoldersList = minecraftConfigService.MinecraftFolders.ToObservableCollection(); + MinecraftFoldersListSelectedIndex = MinecraftFoldersList.GetIndex(item => item.MinecraftFolderPath == minecraftConfigService.ActiveMinecraftFolderPath); + break; + } + + // Set whether to display the empty list prompt + IsMinecraftFoldersListEmpty = !MinecraftFoldersList.Any(); + } + + partial void OnMinecraftFoldersListChanged(ObservableCollection value) { + IsMinecraftFoldersListEmpty = !MinecraftFoldersList.Any(); + } } diff --git a/BadMC_Launcher/ViewModels/Pages/Settings/LaunchSettingsPageViewModel.cs b/BadMC_Launcher/ViewModels/Pages/Settings/LaunchSettingsPageViewModel.cs index 652b629..d82c5ee 100644 --- a/BadMC_Launcher/ViewModels/Pages/Settings/LaunchSettingsPageViewModel.cs +++ b/BadMC_Launcher/ViewModels/Pages/Settings/LaunchSettingsPageViewModel.cs @@ -16,26 +16,44 @@ using MinecraftLaunch.Utilities; using BadMC_Launcher.Models.Enums; + namespace BadMC_Launcher.ViewModels.Pages.Settings; public partial class LaunchSettingsPageViewModel : ObservableObject { private readonly XamlRoot? mainPageXamlRoot; private MinecraftConfigService minecraftService = App.GetService(); + private ResourceLoader sourceService = App.GetService(); + private MinecraftFolderEntry? minecraftFolder; + private JavaEntry? java; public LaunchSettingsPageViewModel() { mainPageXamlRoot = SendGetValueMessage(MainPageMessengerTokenEnum.XamlRootToken).Response; - Java = minecraftService.ActiveJavaPath; - MinecraftFolder = minecraftService.MinecraftFolders.FirstOrDefault(item => item.MinecraftFolderPath == minecraftService.ActiveMinecraftFolderPath); + minecraftFolder = minecraftService.MinecraftFolders.FirstOrDefault(item => item.MinecraftFolderPath == minecraftService.ActiveMinecraftFolderPath); IsAutoMemorySize = minecraftService.IsAutoMemorySize; minecraftService.PropertyChanged += MinecraftConfig_PropertyChanged; + + MinecraftFolderId = minecraftFolder != null ? minecraftFolder.MinecraftFolderId : sourceService.GetString("Global_NullMinecraftFolderId"); + MinecraftFolderPath = minecraftFolder != null ? minecraftFolder.MinecraftFolderPath : sourceService.GetString("Global_NullMinecraftFolderPath"); + + JavaId = sourceService.GetString("Global_NullJavaId"); + JavaPath = sourceService.GetString("Global_NullJavaPath"); + + GetJavaInfo(); } + // Minecraft folder settings [ObservableProperty] - public partial MinecraftFolderEntry? MinecraftFolder { get; set; } + public partial string MinecraftFolderId { get; set; } [ObservableProperty] - public partial JavaEntry? Java { get; set; } + public partial string MinecraftFolderPath { get; set; } + + [ObservableProperty] + public partial string JavaId { get; set; } + + [ObservableProperty] + public partial string JavaPath { get; set; } [ObservableProperty] public partial bool IsAutoMemorySize { get; set; } @@ -65,13 +83,30 @@ private void SetIsAutoMemorySize() { minecraftService.IsAutoMemorySize = IsAutoMemorySize; } + private async void GetJavaInfo() { + java = await JavaUtil.GetJavaInfoAsync(minecraftService.ActiveJavaPath); + + JavaId = java != null ? java.JavaVersion : sourceService.GetString("Global_NullJavaId"); + JavaPath = java != null ? java.JavaPath : sourceService.GetString("Global_NullJavaPath"); + } + private RequestMessage SendGetValueMessage(Enum tokenEnum) { return WeakReferenceMessenger.Default.Send(new RequestMessage(), tokenEnum.ToString()); } + private void MinecraftConfig_PropertyChanged(object? sender, PropertyChangedEventArgs e) { - if (e.PropertyName == nameof(minecraftService.ActiveMinecraftFolderPath)) { - MinecraftFolder = minecraftService.MinecraftFolders.FirstOrDefault(item => item.MinecraftFolderPath == minecraftService.ActiveMinecraftFolderPath); + switch (e.PropertyName) { + case nameof(minecraftService.ActiveJavaPath): + GetJavaInfo(); + break; + case nameof(minecraftService.MinecraftFolders): + case nameof(minecraftService.ActiveMinecraftFolderPath): + minecraftFolder = minecraftService.MinecraftFolders.FirstOrDefault(item => item.MinecraftFolderPath == minecraftService.ActiveMinecraftFolderPath); + + MinecraftFolderId = minecraftFolder != null ? minecraftFolder.MinecraftFolderId : sourceService.GetString("Global_NullMinecraftFolderId"); + MinecraftFolderPath = minecraftFolder != null ? minecraftFolder.MinecraftFolderPath : sourceService.GetString("Global_NullMinecraftFolderPath"); + break; } } } diff --git a/BadMC_Launcher/ViewModels/UserControls/LaunchPadViewModel.cs b/BadMC_Launcher/ViewModels/UserControls/LaunchPadViewModel.cs index d55f49c..c17572d 100644 --- a/BadMC_Launcher/ViewModels/UserControls/LaunchPadViewModel.cs +++ b/BadMC_Launcher/ViewModels/UserControls/LaunchPadViewModel.cs @@ -26,40 +26,56 @@ public partial class LaunchPadViewModel : ObservableObject { MinecraftConfigService minecraftService = App.GetService(); public LaunchPadViewModel() { - MinecraftFolderEntryList = minecraftService.MinecraftFolders; + MinecraftFolderEntryList = minecraftService.MinecraftFolders.ToObservableCollection(); MinecraftEntryList = new(); //Check active Minecraft path if (minecraftService.ActiveMinecraftFolderPath != null) { - //Get active Minecraft path entry - var activeMinecraftPathEntry = MinecraftFolderEntryList.FirstOrDefault(item => item.MinecraftFolderPath == minecraftService.ActiveMinecraftFolderPath); + // Set MinecraftFolderEntryListSelectedIndex + MinecraftFolderEntryListSelectedIndex = MinecraftFolderEntryList.GetIndex(item => item.MinecraftFolderPath == minecraftService.ActiveMinecraftFolderPath); - if (activeMinecraftPathEntry != null) { + // Set Minecraft entries + if (MinecraftFolderEntryList.TryElementAt(MinecraftFolderEntryListSelectedIndex, out var selectedItem) && selectedItem != null) { + // Get minecraftItems + MinecraftEntryList = new(selectedItem.GetMinecraftItems().ToList()); - // Set MinecraftFolderEntryListSelectedItem - MinecraftFolderEntryListSelectedItem = activeMinecraftPathEntry; + // Set ActiveMinecraftEntry + MinecraftEntryListSelectedIndex = MinecraftEntryList.GetIndex(item => item.MinecraftId == selectedItem.ActiveMinecraftEntryId); } } + + LaunchButtonMinecraftId = MinecraftEntryList.ElementAtOrDefault(MinecraftEntryListSelectedIndex)?.MinecraftId ?? App.GetService().GetString("LaunchPad_LaunchButtonTagDefaultResource"); + LaunchButtonMinecraftIcon = MinecraftEntryList.ElementAtOrDefault(MinecraftEntryListSelectedIndex)?.MinecraftImage ?? new() { UriSource = new(@"ms-appx:///Assets/Icons/MinecraftIcons/drowned.png") }; + + minecraftService.PropertyChanged += MinecraftConfig_PropertyChanged; + + IsMinecraftEntryListEmpty = !MinecraftEntryList.Any(); } //LaunchButton Property [ObservableProperty] public partial string? LaunchButtonMinecraftId { get; set; } + [ObservableProperty] + public partial BitmapImage? LaunchButtonMinecraftIcon { get; set; } + //MinecraftsList [ObservableProperty] - public partial DistinctiveItemBindingList MinecraftEntryList { get; set; } + public partial ObservableCollection MinecraftEntryList { get; set; } + + [ObservableProperty] + public partial bool IsMinecraftEntryListEmpty { get; set; } //MinecraftFolderPathsList [ObservableProperty] - public partial DistinctiveItemBindingList MinecraftFolderEntryList { get; set; } + public partial ObservableCollection MinecraftFolderEntryList { get; set; } [ObservableProperty] - public partial MinecraftFolderEntry? MinecraftFolderEntryListSelectedItem { get; set; } + public partial int MinecraftFolderEntryListSelectedIndex { get; set; } [ObservableProperty] [NotifyCanExecuteChangedFor(nameof(ViewLoaclMinecraftFolderCommand), nameof(LaunchMinecraftJavaCommand))] - public partial MinecraftEntryItem? MinecraftEntryListSelectedItem { get; set; } + public partial int MinecraftEntryListSelectedIndex { get; set; } [RelayCommand(CanExecute = nameof(SetIsNotActiveMinecraftEntryEmpty))] public void LaunchMinecraftJava() { @@ -95,70 +111,105 @@ private async Task OpenMinecraftFoldersManager() { [RelayCommand(CanExecute = nameof(SetIsNotActiveMinecraftEntryEmpty))] private void ViewLoaclMinecraftFolder() { - if (MinecraftFolderEntryListSelectedItem != null) { - App.GetService().TryOpenFolderFromPath(MinecraftFolderEntryListSelectedItem.MinecraftFolderPath); + if (MinecraftFolderEntryList.TryElementAt(MinecraftFolderEntryListSelectedIndex, out var selectedItem) && selectedItem != null) { + App.GetService().TryOpenFolderFromPath(selectedItem.MinecraftFolderPath); } } - partial void OnMinecraftFolderEntryListSelectedItemChanged(MinecraftFolderEntry? value) { - if (value != null && MinecraftFolderEntryListSelectedItem != null) { - minecraftService.ActiveMinecraftFolderPath = value.MinecraftFolderPath; - } - - // Get active minecraft path entry - if (value != null && minecraftService.ActiveMinecraftFolderPath != null && MinecraftFolderEntryListSelectedItem != null) { - // Set MinecraftEntryList - MinecraftEntryList = new(value.GetMinecraftItems().ToList()); + [RelayCommand] + private void ChangeActiveMinecraftFolder() { + if (MinecraftFolderEntryList.TryElementAt(MinecraftFolderEntryListSelectedIndex, out var selectedItem) && selectedItem != null) { + minecraftService.ActiveMinecraftFolderPath = selectedItem.MinecraftFolderPath; - // Set ActiveMinecraftEntry - MinecraftEntryListSelectedItem = MinecraftEntryList.FirstOrDefault(item => item.MinecraftId == value.ActiveMinecraftEntryId); - } + // Get active minecraft path entry + if (minecraftService.ActiveMinecraftFolderPath != null) { + // Set MinecraftEntryList + MinecraftEntryList = new(selectedItem.GetMinecraftItems().ToList()); - // Init MinecraftEntryList if null - if (MinecraftEntryList == null) { - MinecraftEntryList = new(); + // Set ActiveMinecraftEntry + MinecraftEntryListSelectedIndex = MinecraftEntryList.GetIndex(item => item.MinecraftId == selectedItem.ActiveMinecraftEntryId); + } + else { + // Init MinecraftEntryList + MinecraftEntryList = new(); + } } } - partial void OnMinecraftEntryListSelectedItemChanged(MinecraftEntryItem? value) { - if (value != null && MinecraftFolderEntryListSelectedItem != null) { - MinecraftFolderEntryListSelectedItem.ActiveMinecraftEntryId = value.MinecraftId; - LaunchButtonMinecraftId = MinecraftEntryListSelectedItem?.MinecraftId ?? App.GetService().GetString("LaunchPad_LaunchButtonTagDefaultResource"); + partial void OnMinecraftEntryListSelectedIndexChanged(int value) { + if (value >= 0) { + // Get ActiveMinecraftEntry + var minecraftFolderEntry = minecraftService.MinecraftFolders.FirstOrDefault(item => item.MinecraftFolderPath == minecraftService.ActiveMinecraftFolderPath); + + if (minecraftFolderEntry != null) { + minecraftFolderEntry.ActiveMinecraftEntryId = MinecraftEntryList.ElementAtOrDefault(value)?.MinecraftId; + } } + LaunchButtonMinecraftId = MinecraftEntryList.ElementAtOrDefault(MinecraftEntryListSelectedIndex)?.MinecraftId ?? App.GetService().GetString("LaunchPad_LaunchButtonTagDefaultResource"); + LaunchButtonMinecraftIcon = MinecraftEntryList.ElementAtOrDefault(MinecraftEntryListSelectedIndex)?.MinecraftImage ?? new() { UriSource = new(@"ms-appx:///Assets/Icons/MinecraftIcons/drowned.png")}; } private void MinecraftConfig_PropertyChanged(object? sender, PropertyChangedEventArgs e) { + var selectedItem = minecraftService.MinecraftFolders.FirstOrDefault(item => item.MinecraftFolderPath == minecraftService.ActiveMinecraftFolderPath); + // Update Property switch (e.PropertyName) { case nameof(MinecraftConfigService.ActiveMinecraftFolderPath): - if (sender is MinecraftConfigService activeMinecraftFolderPathService) { MinecraftFolderEntryListSelectedItem = MinecraftFolderEntryList.FirstOrDefault(item => item.MinecraftFolderPath == activeMinecraftFolderPathService.ActiveMinecraftFolderPath); } + // Set MinecraftFolderEntries SelectedIndex + MinecraftFolderEntryListSelectedIndex = MinecraftFolderEntryList.GetIndex(item => item.MinecraftFolderPath == minecraftService.ActiveMinecraftFolderPath); + + // Update MinecraftEntryList + MinecraftEntryList.Clear(); + MinecraftEntryList.AddRange(selectedItem?.GetMinecraftItems()); + + MinecraftEntryListSelectedIndex = MinecraftEntryList.GetIndex(item => item.MinecraftId == selectedItem?.ActiveMinecraftEntryId); break; case nameof(MinecraftConfigService.MinecraftFolders): - if (sender is MinecraftConfigService minecraftFoldersService) { MinecraftFolderEntryList = minecraftFoldersService.MinecraftFolders; } + // Update MinecraftFolderEntryList + MinecraftFolderEntryList = minecraftService.MinecraftFolders.ToObservableCollection(); + + // Get ActiveMinecraftEntry + MinecraftFolderEntryListSelectedIndex = MinecraftFolderEntryList.GetIndex(item => item.MinecraftFolderPath == minecraftService.ActiveMinecraftFolderPath); + + // Update MinecraftEntryList + MinecraftEntryList.Clear(); + MinecraftEntryList.AddRange(selectedItem?.GetMinecraftItems()); + + MinecraftEntryListSelectedIndex = MinecraftEntryList.GetIndex(item => item.MinecraftId == selectedItem?.ActiveMinecraftEntryId); break; } + + // Set whether to display the empty list prompt + IsMinecraftEntryListEmpty = !MinecraftEntryList.Any(); } //Set CanExecute for ViewLoaclMinecraftFolderCommand - private bool SetIsNotActiveMinecraftEntryEmpty() => MinecraftEntryListSelectedItem != null; + private bool SetIsNotActiveMinecraftEntryEmpty() => MinecraftEntryListSelectedIndex >= 0; - // TODO: 拆 private void RefreshMinecraftEntryList() { - //Get Configs From Json File - minecraftService.SyncSettingGet(); - if (MinecraftFolderEntryListSelectedItem != null) { - // Init list - var minecraftEntries = new ObservableCollection(); - + if (MinecraftFolderEntryList.TryElementAt(MinecraftFolderEntryListSelectedIndex, out var selectedItem) && selectedItem != null) { // Get minecraftItems - MinecraftEntryList = new(MinecraftFolderEntryListSelectedItem.GetMinecraftItems().ToList()); + MinecraftEntryList = new(selectedItem.GetMinecraftItems().ToList()); // Set ActiveMinecraftEntry - MinecraftEntryListSelectedItem = MinecraftEntryList.FirstOrDefault(item => item.MinecraftId == MinecraftFolderEntryListSelectedItem.ActiveMinecraftEntryId); + MinecraftEntryListSelectedIndex = MinecraftEntryList.GetIndex(item => item.MinecraftId == selectedItem.ActiveMinecraftEntryId); + + return; } + + // Clear MinecraftEntryList + MinecraftEntryList.Clear(); + } + + partial void OnMinecraftEntryListChanged(ObservableCollection value) { + IsMinecraftEntryListEmpty = !MinecraftEntryList.Any(); } private RequestMessage SendGetValueMessage(Enum tokenEnum) { return WeakReferenceMessenger.Default.Send(new RequestMessage(), tokenEnum.ToString()); } + + partial void OnIsMinecraftEntryListEmptyChanged(bool value) { + + } } diff --git a/BadMC_Launcher/Views/ContentDialogs/Settings/MinecraftFolderContentDialog.xaml b/BadMC_Launcher/Views/ContentDialogs/Settings/MinecraftFolderContentDialog.xaml index 1574fa1..369cf10 100644 --- a/BadMC_Launcher/Views/ContentDialogs/Settings/MinecraftFolderContentDialog.xaml +++ b/BadMC_Launcher/Views/ContentDialogs/Settings/MinecraftFolderContentDialog.xaml @@ -2,11 +2,18 @@ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Interactivity="using:Microsoft.Xaml.Interactivity" + xmlns:converters="using:CommunityToolkit.WinUI.Converters" xmlns:local="using:BadMC_Launcher.Views.ContentDialogs.Settings" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" x:Uid="MinecraftFolderContentDialog_ViewContentDialog" PrimaryButtonStyle="{StaticResource AccentButtonStyle}" Style="{ThemeResource DefaultContentDialogStyle}"> + + + + @@ -19,8 +26,7 @@ Height="36" Padding="0" HorizontalAlignment="Center" - Command="{Binding AddMinecraftFolderCommand}" - CommandParameter="{Binding ElementName=AddMinecraftFolderButton}"> + Command="{Binding AddMinecraftFolderCommand}"> @@ -91,7 +97,9 @@ - + - + Style="{StaticResource AccentButtonStyle}" /> @@ -41,8 +44,7 @@ + Command="{Binding ShowJavaPathManagerDialogCommand}"> @@ -51,12 +53,18 @@ - - - - + @@ -97,7 +105,6 @@ - diff --git a/BadMC_Launcher/Views/UserControls/LaunchPad.xaml b/BadMC_Launcher/Views/UserControls/LaunchPad.xaml index 10f8932..be757b1 100644 --- a/BadMC_Launcher/Views/UserControls/LaunchPad.xaml +++ b/BadMC_Launcher/Views/UserControls/LaunchPad.xaml @@ -12,11 +12,12 @@ d:DesignWidth="400" mc:Ignorable="d"> - + + @@ -56,7 +57,11 @@ HorizontalAlignment="Center" BorderBrush="{ThemeResource ControlFillColorDefaultBrush}" BorderThickness="4" - CornerRadius="8" /> + CornerRadius="8"> + + + + - - - - - - - - - - - - - - - - - - - - - @@ -152,7 +132,13 @@ VerticalAlignment="Center" ItemTemplate="{StaticResource MinecraftFolderItemsTemplateSecondary}" ItemsSource="{Binding MinecraftFolderEntryList}" - SelectedItem="{Binding MinecraftFolderEntryListSelectedItem, Mode=TwoWay}" /> + SelectedIndex="{Binding MinecraftFolderEntryListSelectedIndex, Mode=TwoWay}"> + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - + - - - - - - - - - - - From f9b7760f89af11a0dab86204843568402d8f588f Mon Sep 17 00:00:00 2001 From: Starcloudsea <84891987+Starcloudsea@users.noreply.github.com> Date: Sat, 5 Apr 2025 13:11:21 +0800 Subject: [PATCH 09/40] =?UTF-8?q?=E7=8E=B0=E5=9C=A8=E7=9C=9F=E6=88=90Fluen?= =?UTF-8?q?tLauncher=E4=BA=86XDDDDD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BadMC_Launcher.Benchmarks.csproj | 1 + .../BadMC_Launcher.Tests.csproj | 1 + BadMC_Launcher.Tests/UnitTest1.cs | 23 +-- BadMC_Launcher.sln | 1 + BadMC_Launcher/App.xaml | 1 + BadMC_Launcher/App.xaml.cs | 43 +++-- .../Assets/Icons/JavaIcons/openjdk.png | Bin 0 -> 41049 bytes .../Assets/Icons/JavaIcons/oracle.png | Bin 0 -> 45263 bytes .../Assets/Icons/JavaIcons/zulu.png | Bin 0 -> 49103 bytes BadMC_Launcher/BadMC_Launcher.csproj | 111 ++---------- .../MainMenuSearchMinecraftEntryFilter.cs | 4 +- .../Controls/Minecraft/JavaViewItem.cs | 65 +++++++ ...lderEntry.cs => MinecraftEntryViewItem.cs} | 19 +- ...craftEntryItem.cs => MinecraftViewItem.cs} | 20 +- .../ItemTemplate/JavaItemsTemplate.xaml | 121 +++++++++++++ .../MinecraftFolderItemsTemplate.xaml | 4 +- .../ItemTemplate/MinecraftItemsTemplate.xaml | 8 + .../Extensions/DistinctiveItemBindingList.cs | 10 + .../Extensions/JavaEntryExtension.cs | 20 ++ .../Extensions/MinecraftEntryExtension.cs | 4 +- ...cs => MinecraftFolderViewItemExtension.cs} | 18 +- .../Extensions/ObservableDataList.cs | 10 +- BadMC_Launcher/Models/Datas/AppParameters.cs | 2 +- .../Models/Datas/Mappings/UpdateMapping.cs | 2 +- .../Datas/SettingsDatas/MinecraftConfig.cs | 2 +- .../Models/Datas/ViewDatas/MainMenuData.cs | 13 -- .../Models/Datas/ViewDatas/MainSideBarData.cs | 5 + .../Settings/MinecraftConfigService.cs | 14 +- .../Settings/SingleMinecraftConfigService.cs | 4 + .../Services/ViewServices/MainMenuService.cs | 21 --- ...anagerService.cs => MainSideBarService.cs} | 12 +- BadMC_Launcher/Strings/en-US/Resources.resw | 81 ++++++--- BadMC_Launcher/Strings/zh-Hans/Resources.resw | 77 +++++--- .../Settings/JavaContentDialogViewModel.cs | 163 +++++++++++++++++ .../MinecraftFolderContentDialogViewModel.cs | 96 +++++----- .../ViewModels/Pages/MainPageViewModel.cs | 99 +++++++--- .../MainSideBar/MainMenuPageViewModel.cs | 97 ---------- .../Settings/LaunchSettingsPageViewModel.cs | 13 +- .../UserControls/LaunchPadViewModel.cs | 17 +- .../Settings/JavaContentDialog.xaml | 131 ++++++++++++++ .../Settings/JavaContentDialog.xaml.cs | 23 +++ .../MinecraftFolderContentDialog.xaml | 56 +++--- .../MinecraftFolderContentDialog.xaml.cs | 2 +- BadMC_Launcher/Views/Pages/MainPage.xaml | 114 ++++++++++-- BadMC_Launcher/Views/Pages/MainPage.xaml.cs | 18 +- .../Views/Pages/MainSideBar/MainMenuPage.xaml | 171 ------------------ .../Pages/MainSideBar/MainMenuPage.xaml.cs | 31 ---- .../Pages/Settings/LaunchSettingsPage.xaml | 19 +- .../Views/UserControls/LaunchPad.xaml | 25 ++- .../Views/UserControls/LaunchPad.xaml.cs | 14 -- .../Views/UserControls/LoadingAnimation.xaml | 47 +++++ .../UserControls/LoadingAnimation.xaml.cs | 77 ++++++++ Directory.Packages.props | 1 + 53 files changed, 1181 insertions(+), 750 deletions(-) create mode 100644 BadMC_Launcher/Assets/Icons/JavaIcons/openjdk.png create mode 100644 BadMC_Launcher/Assets/Icons/JavaIcons/oracle.png create mode 100644 BadMC_Launcher/Assets/Icons/JavaIcons/zulu.png create mode 100644 BadMC_Launcher/Controls/Minecraft/JavaViewItem.cs rename BadMC_Launcher/Controls/Minecraft/{MinecraftFolderEntry.cs => MinecraftEntryViewItem.cs} (73%) rename BadMC_Launcher/Controls/Minecraft/{MinecraftEntryItem.cs => MinecraftViewItem.cs} (76%) create mode 100644 BadMC_Launcher/Dictionaries/Templates/ItemTemplate/JavaItemsTemplate.xaml create mode 100644 BadMC_Launcher/Extensions/JavaEntryExtension.cs rename BadMC_Launcher/Extensions/{MinecraftFolderEntryExtension.cs => MinecraftFolderViewItemExtension.cs} (82%) delete mode 100644 BadMC_Launcher/Models/Datas/ViewDatas/MainMenuData.cs delete mode 100644 BadMC_Launcher/Services/ViewServices/MainMenuService.cs rename BadMC_Launcher/Services/ViewServices/{MainSideBarManagerService.cs => MainSideBarService.cs} (74%) create mode 100644 BadMC_Launcher/ViewModels/ContentDialogs/Settings/JavaContentDialogViewModel.cs delete mode 100644 BadMC_Launcher/ViewModels/Pages/MainSideBar/MainMenuPageViewModel.cs create mode 100644 BadMC_Launcher/Views/ContentDialogs/Settings/JavaContentDialog.xaml create mode 100644 BadMC_Launcher/Views/ContentDialogs/Settings/JavaContentDialog.xaml.cs delete mode 100644 BadMC_Launcher/Views/Pages/MainSideBar/MainMenuPage.xaml delete mode 100644 BadMC_Launcher/Views/Pages/MainSideBar/MainMenuPage.xaml.cs create mode 100644 BadMC_Launcher/Views/UserControls/LoadingAnimation.xaml create mode 100644 BadMC_Launcher/Views/UserControls/LoadingAnimation.xaml.cs diff --git a/BadMC_Launcher.Benchmarks/BadMC_Launcher.Benchmarks.csproj b/BadMC_Launcher.Benchmarks/BadMC_Launcher.Benchmarks.csproj index b168a1c..b9f90c0 100644 --- a/BadMC_Launcher.Benchmarks/BadMC_Launcher.Benchmarks.csproj +++ b/BadMC_Launcher.Benchmarks/BadMC_Launcher.Benchmarks.csproj @@ -14,6 +14,7 @@ + diff --git a/BadMC_Launcher.Tests/BadMC_Launcher.Tests.csproj b/BadMC_Launcher.Tests/BadMC_Launcher.Tests.csproj index 56b3dcd..baf6f73 100644 --- a/BadMC_Launcher.Tests/BadMC_Launcher.Tests.csproj +++ b/BadMC_Launcher.Tests/BadMC_Launcher.Tests.csproj @@ -15,6 +15,7 @@ + diff --git a/BadMC_Launcher.Tests/UnitTest1.cs b/BadMC_Launcher.Tests/UnitTest1.cs index 541b495..c381201 100644 --- a/BadMC_Launcher.Tests/UnitTest1.cs +++ b/BadMC_Launcher.Tests/UnitTest1.cs @@ -1,7 +1,6 @@ using System; using System.Diagnostics; using System.Net; -using BadMC_Launcher.Constants; using BadMC_Launcher.Classes; using Microsoft.Extensions.DependencyInjection; using Microsoft.UI.Xaml.Media.Imaging; @@ -14,35 +13,21 @@ namespace BadMC_Launcher.Tests; -public class UnitTest1 -{ +public class UnitTest1 { class C1 { public string indowName { get; set; } = "哼哼啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊!!!!!!!!!!!!!!"; public int indowName2 { get; set; } = 13333444; } [SetUp] - public void Setup() - { + public void Setup() { } [Test] public async Task Test1() { - //IFileService? fileService = new FileService(); - //var cc1 = new C1(); - //fileService.WriteConfig(Path.Combine(AppDataPath.ConfigsPath, @"Settings\C1.json"), cc1); - ////fileService.ConfigSet(Path.Combine(AppDataPath.ConfigsPath, @"Settings\C1.json"), "indowName", cc1.indowName); - //var request = new HttpRequestMessage(HttpMethod.Head, @"https://bmclapi2.bangbang93.com/forge/download?mcversion=1.20.1&version=47.3.27&category=installer&format=jar"); - //var response = await new HttpClient().SendAsync(request, HttpCompletionOption.ResponseHeadersRead); - //if (response.StatusCode == HttpStatusCode.Found) { - // var redirectUrl = response.Headers.Location?.AbsoluteUri; - //} - //response.EnsureSuccessStatusCode(); + var a = await JavaUtil.GetJavaInfoAsync(@"C:\Program Files\Zulu\zulu-23\bin\java.exe"); - //new BitmapImage(new Uri("C:\\Users\\stars\\Pictures\\Camera Roll\\fcxbb.png")); - //LaunchConfig - VanillaInstaller.EnumerableMinecraftAsync(); - Assert.Pass(); + Assert.Pass($"{a.JavaPath}\n{a.JavaType}\n{a.JavaVersion}\n{a.MajorVersion}"); } } diff --git a/BadMC_Launcher.sln b/BadMC_Launcher.sln index 927b688..a51d739 100644 --- a/BadMC_Launcher.sln +++ b/BadMC_Launcher.sln @@ -99,5 +99,6 @@ Global GlobalSection(ExtensibilityGlobals) = postSolution RESX_ExcelExportMode = MultipleSheets SolutionGuid = {9BB97DAE-986F-449E-8D4B-1E61C2D6974E} + RESX_NeutralResourcesLanguage = zh-Hans EndGlobalSection EndGlobal diff --git a/BadMC_Launcher/App.xaml b/BadMC_Launcher/App.xaml index a97bfe0..8a4ae7b 100644 --- a/BadMC_Launcher/App.xaml +++ b/BadMC_Launcher/App.xaml @@ -12,6 +12,7 @@ + diff --git a/BadMC_Launcher/App.xaml.cs b/BadMC_Launcher/App.xaml.cs index 9f40f1f..8eb0caf 100644 --- a/BadMC_Launcher/App.xaml.cs +++ b/BadMC_Launcher/App.xaml.cs @@ -1,21 +1,23 @@ using BadMC_Launcher.Classes; +using BadMC_Launcher.Controls; +using BadMC_Launcher.Controls.MainSearch; using BadMC_Launcher.Models.Datas; using BadMC_Launcher.Services; -using BadMC_Launcher.Services.ViewServices; using BadMC_Launcher.Services.Settings; +using BadMC_Launcher.Services.ViewServices; +using BadMC_Launcher.ViewModels.ContentDialogs.Settings; using BadMC_Launcher.ViewModels.Pages; using BadMC_Launcher.Views.ContentDialogs.Settings; using BadMC_Launcher.Views.Pages; -using BadMC_Launcher.Views.Pages.MainSideBar; using BadMC_Launcher.Views.Pages.Settings; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.UI; +using Microsoft.UI.Xaml.Controls.AnimatedVisuals; using Microsoft.UI.Xaml.Media.Imaging; using Microsoft.Windows.ApplicationModel.Resources; using Serilog; using Uno.Resizetizer; -using BadMC_Launcher.Controls; -using BadMC_Launcher.Controls.MainSearch; +using Windows.Globalization; namespace BadMC_Launcher; public partial class App : Application { @@ -25,6 +27,8 @@ public partial class App : Application { ///

public App() { InitializeComponent(); + + ApplicationLanguages.PrimaryLanguageOverride = "zh-Hans"; } public static new App Current => (App)Application.Current; @@ -85,19 +89,23 @@ protected override void OnLaunched(LaunchActivatedEventArgs args) { services.AddSingleton(); services.AddSingleton(); + services.AddTransient(); + //Regist class services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); + services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); + services.AddTransient(); //Register ContentDialogs services.AddTransient(); + services.AddTransient(); + }) ); MainWindow = builder.Window; @@ -166,21 +174,18 @@ private static void GetSettings() { private void GlobalRegister() { //Register MainSideBarItems - GetService().Register(new MainSideBarItem() { - ItemName = GetService().GetString("MainPage_MainMenuNameResource"), - ItemIcon = new FontIcon() { Glyph = "\uE74C" }, - NavigatePage = typeof(MainMenuPage) - }); - - GetService().Register(new MainSideBarItem() { - ItemName = GetService().GetString("MainPage_MainMenuNameResource"), - ItemIcon = new FontIcon() { Glyph = "\uE74C" }, - NavigatePage = typeof(MainMenuPage) - }); + GetService().Register(new MainSideBarItem() { + ItemName = GetService().GetString("MainPage_SettingsNameResource"), + ItemIcon = new AnimatedIcon() { + Source = new AnimatedSettingsVisualSource(), + FallbackIconSource = new FontIconSource() { Glyph = "\uE713" }, + }, + NavigatePage = typeof(SettingsDashboardPage) + }, true); //Register MainMenuSearchFilterItems - GetService().SearchFilterRegister(new MainMenuSearchMinecraftEntryFilter() { - ItemName = GetService().GetString("MainMenuPage_SearchFilterMinecraftEntryNameResource"), + GetService().SearchFilterRegister(new MainMenuSearchMinecraftEntryFilter() { + ItemName = GetService().GetString("MainPage_SearchFilterMinecraftEntryNameResource"), IconGlyph = "\uE7FC" }); diff --git a/BadMC_Launcher/Assets/Icons/JavaIcons/openjdk.png b/BadMC_Launcher/Assets/Icons/JavaIcons/openjdk.png new file mode 100644 index 0000000000000000000000000000000000000000..04f7d31b5b93b3125a9d5d4ab6c4bf18d3e6dd9b GIT binary patch literal 41049 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�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 YqAi)4yGB;5w}B7J*wU!d&?)Bs0DS8tH~;_u literal 0 HcmV?d00001 diff --git a/BadMC_Launcher/Assets/Icons/JavaIcons/zulu.png b/BadMC_Launcher/Assets/Icons/JavaIcons/zulu.png new file mode 100644 index 0000000000000000000000000000000000000000..ea1fe93132ee98c55398c9b07ac0f9b1ae9ad21e GIT binary patch literal 49103 zcmeFZRb16w*ER}>w1gntAfa?ONFya65)#tV-7VmfkVQ$Cq96(g(v2wHA*nQr23h1H zzqt_K=iPgMhx_n3;ODLP-x(vWagCTpKGIOSg+qyhf`W2OMOj`O1?2`k@&^k8{K>Qn z#&hrswu`cXI|>RH6Y>Yu=YzBt3JN`niu{AeKB$|Gz75nrJ$LE{B{Z>kyKmnv50}9c z5)z_aJaTh}U-)#bEH-5L6L-#5lf9swX53FQve>(X|+2pTkQ(Uq= zgSp9{QThM{jW7fSogM`hO9uQWTWHIx+W~WE|BpWmk&zF<2#>t}{~KrjQHKALivNEZl;Rs0wi1%1*~!d(7#He!y5o@2MaS zRmB*QT;C|Af11l$Uew)lNMRLVFL+CVo53c5CS!&!RYB!NPW1|Jud-oUwdsRuC^_a5uTkiCy@+r_Zp84|~4ThDsv0bxWN#zjd zZ|mP4uv%fsw5ZSdt2$9@@0k@h)jDRJwRvAoZiSTp<+7o)EHXESzlUkA13BCet*+jQ z!!0oy^JDBFIyE~u9lK!cxTDPQm(VuK0bcCgo~{OdPk?smao%U1K}dA^`ib17=w;M~ zL<2+UU)Hlv3$8gs<<9pKToY^a*H6|IBY&Ol$pDCRuuHMT$!8n5aX95)B0hKnuxP($ zaVkV;gnyV^CgIbTdrzHDBPAb`nRqrraIpUp_}pr&!I1qipF~b{`Z(E^puL|8s>uW^ z#(JFNT=ho<@C`EI4?asg*B=XGgO6b~iGtu`dKW~WcNa_fp;BjYb8t?;(Wm*qTuDob ziEDcAaRVIIiTtKH(2>}~XU@UFi`z=5T4ydlq04Q0!eq}V60b#NcRLrg5LQD3RwayU zNf6&oJfJege(pLrx-IFylsu`%Zxw(RCxz~p)zTDry43n&mc?_jTYTwt z@w6X}AVThMcEX5ME&7!OaWwCs8dT3m$WmS zOn3`IFKJJ=HpQq~yDCF5{MPlJ8^}EaG2*1r{Zd;#VbZ-(de?>qXd|#Uh@laF6!C=h0F!vsu|kK`JXB6^5)fbs^!Mt{tpi#`LDmKCIVko5i!t$ zLz19<9xq80)RfST`jVgcI-|N%_w%;xHXQ4(rLL-g+enITGT%bQ%Jf#K^_EWm(d>TU zR)$OR^*S5#dxLUI`Ae*XuUsw!yXgF&+^yrgrbl?o2)9GR^3iz(Qcr9x1s81)T4> zjStZ7JjW9OzJ~M)k0`KnLFXbF_!KMDox8c@zEqg&w>Ldv3DO$ZYh@vwVU4Io8lCF^7n_@z;VRU$c%g&Hz&)he;3A5 zpY}s*aEFQhh(sWF4vht7v&I&b2{dj+G;w@F<<|DeKah-zTcLX4BB!g)#*_^gHR#%L zjURwj@4pPC2Y>M$wo!#;?fzEKm*>K@n>*9v+_Q}*FOA0Ofm}_Mi8Yx`4s0l7~8qdv#}Cob@3-d=}&Z*Owf%Q+jccXs>mP4wER9I;$5 z-wVm9FoNSGgm7-IT=eI3!it?)H9db{j7AbKMNkFN>#(YC)=gkx{WWjG1Qc%>+2J3g z==6iS=v?)#x_8qFaJL-yo|FX}xcckuGLc^|P6VzRl^dlF40aLy#A_!xy2M~;R|Jm! zY%#FA-qYNrM2?-!ME&5vu$1$?8pHwQ(+)QLUQ(yFwa@*eiX= z&;ZXLH6!UlMI$7qFAX>d`|9*v)w=ogiR97iwUvP;dJwWYWi%wNv3E2Q?4PBWXap<- ziOTj5<}-V~6f4j&qyF_PWnhjfx6SC#2tRU!>JmuZgPyHVcDH}I5&Wm?!0nP)b6rm2 z+GR#xfVDVZ#xsMpROcl8kMinv8tfu}2a*26oJYdo7M@gE@K71(ZT&{CtRe(Lr?UGZ z8Ivxtazl9Z9&5t&xduacFo8%62}O3g{Q?e|M9F6x*IzC%99}Ep4RAf}wRt8VU^=%; zy|K5CCy6V=UALgY_cl!ZYLjc@Nv@1+p9L9PsJ*|wlqtr_+}jx+_4*yt{%Koy%&tKh z5fOoA5GQ^MV^F}<4*V0!N(A~s-E zu`RXI4JIe2N0s8b85V){vx%xD#s(Py%IMe2wxFK&j!k2A(gNAtyMhOc%Mmimftf~K z^>55to4iCG6DoSvK!ri$9O7!)Ia|`xPNn4U9Pu{1P_{){l+It#9k{kYRkBRk%Q(uy& z^F3Cm7|}$PML{p(xAdFhY41_?VxwAW;Zq)8_^03mA}0J!Pa5-o2O&fXA_k2YnEVVn zSK~!;wv!acN7KgruSG_Cxx)P6*E(@x1SqVY_ke>iBqXt=-#F0vK~qLnx{0Xo#hV_# zySnfzR|`!CfvIpZBmp0NU2X0wm0lOjae6)TowpN#^m)Cw@P1~xiKOp5H2KJGeF=m>u-Tov zz^aErnH;e8Z~ujZ3=@9#=`UH!O8hlueRA-g6_fQ3YceH&58w(8aEDH&6(aK+dvm&4 zldB8hS+Z;^i4H=$up}sQ2x&&|=J$&2;z@pUAdUpI}#vJGFT(CgBpn5Z9h9&`? z?)5shKz9UCo7PlDo?iwWWlO>vKLjY|OVY$%iAd&uMfqnTNb-=V zls&^!I*{mrcImcf3~zrjrmVvHgW^h;tEAwZzxi(e0FY9Fbm)zzv97t2p;`4aiNS_m zs;7z6SD_E=P6T%6qQsL0D1d=oWKyp&c6O#0hUt^6GB<2h-6bwQ+c(N^&5k{g_hMaJ zq(UQ9zUwlh+oL_;`c5)bcy^NOvJM`5$SV4e8r%l^8}ku{gZ=St>z{7eEXU@Y2mC=9 zXuviK*is*^_OGs{Ww^o%nOq0(u@!L#9pHj0bD4A|tX}5?RcGizjzKylMhA;$WNtUF zzhp+kOqGV8z2U|daspW800>317HQC-syW$&1r=o|0z%87$&Fy85PdP8`cg6O^IvaJ zMmzJom%vp8!tgKjenD^P=TdGK(Z+u^?|pS zRM|7bdc)oO^vK=A#IYX60E+*Knhnv5}J#H9@%FIRDm?nwS z8j6<=5MO&$H2|=+Z6H!A9URvpT&uJfxWr4ld@x6{`DDm z>UA_b26(Z%7>)xNbV!R8tXMCj+Ub4^A4?+oMKvPs^1gFJnnbVEwWd745k4?=02_LS zy}vcXNoL&h8E)10(s-wl^>E9{;TozmkeI!XHAjag`EU;YbUR+%*+FoUu0>M?@1l9R zx@XMWYkxI{$?^Z?HlehP&!iJuena7y0n`1)Zj%q2T#EwWK7TocdI*O6$ebwPpg8|1 z#QiohjRo{3@86tor&<5qu+3|&K4b>?!suWGe#_`(9EF?m3o8nr$Y-msdKvz7XFbmQ z*EIslgG$3qU|WUg$+JhfMgC4qbmyycN~TTq`z({?-p+-KvHu8vBG6MJIuv}&j^2Ms z^w}*1ZEAk0R!^vBxPDxOB=b6NB2fZ@7pc+*Wb`)r6UqHl3HZjX$h=Lj7cIVezuC^u zPsQdbbFSnx_@8X3o7rXNO;5K6gc~!|w5e3fDR7Pm@&P^1kSwkL$>ch^+WWr%?F-D}4V~=m5E*Y`pLIlvWt%4L);7JrMBR>2 zUu&GC)J`t)aHp{8;<6q3&Pw+s7Nd5T&NgCuRnh!#&2dcjvG4Cu0omJ8H$; zbpy><`PujUam%$v0uM9G@b_2d8{F`+o<1FW;L6!@MZnf=Wo>-ue%UR+wE-w>0r$~G z`SX2xytBu-!64#MB*>uwmfq6=I@JZTsZw1Ixn;1w5G{(EspHU;UjE*nDu)n$slwP`ual8fxBxOX0LdyJ7(j z_VmZaT(ZAEKLW?5(PEqnadE5qiO3DvD_0A>ha^?4Y(z}x_Y~(AKHRtTpDl?}P_IdD zx!a@Hb?7~N6XV*=c)+D1-nQ|e`z5wi(TFdf-rw2mTe6QkNOqiFo^`6N$4HAqyZYAS zK2VYq4aLF>83k;kx=qr_xdMDp?K-lB+}$S%f*eT*3Xi_PW~d-j3m2akr$-2THHhGVbzO)pd3fxrHDo z=fAVYCNdSM$1&NcCHs!B2-4bUykWA@i2t6i79~)*Aj9|9rr1#T#$O`M775HjJ(2=+ z-#aE4aPxaad}2E{^Ar?2E;%MrJ_)tzbbj!LRlvJ>v&VnMb%DOX?fFyM zlnu(Zuciu#QS z%*-rnQrrb*6I#O9LK9a)iT@&0<^YSs^qjs=>ELDYu9^FEz=ZnjzRMxG;d5?}sA78m z@*KDE3_InM!_7ChoVQ*DE!B=yA1OHR@Hua!+id6dMsH_M)U)aI+Gyr?o%UXQBnlYH zQ|xg^y2fwW5b?isC^YJ}$oZa450j>}-q5PQz-A$4Bz16l=PUW$S$qic)D9~j&Ut^v zRFJ)=qj7Z0aFnK&{wc(ISk6kkRNA$ONl9|bfUw+2bb8JI*FFCy>Gg|g`2?ZOLwuY{ z)y%X@hw7;Bz1_hVNrzZM6Yd?5o)D{gVTn>E{60U$*vXc-^o!O!1(KPp_MQY%5!7LTh22BIXE+(Qjtt9D|Y5Vn{y`s+uw<`dVFhT#PXzBwoP`zpKCO> z_!eyayD7<*Z+DzmO!o}MRMaQ9_wf zXI{KvZUvEhPGPR$bBg~Op(iTpsn=(VUK^?OKFBSVW{d7gi|20}2N}k+AspKh-}5E6 z%5N=h85Y8H;J(h9&A$HQ{i{mZ)4$vh`(=5(G{hrGY8k)ukA4IlS_X%?oiXrRwvvzF zT@|rFt?U=-+Wa?GPb|DQEmH?nOQQpq#S>rVtTw#R@}s2Ind1#02+VcKq8VA6+1msh zkiO%HHGhR(ogJR15wD$h>;%~MZaeR!+i$;%Q5Mo!OLIl0tulA9K}jUxyW$|>Do3b$ zkPl6tk`1I~_B7K%eb3d0D$w3cg8rfJa`4<)3o&N}rfQWap;CLITA1+dTF}DxI!<4hTNh7?@ z?*4em)!*w2Rz|VO6y4hD?|7rGYN)iUM<(L1@#4Z(k z;bBoZwNUXdn~l}qL{z!`U1<%PLSK7={Kuc{Z5hLqviYO=Szt;QTZ!j6;$_Yo+DJwG zz~u#Le@h|&X^966VKQHcCu)47sSi#sbwR;u+mqyXMzisT#So-#d`rWD&f?vi19!Lo zXgSYel3;^>l%!Rx2AlKOuoFgozZHw`op)(trVo1KN67c)kC`?hi;gD^PTT=|(G8=OKGBA#+k1ME&f=Q4C->QlP?P8MVJA!J@|L&d_Dh2c}w?Z|%<^^iMxIM6zwGgi9EeweiUwNS@hlKX`f>t0zcK0oVpt^lcxL(s(! z0k*@9h&}@QoEjG575Yb-z#R)$Y7*|CzqnoFv-U6@nk#>UD#N|?PdWir?BdUzw@Mp` zdyUBkHvQ&LqiJM0ajizk!mTL~UO(0x`58RYN4vx$u=8S#vqlKhjnL<59 z2W325KfgSl=KmBIjqAR7$86+?DtkW~p(RyPQ#qma+}?mKqog!pMPPt_G0|mCS#n?4 zULjj<#p3n74ChAs?aYSL{91pwHKSI%mZJBgy>iy72WhrDxp+csMS;UFVr~$w;vlgu z%8VWh%Yzl9_b2ZLf*gc$P|Y^@(1;77GClH@vn!=!N$OSb6egCol@s8DM_GN!!wy`o z@P)%ug z8_KMUp*O*gL?1+5uJIGK)tkIH)en!t)wg2>TreqeesqfZ;|1Dxva6AMZmuJU80j|d zLHdmS54&FqS1U=wH$QWR;s=NX&F!&GDFLP(mqg)M_sv-^Reqki+ims-bw=V^U_D#{0$Koymxq|(Wa;+7f{k99p51~ zBN35LVypWi5iSkJmrJ>}e1WYZmquD3%i;y1ikyFjiAMPRHYgtXTaJ*91gw%NWU%^f z;-S`$bzp;QVRuDf+#rFR=vrkMzmhG%%HSmCyL+_MpdK%Xp^Y@oXmY_4r%Pa`Ler+d zE6ox5F$e3?sQU9_PSDYbGqIk z%)I&AhRm3h3XQwQJ_*3i{ZW@h4)ilDj#~FyeGs}&@W<|?sg+WX_u>sz3-vqZRs*ZeP?uNH|d9>sSjvbxG@gPLew=4nCLmZ#5AGOzKVNzyi#LL-l>3{;l(BP zv+_|)ShFeOD?6ug@A~XposOJr8C&$ORL7=@G3@?qeO>KMBWPczMk76D-G>o+g>;UP zUY&pI6f0+9%#AzD zz(H~FDH-H)mC<_iq~-UtnCBX*Y^WEUq>37ixMl2JGrC!w0~DII9T%~+Wi}d^^48Mq z3W?)My;`jOFn0OBwpr?A5^!8)LUmVUVv452uluZcGEw&Tn zlQgXI=8xDXJ!rl$;1-El;wHt;TrlVgD_sE>gpub_3uT49(;(%O>TcSz)rGUuYs?0x z)*78gcBIy`cBJMn#Y|#$*^myTXi}d_QM{eahEelt$hPF5+N>6V()rDIj7M@K--#k)3s_jjU&Pzw+lO zN*<1G!oI`IP2Y@4Gr-H~UOHZgYzZp#DHTlYyzjp|dcQ@VWbnaH`KcWQ&b-pEm%bbW#=~)g{xQm|Se7@S~ z4!9A0je1sfecYbXs96T*jd(Yi@`?dDhnYfu-1EG9%yh&BRU34#<A1T z+Nzrx&*7%YGpt7v=jLbV{)FThAdxp~S=7cFjR4gaj>N$8i|XZ#1aG}%*VTY{rdT}U z1TMcQHvBBD^-l$rsjepJUSHz^)EuUq(sztHB;Aja1dZ&=n8-QH2eL9q#Un0Q!^#Cp z8o!UW_AZ^fAy4siq{Nhj_Fh)KT!~fMtBM*k_iDuHA4op-M1R`3nqF5Txt8Z8T;KG(fTw2JiTnF!%`@!y|FDtE%&k|3@!hU6!}I#0sQAGCu+i zmSr9+GOhgS?l?oQW#U|wMdCok#)mbf_eJRXhMbVIu0Y2Vb#lTs;kAhU?dtz9U|8RIOrTe28G z(SMc>#kQ{8d#;K=3$Z*;V6>kYG%s*z)`Vgj%S0H?wuq~7R+M3M7RCiU&U{O*aL2ENDa5F|&E$$2S7Q)_>OZ?Mtq3#q}% zV3!+q(}!viCb!E~FIgnsichpA>9)prU%1#|sOdmRPKxx$`9*WA$B8Y;)wA(*zpC=n zzv)S?_f|@IL|7)?GNu;WTsHfRn?o3pbWp70{jxCPP_|$K=c{lQR2R~zGL2`(-7UMa z-TAcVUBJ6&ogiD+E+HL8JJBM8sYC{!^$Mm8PLrRgoL)TIdX`c@MI$;p#PFPSRvi0w z5^q9iQ`0EXuq;7wzKijPFV<*WOWXJi^R)NYCo^l~>|wJ#d26~!%J=2jLpMV}Ix;5r zY4qs?rOgzP@xFYMPF8`zbII)cYMl6U(~5cSI9k+p{$oK{8D+7Ye0IT=vkgSHZv~g< z3P0c*G?e$2PD-7OXj-sF$Ui1_mSt=f?IB$J% z?_Ef&Aag9aU=JIeUWK92S9Lx8F86esSE2@-;{PrK-3wRk3r61pF=r!JDNAeDW)3B zg+^ql8gwM$vi4LM+LGX_cxCqx%nSQ$_;*5+3a~S5E!NoWMTX2VeK^a>#NO|+bg-*+ zmG_xRuE>@aJ(VIgz{tDN0gd0dm=o?zQ0Q8k{sSXKmjD>xBO{9zT1Qyp&_?ssmnvHM zjZn5lZ*^Pd^ClM)=E5W@i%AQ5Ttj+-8e^TZ=3o1>g`8Sc*&iIi@2 z^Ttb9?INsck{tNEyB1TdDI(ThjeIv^9*SYiuqE@u9l@)h8#c4m6QGx4xki1Blmv*S$BAD71|CY`oN{ZneV zj!_zAbYZel?8{RW=DKi|9~29B&L{j!sV&l6wrJfry+X$MARFy$c4go5DdD{Ze*HJi zY$g04g%Lu-D55ueZF)P2;3+%Oh8L&KO{V!Vi=VyuS8l&B0yTBFd0D*B^?ymjlTuC_ zbagY=7?A%zMDfm6hyqz-9I1E|?UjH=hr4 zMv?>tEwz@k#gb>C5VHynJh}`*24TGI$Wk3|PpSAW5!Pv+0IyvMM0v66(h~Pf|>Gl3mtmI_8xksm;btm7OSp&l265&#A!?+Bagu?`ytI zHo#?YU}1FKw#)Xsj~}+2hryoIr!Tia?y)RJsRS9Vci*jAr<3T7OY3wrPl%5wtW~^`Ny{I#4Z-QOjppvf{eEtSp(W zgEfo2!T?BgjCr3jx>VK|jjl*#T=8f8l3~Xbef&R;^*6*09>pwZbsVz9(y|8!bO(r@ z5=SrdZ2SC}DAkbw=(|9%h>AvY_iDIj8<8STDW@rt!zX9?&6Y*iSi#4-B$~osCGG_a z1tjm?kT#@9u$rW-ifnmtA-9eF&?u!^yucU3%r?^pX>2tpqH6(+iJ^`!&6jZ5$rw4k zmWr*?CMqY)My7TraVT=aEo@Q|@H7Fxq=4-tUwEY^SF&6I{K;o@TQ5~Gc%gm!`7fDV z9rS)v^KHOaWW4UB)}7EeU%cWLnDr4fmrunz@Hqg9GA?`cuz@F{Y>a~`5h%w*$&DW+2WA=23K0C}%@}U7OFb66(`q8% z)1CiWY~(9j&gw#vsp00wxC)M>zNA-%_+)%i*xa$B_q8^sJOm2p-MKn)?F)rfsVd}* z!qqp1ZALhXrO*eG0`g;MID>=g5HTIBn(=GI&m{t0VygQB_wTlN%?c(QpB*fMekW@V z`%fEZQU2fqaPvg>qJy{5Q2Gc+i3Hv`p^ybA_7HK_#*MIx8g)b;#fWU#=BPuVKOu7l z^#LBTq2z6_Op8I{5@Q{HDd~q*Yy9Ksl#(lGebqNWagICFH6~!KDA95Xos`hw9jvS# z+4~yzA-skDf(V&`giW?SqC(pmJ9*BeD)}Cl;69Fa0Q0>HLLqj1Dmn5OR^~o0NCpdu zi~6tuwl7&2qgSWhNJtj*i}B$%5A%8zU21E5;*kE~=L&UR+G0niY0w-wVgs7ZtkW^# zb4;%^A__b|%K~bHMWXn(BReLgn|hut9Pon|R7Mb|ydqI)61g6`@#TM%J&Awim-H9u zDQz3B#~nO$o$!i@dNw+yl@aFWG%>;eGa?eQxaC6fJj1e=p>LSM-l(W8wyV(Ut%DHS zpVMMrvG$eRNQ>qBbP^g(K4Xk&Jk}LCj*pQgWXd>v0+elrN9dvMC5BGx*d26ZjG2c~ zeQA*BUg-x`8J{0&jf-Zlw|?)Ijj;lo=;l~7Ez7=dyF2ZHr_#gT$KQF(EFq!|)tlBZ zYyD^;41&2Xkx4vPkaov{$s z<46?#s)u_;ql`@qbh zpknCbU$vh|mV0+AoZ8H|_aPTqUCP=UT_N;2dx_^DGH%LC1t3l z~F0~JwfH66OqRBVrlhGILPgD2f znoQ*x^uqg+5otK=Qg3L!)(kQ}Bw7JckNt31DeoKry!@_HBNBNJTmSFKi`jfXpCiWxTvZT`_`~!2VZ(SO;g0m zw=T(9u}yvRwX;B-2%c`|9kcS=ZD!vViEsJ7;?-2cFHp%!)Jf%8pSUF{UD5a`#(a;H zFFiX>n30n@yU#a&S0tmIDNs#B2N%e^l3Xz%B&1Veyd)E^fr>9|JGwfFPW%L4N<_%017sPsq*uwSz8)U>bh;>L@61FIbXX20PLtG} z9J(2rm-`500|!Ed5o2~Jmtfy1>sRLdXdm6ZkpT;2?UsMp3?R}>|c(g9pH67G0 zWX{i6qu&m;nPK^Bv50wNGIRFGBXMV+DoeQK4W zdg^R~`*iN@$nplAFtyh_Wy(&>L!!-{KSiv;`a732FVdKw~ZF$|$(37U-kgz6ax&G}v? zYkAWG)x{yP7-}#_hvkkO104h-iAEKhRZ)tw3TD$cn>2Ww>(lw#3{u)ZD^oS+#f==q z$R+pWbAOFJ8SCd{w1Edv+|hD5@rsG`Fp{ICQ&pN#nAm5Ud}N!=(B5JAQ&dzNin|q| zQFh1D8Kil)Dbbh!*WO5E?P7(dWzk6EVC}PkSVv3aGh8AC#-7j19Q^jS)>(&#@YLSA zj+)1(VG6!`9yu z2F%I>6N;4%j^z>WSw{UFr{ayw>|C*Cr?RnKu=?aw4MoW(+ZQu6vpDFaPhOGoQ-k@U z1%PtRnceRHW&su?Cc;7*F&d#xgA81Xv)w{v4H!c;l`a8Y{e({WMo# zoVAvjX=VqS{p?jQHj9x}np28EyM8sqVS#2mL9ZmUI134AxBq?jABuBZ-))@I;1a%Z zC#E4(tHM+g zWkc&eQKBmuB0Hse?{?k&0vKmwMHcn)ca}jCCU-n`sP+n#l4IH@^C&ozv0&ist}>lR zzf7(q(9ofg2u^6p-O_=x`G!AJPt^hc*wMwn z)tb*8v^8zAh{d0ssI$7#7-udV|0v`If3`OU^VST=JEBY1Jhp|Uo_y$F!&0@^sl6)J zP!{M@cuM?4$g`X~O!ZtW#$$E~OIPY^_|JaB$3)KaA+t~;4-w2zF6O^UNQ7P;&)2AM zfuMxWcLeDR9RbG@?t2^o5>~go4L8~RDtb*;<6s|``1olFpI^>2@!z1~*#V`W@6Xyw z9}!c#f%jg8c!J+{A4UCQeN{L*Df4Kd~n z#L}Dn#w=z8Xa-r2;*iaR$fOX7T&8E#bG*ZeKo;f#k~=@Xy%=9HIDVeimT1W2i|f8m zF6wZCZ_Jfwn3-Pl#U>Fj0RykXK7D@k5%(X3I&Pf{VKb;1V;=_cJJ>+NkfXo@@45?@ zT$QksfYGw81e`n;MZ7vUeKK#4Ndv}%A3pmS9HDc|4g4Dsps)K0GSrKwXXOzjU+z*xFW1Q7 z$K+TNfcak`APY05A1LVEOfEACZsXk}iyUOB|G~#o=8ZpU~fSXirDOv55-$#gUZV*dAnLpBP-EIA0WKNRs58 ztHjW{hMdi~Lb_&y7nnssx2Jzp1RD%jgBM1fgOjdz(I4I|J=tZo>Ps9*S}&*VSF3zC zexl5xD<4YYe=sfP@mS?;G`l1Bch3d}*B_~tu&MEjES5?h{zoYt-`o|hnDpLvRAf5J zH3^%;vXmZ?kQ2BRbKLkHUuWN>^txjg(j%<4=(=CDHtCxSfa4`d&@J_kYsk@-iA0>c zqTrc7yGAk>6=G92a_*x^N=nUx~mTOEo)Ms?NN5)MECASTUwdx@{Gt^Y?Bmj!Dy zdC#1X=ZuiwRSwa%qKN6xj`6MRZs`^k3D_BbPI>F`AY-H*>YCUw7D$ zQ8Uc)m=^f|5ZLSU0fWW=86L%Z4H_hz!Ux)ygIwD`Kj&wB>6Z9bbTGtWCrcur{xsPZ z%YSHM^^>Nqa+mAK*Un(=+@nfBo5b+O-D%$a6m8w-$~C@7ScxL<0nJv*+nCJG*)y%w z6Ydjgv2s&Q*0zES7maB=9q9u;XY-Ne%XB~i$B!wY0%z0^nIQlPQ7kcmSa^voI@}IP zcL*-cQ=j;4!goP;3Kz7G^C!qBK$YZus#aBTBFIhKtSvq0&yrcE8uPeb>&4TQPTuzE zM$LlqgZ^<;o)F~V*Q)^W&???R*drn#+#I^t26wY@b4Z`igf@X~w%l>Gkn6rOVlkq8 zc~di!1EQXly8e>sx?rZIdsfbsR!N#HmW1dpM z%BN_G&y=zcM$8*Pfr{6g#I37vKCXQwUQR!}kMw!$jj3j)ULUEkY@JP)j~Z)bc)Y?z zYm5#UIdqhDx2C>nBdfU`tT_CVAu9R1$C%!{R{&+-m8 z@oPg*y)o8TjG-1w^{S5T7?L*fB0-~bJ zcMe%IlmpW)?(`T?)~nm|Cs2HZSTGG)P?$UEe^Ho-=_9~o?i+4jh->#13!f2cj1c1c z;s{UGf|ErzG&Oay=J4JoZFDSfj@wUA(HK-7&0SM0S zyU`Jw%$+Hw*R&t6z~?C2Uu{xFA&U>XLCc^T#17#%p^uBc?u6_n8jbH49naN*3I#Fc zn)rIQd6coPN5nmRPa>*r>pw4amTBU>uXEF}k2=4|cZz1Gyz^C%{fHA>$>b@MB+XYM zo--726{Bm0V7O7#{TCaeM+eqznp3HqA6u|nnlwrO=q|XdE+wb=76lrasdu@qC;>P#pUY&a3@+d?8!dbKLmvZ4oohv|sPlNUpq2Yr%@EuQB4O18+U)5##l4*n~Xb{oJzx-|3%s?{AmrJe+qg1McjRY_RcN zfPwRAY`2o?(+yfH1KcgM0)68ZA7I`e9bZ0odH2V2JGP;+*JK5ZJ$NfjfZEXJW7fcF znSW3VYJl1JY1vfnEYLU2Qh`kYGXk`WHH$&r zu)4Ki#Ycb{YMlbS^h1v4nYv|MaYf67LYPdwL8NseqlfPTGO?{X$k^RvhP4aqIb+b& zp$e*UlWIq#(j!{4Q?=Ol<=rQ{5b?^a2xrIbC0F=|k(I8Tz~`YcG=h9m_{cXSl^`?L z&Unil|A}~Yy74KOVUW_#5jLJ6omy)D^v(z63sL~mKk;z3T1%|&H!?=aIr7V+QYq|U ztMqJo&R8rFlA7@c$}iZ6txYRx|Ii1&TlpQ&1jPF#3se`kV-~HFj2|P%k3I?l=3+>| z-K87ZvRr+kFXT9B_#v+6wdb~MJQJ)YkW`DB)NCY6;ml!m;n8$?_6q@KQF`0LypBQV z4qFsgP)($ui`bXkn*OByeV;V{^kFvpl|kDpF2upqDOhcS=blqSmnOavgr*}OEh117 zO$3p7h4Zg-<%``fipOnAzMb)mN;E06Q18AK&Y1DG!nXWdf)MrD-h@3S`MpQsefry1 z-T}ImfgP-(o3T6~EHS_olb{Q<-T7&BxcQoKU$R{*kj0H|<#FN3Wiu$4uK$P!uGWor zCv+?gbTGD44!$^)xJStiIG%iC?8xEU-#B>lDfwaWhbfae_EA3nH1BU~B!;R%8BVma zcR+Z6g}ncuA#eCxOZ3N8wGd1r&#o>BtkHbT@s^C$66;@5Ew6QHM@LY(cZ9WnClI}d zHHv&RZ>*Hua8K@84m&k>!*+7_kEeFI#0A@?8%&7oKZI?M8518T*6~z~zsFg;Ss+JB zW<8-6o>n*g;iip!L$(BnFsFu_C||4&Wg!AmiW+A2QMO7I!38Ruy?6qBPtSaY_L%Ze zO$6NE1uXC9ElKAD6&cjArkP4SJ_HjgCrAljk|&y_5bHOcFc=&yd^V=F!fd4ye_*+* z1h~Lf6Sfi=PyfSyX&2{2!{>bk$6!bUZFGUe{~~QuxX{6x1TvHFIZqA{vtIq)4jV6~ zCNjtCdnLF|aymcS#IJ7WiZVN9x>|;`a!S{1k2z*UJptYQX8&O=-jpY;7^qnLTtMtI zH2!=$x6xKidwxTc-@Y0`(}*F z+Kr}ksA;|HI(x&^p2wPZm%l7h zbN#qi7PbIdQ6ME0Zm64x3GhbdKnbWSdmj0D5%?Kkp3eo`*10n<$RC_fNlHp8gK_}j z3VW*qC?Cgbr9>+5+$#h;{CY)9z{>E5`fBXSJ_zC9ivQ`k?@S~kWMGo6)`oYP-JbmC z0v8uPX!OZun1y6Y;P#(~Egj`LzWf_weOExOoB?D+Z`)Zze-T;#vHn@75%a-OqUm7h zCcMkSnib6g`SM5xc`*;6%ut!P=>7GueAz9%{$mDr1z0VZc4*7YTOa1bWzb#c+*eBL zc~4q^LGgtl3o((HEp*Or$1bvGH1*^&uKs$uX8k3!mJz(mF)j|LuiEmRSr92 zP7S2W--edYpdT?23E#~laQ4p*Lq4eZpG5Zs*57}8Vo{UKvhjtr4K?G}mWG2*ugvX~ zg|glhO3yJMs$eu1AdqBe5rHWaiuV*{T|TnIz@KmUD>+V01XMA?RgTX`iAI*D=}g(^ zQvIJV;MF7dI0NOb<8oQ-&}ZoVh#{Q4)-T0g33udp$bRw)_||oH*+dyo)6=?}SN~ez zN!j!HW$Rz7W>=PXZ;WqaoZ=>wi=8~EZldV$+dk_NufHzL=d3gqWuKH0 ztMBb<5uH}n4<#EiEPu=?k1j+_HC%V0@pk&+6@}R=oFV|l4|H7;1urJ`|q?TL&5WM=$K zuP1DOON9H`>$+qhFKt077=84B6yKFd2$QBh$9DEfVJo%S|DozD1ETD@u9XlGB}BSg zL0X0`k&+gqL!?_`=nw;t4iS(N=|;Lyx@+j6o1tUq_|ACW&-1+BANa?`xz0Xkuf6u# z>vFwrnMPmHqtSZ|7=x9{79G?CjufEvc`z*X(frdMg3*B2I-WP_QVsQD<6&H!g&aZ( zrax=YqiY3OGnV;u^X}zl6yUZQi?AeDi!R9-f|IHry7(t!ccY!|9*j()mdXd!;;v&* z`!TgN@BFvB^rH=Ad(iLu6I7N;cC%`fdD&l|a8Ri7Gu>R4{GDJu(pD(B&Uw%RdWdgoPr4*MabIlh*%5ua#h^Lp2)B2TbPZuC!Hzs|QDdHu z04C0S(=HEYBfu2m!N)r4ExY@?y|uS-ljfy^(pfMl6s84Q@{XoJzqMq=Uf7~e z5`!vx8FvO4&Jas@_RP~BB@%KQGf(+75}&kTY5djuf>PA%c#(TGyu$*}<_^A#j0xh- z)?Qwes6k~_G;lFJq+LP-INUG9cCI4dP4XF_I*7l@({~+88r~jIOS8&#b6m%__JU{y zKAVjc_$+U|aq$oG#>fLC@n0>@nrvi^aW9DKu}A@0t8Ziz4QsL#i6%1Cw5g&y_-E}M z#9ah1mbQdaEYwm_9!NsBsNx!=|LGOz?QRxkKr5Ge`3=~w<3WbY5JQ~QgU(N4Feke( zJ9H#-|1FH%IT%*o7GX1&z+5r0px5(!GE_FX5y%mj;RF`7v8M_DqU36ohHMWZ*if@e zqDfy>-_?R6R*!gml`fT7Si4mEDwv@f)B&$Lc_re6nic@@eACTvH!oTk-d_Ygcfpj9W~Jkr+E<-z7N(D!=vR|@40T5}Xb<~JN~eJvBycB)(N z%-)tS>jf>03)98*sDlphz9%h`9|tNq`;0;%nt+47h4J4>%{Stx>4N3x*pnmX2+P8V zh%bsSA4#O$s|h9!%#D#8kJS9Co9Kz7Zcveg%I@kPdnZlYr);sO9chn%*q{JTd#Jre zMW&=8r=VVHpkhjgRf@SXFJkylc-(ak;FNV@CF_z8vxd756yh7~ZXZ@f6)4QMb%~OEL+Oo62P4-s; zP84yREid8EhwcGn4leu-5)&Z9kEBj$_EYC zAL&URYrb(5m>20}n@_0$6P~|7KP~gyBo5Uu#cc+_<4T0)t?5s&_-K9SFj?O(fx&3}G&6_?(6QbxQ8QQzYG zblvnf50|e}{cS#-nNA$_JvQ_0O%{-8G@Z3ZTF{6{wtwdn{hI-g?x9dQnbpD5q~C}R zzb7^+Q>xXeMen#Sw9Cdixcfahwdls#+l<@UMrXI6f5^Jc3q0Ow41UjiFhLg<5hb;5 z2h&>*}ebJfwEL%`sq{{@Vizn2h2wJ=R6yME#T zN436gj-a2P@KGAIdYz4F`&vlZMgO_tze8<6-sQ6N21$p)ZmYM8J%mcu$a_JfIy7SR zFR-&aNU$J}C{sxUt;v7~06qB60=?I;-jY%!CV_UH@5kx=Lu7kxk?B3BG5N9>P}XI8 zw`L?nXN&2Fywzec{T*m8_k1E`^0-!eg3o|4ixtKyXJwq(#PmVQ^N*PgIii3Q2v^e8OeRktAk# zy*g6!jCx<~Eohm%e-E6duxYsz|C+aGiqzZ3Yt~*Kr~v{`eM^^S)iDRob+1MvPI^KS z`b|LX#UZF&0HG5JMr{%r`s+MUm^6VjU}T2g+iObynNPvx6`5?;F30y&&oVAPdu4z& z@z-yI1)=PZw85lqvEh@eaPk7}T_)`+8=t3;z7Er}DUWhYxv{cHn^V}^K!?A&&1ovD zNa*unkp>;}_h2T2H?}}_8;+__&B&9V`6OM=kR4iyl(v631e-p9auqpya_jv9{$DhE z4y$P49=aOmcxL0%%awXXI^p!l5`ElMWFNA@ZuyN@xt`h{57wz7r?sTv?p9--lsgj&@+Xd<=Z5Ypc* ze^|X98_87za|cw|BzlEU2HUH9}XpK}p+dAo-7>A}P=9fn6A7 zsSn2|3HE=5FUfdgJp2hFQp*{5+njIhqT-)EBDCUXA}bA`a&T;x?=FJG_4oygdQG6N z_=TsA-4NV!7DrFHx~UX<#Q@U+54G^=igFJRxGa15fI37)XUUpf`PZ7W`=%a!L}8Qz z`*-=ng%%tDKW_Qo2Lp(IOM!BRcl*eyZlHQ`&Cc`bEkZihp0(#kF%WvJf8atgZI2nY z(S?O1H@|oqZZN>L)L1AQctdY1^eQNM_<>Z8Fd3>G$W3|5Thh_-_>+=oWI{hh%U(Ni z)S53xsgF&$-}SKGa!fXdbnGTiT%766#j~0Naoj}mkF>Pi2(S?6Mf%$Y(iyHyts+60K8K}ABf=eb3 zcAH}Wl|_>pdX~oR0av`6-o8YF9wrOBnQ3yDq1HYr_kOox8PpZsR=pSKo5(*e4OcxY^1pZH@q_;t9fYAjN6Kdp0?wO3A^P-m=3UbgZ}J^n0Fj zJ7o+yy`1a2J0xQ11(N%;-UoT%$bWmZk1W3*e$BNC1?|z8tbKRktEnrCZ#P@=9!@Pd zrEg}F6xsjrc(YV_kC#@p)~t57oaxurT@O&_XZ7p7T~NxcFM&j4)!!r62up zIvdPod=g{W0*7nf-8rz)nA;P-`aWJe$~CBbt|SpW{sda8HO{cN*{aK2n2p#S|Ggbx}e-^w1WzN%@)s6ukvg?ZS;JG zedqQ!jH)Plcsl$DQ8Sh8R3ucExQXXH#*%s4|+D(!SH>%>`8F20AX-&3G=-hUCb7Pb(=PgKA4O9Qr^1M|@W@?- z!S=>)LNiurn`YY|Y=unJSsDNv4hGLZZ+YvsCWnFwkNH*iWr+ih*BR3xS%k23%C*km zY75WwWR)I=L1p)sm>5)i(hjEFa+8>HUU-ag=k7#=Jo|ZBQw)@|0rIY(R0U*3i_5G| zMkKUOC}DngWndpsRW+ig9aYERdP~Il;Hw85W|E2&Ih`)C@?!Z)G&6tZ1B$tJ5^|&L zi`k+-OPC^wLcU4$do8=2BjtW7n5V6bsGSl*`TbGJL{Z)Y%J#k%q@|clyfAfke3d~> zFw>Pa6hDv3cg3jAZ8iP#vB!IMlo;=HjK?B=_IY4g>l0D_twVf0xx`gxvV-A6dU5VK z)rxEGs1J#FiP!MmooK&?vlM*B65s#_+?P?~_}Kx8rh(7rk2t;6sVCov)$4BbJqisG zXLSm?s-2;;m#){H>C(DxF!DYjKL6NfHVm|8HW&#CNy%CS&Mo7svkl;g^-m++YrkeO zU@t{l#jFS(>O?x4wEx$M`3W#Gh(-%&!7l+K_4>*?eSz}J6R?1BZ*9`^QR_MyQ&{nc z@O|rq!!|b%8sav_PNQi;uTF@qy_99f5{QM9FOo-`(+lbtynt5ll9wJYe!$q){U<|T z;O9fcnA>tNTxLIb{e_{?Y+lodxPPmK7|%le2VD zOHz}x$%Vxc3)zCRQ&c_yX5ccarJk|h$u3C7O=PM;OAO^qTrd4i4wr%S?Rd!^na+NLLRRmYtUZGiZiy15j7A?u15(dF)Z#MK!3xOecNtx-G;U&1=H<0n;z> z<0s0X1lT5SEn+9R*|qKZD)Itob^UHBcIlaZpH^&QgjKCbM`Gpo2#+GA(W&R^HyQUD z%pB9wBS-D2N@ajDHHdrQ$$zeOlOb@eD+?n`oeiJSjOJFV^o`GS^EN%IxzUVT>qV>p zpAS7~2X2brjNPh2L%@VS^rFm2hYjd^{ELqbs52SrvCSRJVPYwMX@AVs zCcIs$_ryla&1gQ_)pEI#j+QE(08MgMW!%Q}f@*R%U@Kz7metvN?yHBy1O!y4Ld0j` zbM7LRiOQoLp{_zK7`9E@rkEsEGTKh^qNvmiP)<`2QH24Ww)ZYdc{X z1Lc)17>Oi&7$=ku`vfto0!R#ge>ikv0$PCpBY#_FxK{rV;(2RjJ+&>2 z3ET}zw6#JHzUr@o=ai9QSjoA}Mh!u1k7&iesydfhC5UJ!E@apm?$+3+gRJhQo{;V9e>d}-E=!#bsi z1{*1ZfqcAVGT%*hO8_CpfSO+^@Nr1I_+00jPz(bs58J@_&;63STdqA**=F0t{GE#? zt9-b7z^M}4uDW;k=#GdPDc8+_4Yad5U(a>PV%Z%I zURtq{Hvh?LFg4-9P!CgZnLVyCfdPRjZUg$?yd{(x%C#i;grX~Z%KRW{76^ojsrhm4 ze#eV*@XXQ#t{Bd9jlMOV1vsdl7>Je)3|uZFigoW9)~i=QQ)md($bIr7j3GoeuAK3-IO67pU+PZlJd+a$#KC?=kzCsl*XPHRS>tG zXEYrAHtzLr=d8_$2@Cci2k!|E@_QPYWT|{D!^#->P>+>D84skDEp>kJO zw4D?4S1zFmIfA*(5qTU~(Btv#x{uVImE`X7xk+*~+Q(-7{%f;^uL^F3pKtcc-LP#Z zD-BkCk8LMsEyVEkV(oqc70}0~jWcMSpyAl@H&2|aFT{>0g~Bvd7d4DZxHquJ@5#YA z&T6>qZD%Io58`l_AE z;eh9LxRuBjRm8aAK?Hw~dE0;r8NZBS^`$V6-9c-x#q(2Cpf;l%fV5Mz^J)DR9O@f{ z`T~7kU$mB$CgKU>f(*7+ZJFk?Gf@s?-ogVV8|CT$uC8&O52c(bh-XZ-PJm@qac!hQ zZ?^5|ZTwgdew?jlj~hN)YpDC7smCW=+V`~RbbxKQKu0qJXy_!~oPs^$@ea_=;rfq# zjBiK1QNumBBMp9n-_afevWNi8E+YCVAwInSEX*h5P(Mhd4KyvC@P65eKne&wmdu>L z1kSoWwaH54Gm94SJNwMzyA}W4OhyQ`tN>+Tbs}Za5z9x5g1;F&eI1w50I~|(pJTpT z6R=J@WJ13Ei=L3l_y0E~FG3|#@syW}o#W4{o*wvyg3$9W_Ns8Yjq z2;6vrOE&a6!LZbm?p+dl`He)_gC@zGQN z9<3Rzu+foF!-*J9N6+uSgqO;+c|Bfb)*56QxYih6hT0E=9M}&iKCz#*Q`bvFH0an|3JgXTZ_;@{x-QbI;Weg%o2a={w$c6vA@vLoDEa#usDAof z(I*-{1GOFfuKh{c2Xj&k>e;>M>AGY2vx!B_mXhX7)XU5RRuviNCUSQKv6K8}@{+VJ zZ?Sc%d5dxkJZ~zM5dIK!D5)m*J<*BE!yHMt z$Y=-_e=tFQzD7BjT4ZaNk6&&liH-D_-_ufyIHln&C%yR{i&eGv)nPBa?$Y85+`bq2 zTZs(4=*#cRajov)fr8JlBf^pIR=*;wC``B`Qy(ktoz3^-`V)~+u$Z;O;dfR z3RVy%H$M9sUeS+-6o1W7u0?qVVLWC6SHi1&;L-?ljPZQ)!5@)U$uNXYSZ)OmuY|Eu zv))*8j;|Y=c@2G*hmy~v6*+mIR(1{xB9=61tlDIu;?f~OLQDA~MUuT${h_34IWuM*^^RXh9xYb&Ng;VBio zUm%6=SoB^gA^t$nM_UTGCqBunno_JYQjF?rtl4|(=hxcVPipR8g@+-$sIl}r`x0)c zVPj-9T{jk-FWPL3)Ovi7b7cSvUwAZsPflPhw&3mE(_@6JngO&U-(>Vl{`L5f(3jDh zR=J!5raTMLc>ntPJq#*_Ar$J`R3pSeU0e`vAdnPbQ4`2$3IOG$9i(HnSw@~+Et z2DPPV<>ZlSV#&xO?L6m(_a)on{mPps=WvG?hH5tO`m3M19VY5Y5{AbyzZ-{NdF<)% zS=ipCegEDcjSP{|Yhht_ryuP}w#NL@z_>z$yj$n(ie-NXh)rR{HA@bBJ8##wx|V5w ze9|#z={Lq)#UP>5Po*oax{mNf7s_=-NhJsVFx6U z+M1BqW0FoXv2xo|7}-b&$;Gmc8ZuVsGM*=_Yj-ufu^xmIC9$^pU?pAF zmn|WolE@~AhnWZ*VjZwD<^kUz=Oz_{s|kA_EB^Bbt1jYIVz0PcbvGF__l=d_i_yk` zjGWIPAF8g>;YsP{Oc{@%_Ry}KN^2xMmvB`mkgDnLem5J20 zgzH>es+igy@0Ajj-CjdppTUl+gMY{%qC1xDk!CY(Qp~Cdcaztg^%wvkG?LA0wxQ}!# zcohVPQa7(V*0>55e`kEiKPK9YmGE|JC9iIo{=3uPbn3@{p4%s;(v7>?F)m@bL^e++ zxyyDTkaL}C{IhIx_LJ270aOdb0+o8gIxYhb{(0(e_uED9NpINjIo^v8cnn=Erh8x& zo|bsC&CwTMl6BNOxvdNc7!z@7-O&*@m}>ThwtkbZDu3XD>r>K|Qc}WMnJL@J zCsj8^OryC(rN|uAR!Xk4e35OnRkYcyE$rc>BWaYRpq$2z)_o4!= z1_FrIfQ2@^yN={R%&#lqmz78#+CaVHW4o0az2dLB9v-+6v`=l()U!G7>b+e42u{z7 zy8<`GZ(EH;B!By%-NZM&XgoL0cSFz56l|@(yE9KMiYoZPgQ_qBiqKj&2V& zX64Oi1e6cTbmBQUUIn@JdTtV)z1b$A>yI44m-y{+`yM{b5B+(x--bUrkKHl-Zs{+e z=qj+UqS!pV$`zPYl1@}c9=-jP&+zt&L8#O*rGRww^~-)i{eTLaRgGcDPW5%ea_%Na zY*N8fxPWVb%8!Dr_liC;>@T_kz&bx^yhmfqAhgldRjEG>F1U7$;kVM;eT65elX2;M z5gY5@r^+f-kO~4fo>m(Vn*TS!KjD-sZ~RGv@L-`0uIG6)6L~ysoalit8VJ!P?qab( zMhRNrMqL;F+;Pw1)0qj(en3I%*M!g~&d%p}^FG3Banx<)(BXz+{ywP?xaRSVz`xM= zzzdCDHEU*BO410@>J@%sdUNo~^t>i6#7o2w#vnWWgiNR_9}Z2cgDZDi4Z9Cw4h4YLMY9V$Hk zXJeqJ;wFB@wXA&2#Q!qM_H3)zO%8Sk=`Hdy0QKtslXaRc(A4W|O%z!w#$<=v0za?q z&A0^`6T#B3;EIvd=AxA|0D(xX2^%yCy@hVSOTulThxbIfVkR6&q_!WNP0%@A{Av(+ zB3AIUn2h(iz2K6-CS4*OTHVQZT%ft93v?XcWcbCc+YT6yCF&iswc;>Vn|{60EV!D= z9E-NhGLr?5EoQ_m!GXG)7X<1=EZK*nGYnKLRa$Jz{rtP#p4@LmUCo>Yl(CF`tj)Sj zJ|=eM{c2hM-clEYv@airQ^h5-H&Nym)&3%5*c)sfH|=qaAkpNLNqj*dL2Cd`??!Z1 z>esu|NC&)~N3asZ&t!cW)Fiz&ZfMm!#@0ujWKwYK0$xi^3fH z9cF968Sd*!H&Ic}hO=c7fLceWin~by750j%kHbCBvg7p0tR9Ae3c+X7e{4x05rE2c z;SP$aMUB5{bTdTU*2qH1w(OW%WZW85#1e+p>+mzdPPE%AuT1# z2QPoBb)Q&gE!iu0BV&c9aK#n9YztVHkeg*%jB2#E{rZ8-u!wP=C!)+(nz$MB zeMfn6h~C00Y2~Zm4)MT05%uBa7 z>N-CA3kc0x11TME?MdQsj%duL8W|x#ratzd{;WLTfSl{DUtyDqBf+M7|K0;l|2DTn zKYH^1R58EY+LxwpR~yxrL$7@PRNa(3=8Tv-Q~7z3plPma zi8Fg)2@8tIhi_AJE?V9ex-x|aXycVp!|gpwlzvcuD^W^xrFRvyUDJ^{`i~Z11b{P` z=erjcQ7T7Vo4>YQA5Wai+M2dd>NviXeIjTRd0)67VLQrrZt~Y_XPwi{{7hdp-wAa- zNYj&>6bIWKMu6rQ@PFLG?hql5YAXjfaLVxT$f~ZYo=^M2ax2b*cFMN2n8jeuz}EYD z?rNX}3b~Ay{{X%|X*cCcS^+ao$8DMJWl_1>gsL5ioSC}dRRna zB)Dz9$c;_3;dmazn|iXt>ftpyg>NBe4PwR>)RiRz@8k~P<c@yQy-*Up=VDv3?)>$RHHr{qysvS`V$Fwff`K62cO$s%F{ zg-OjuU@~o;CJDuSVWibu;lO2MF}PCIU)uEotk?O_`hy+6qni+A4mhacb(2^SHMfD} z>D+GV`^J;t+?-KzE znT>*1oqLBoFhlFjCis%myRQ5vTN=ry$AY>U@<|bU8TGWkAP8Zywnbq$jh$c&=w?*tGZh0(D;V|_KxqbhMyPE5O z`EoS*R(9Wf9c^PW?H!OiD?zALifkQy{7qxd@wHF*IK%$2!JXi8!CsFGPszp0$BA-R zq0^qWWgBS_W8-R};cU$S5y+3Ig4#DhV2wC5Or^;V7s)2!)btUC9^s~@2P%yX8YRcq zCSC9Yq}v>p&0r`oxMo$+F2{q6(2a1mrW<6bz3r_K?Useep-fpMd^{w|#ZO;>Q|93a zdlcpurCRw4E0}U?5hMBQv=)SU_ZEY0XZK-X=Y%hn`A4Dr;D)8go2^a+|L>?q z!ilmb4QdUC!4g#Bk|YE%I~7U>nFWwq4SeDy;d=o^#iI?k7j150(+EjUxoJ?8Ic$wi;rQ>5E-_Ysr(i?e$x z`A$@dK0Av9C1^a|?`^f-_%#Xh8jCrx1c;ksn|ukJY{V*O$30WIwX`6{xI)^f;jzM7 zzTIHrylX$!se%Jc*F;BZ#X|2l5aZYWOBkEmI$`bD`S%EJV)c;?pPb3pI+Z@+#&9T& zoU_?JAvs01S#&Eyr2@UwJWJ1W|B&%#T265*BVefupzVNX~(b zv9nTh#fSsFjaS~3rScu=b7A5t?KJ6)7p=ti{4Y}V=!IRkaiuvJ{Xu@dtNK2kd%(Y^ z^yv5P1jriGNrxSHj>{)G--k9n>z}2LUWXyVxrpp!9^qoMqBXde^hx3scqE1u=xw+b zFm3j4vf-tS$m$Y1vl-}JKick9ZSwQ0U41C%CO7a1DN(lZXrkOF?$Yjh(ZyBX2zAwl z0i0#s+VLm%q5EQ+mMQX1-0sfX!p~f)24^{iMZgdV783ZqJe?*n7{YMxVMAF?hx`cX zXoJwO=BO9m(c^Ce1G~lcnQ$ot3A5TQnFn#%J9kb0g#%=h*=52HhJ&-w)GgS*HC!Bf z3EdHry>%NS>7MF)fmnJDJ2W%I1<6UTwM>-KXqciKSz@0_vcGl#mG z$U10-w+1sGP1}(Jda|Puo;Gg`Ej2w}=v$sS#EP4H$)AX1v0bU3)`^T`b9QKw34mIz ztZ=QvG5w$L8b+d9`#*<(TL1ShIPkuybm$%YW-?#ubgB^a!!@#P6yGb^X@vYMA1Ih- z!`nX2rXVL`l?H?*0U;FH7)WB#UAm;(Q(A`AowH+?H?9A)ovwZv-T&tY@7JFcqZrP?7+BB_jf|eKiCs*|=aj{_7fPSwi9Sl4 z#}IOT^C9Ly3TsmQrSyIz*haBnlbB&i1t`nR0iTFwl1u#8BtcbBf0;Yu*Ilxz>etDw z&T-4vKC_!2r{m$kLUU8HFn*4u_z6&h9pG8iDz|22?@jahNG{{>d1z`S%RLZNHaH7X zm!K5!zuxzTS8|F@KnBm08{FUde)Y-Nv_p8v3h5d#H08*Ldpqe`BsjO<0!ixE)x^Z6 zmw!7l*lfXpSss3;t&xTeJ(PVf%M;yVNN=}ewksb+N2-8r^X4JAFSWelCKjEU>brm| z4e$WMwQdC*36>#9pYZ+s^A(LmNb=4wPM|wx46KrM>D5qH-WVcBfjUNarN_d;HLgSU zI3_$yK&OxquVp|}iCn(R!IxQS(69N4E1BbR}sk7Go6{Y=^L$5uW<4(4dm13m)W@*-TBOzwz`;aI&jH-en&1j@u?C10-Rf@hZyu z=3xGjTkd+bY&#tviAF6=G8pRWTZ(Kd|7>@&lO)xR2ia zvx!)nzi{9sLJ6Qw%_=>Z_6NU@qs?YkgZs4oO)ikC(w&*nTGu|TCS+)F)kxp|ai1H_du|$!4f_Jd!KY1zZh{2t1TKl(NHvGPpy*Kf z3Nn@+R!)|EEx0Gk;#W^HCxs?Wo@%8SR;7Kkzr}Tb<4x+T@2$H;*0cAPb0RXX*B0Oz z(3qV3=2_g3Spq<6E!?}?gpqQu;L7@=NJV`>Rj6%-=DVHjLZliKL!cJbQOPHV^UXi6 zg+z`%P_Jqx2I^M%Ezcw5ifU^e)s}3}_C}6Zs)jR9OIY|kcGuJI^rXk7=I&T0?~zQJ zG8?Tl7ME-6r2cV}^yYhV|ITfUZp_CLr_y^G^E=sVUDx01({;5P%J@yI&zoytMk|c0 zXrd#U@_35xoU#IIN3-mNr<4n6b7M2X4b7u6mNY9p^RlYg#p;z2&N3a^FH8=>Gg6QF zpHaWu4)QoLuMdV3OM$VtQFxdn0LV3H$^%oqMD&MWvAxgcc9-`v+4ARn(`sR(sy2mq z(6xMP2V6EZ(WjDOj_b#I*l6lQ=4gR3lV&_M2L1)Y`PsFx_MBEay}EeVofA|{TvkV2 zJRV1mYQ+a5#c0AOJ8|OuzJH2aO!NVBo^uN`D2;G8usl0A;?9;D4MEP>xBQ(4!bciW zXceon9}d0Owpr8&*3&Af*8Q>X2cDTMY;;^(CN z-ZtszL}s^N^uI<Pue*pQl;Q`}BIA1KaI@Y`FT76T{1OIRpzKtbhgLwu7d_%Zhkhi=T`uYQQ(XLF6z9tc1b>h z)0TpVll9Ij2TJAYyXCGs)N2BXWe4jFM}zA=qrN*OYNEY=DfP!=LjDY!7M;Nhg_))< zeq^rNuuN506*OBz)b`Dg}HZzQZc#Ro13(G+_d{ zSP6UO%3g4(5KtB7#|$;)i=2dXeGf}CYmXjRN7_i#p|X$(U^Y86Fly=c)@nGr+wFv7 zZ1TVzZL-Hrbn{?5Vr0PPXgpu!zrB!e(;R_e2xCY~L5v!6jP7!`g+&gZi1IcA6$KFs zKjlvXIe!Ub-<00uOWqB5t^7URZ22mToupr?-PWbY(R%1zR4aXc4f2es^+3bE2rM~KA=uF5Q%(D+BYfb_sg7dzPVPy_jAd4YM~zJD!Vh+^67 z*R*j@8dU#2I=X{KoX%qSoOT8cYD3iZ0aV2tN;(rfGsnsoUT#-1I;X2%$}L|2fr0Ug zUgCE2LrwB9roD(Wh2{J{;kVntSGpkKT92-X`1A$mlpRdSYF@QU)mO99kbI#aoy=0w zcB*^02IJ5wTo}rf13&ca#q;VOkt{QhV-DTTQ2U|gXz)Z$S`Hq72)}FF_$dCM7tJU< z1a-;$Q-xP#C+He^D#2{cr~vsjvK}e9`tVt8n+VL zU(7G{Y{Baf9J+Y{$VBwD{gtS5?E1bmPwnPKNj%qlQ0b2p8CP_h9{&g^E%p9S?s?$< z9^1uoQlEI*HFJdXRlafQneu#!#p;E<;{Cg~F?vzR!JM{oi$SoS&L zF3pTaf#)KE)zi}gLjHdW_#BAy=-lrRa`VnWma166Y-H@8Y01tz(FT%_NJlEtMf?si zo^@J&5@*Jw-#Q8rELI6v^e*qJye1eoa<(;5U~N{?xTkm47RTEAnsL7ZO!Oj zo$)$3@TE$p4oy5u51jh+T2!h8ThngrmER#V-@rG%bfIr^FRK(xpl2T+_($Hmzd0#w zuJ86`S!Zth?P1t&!XEKRJ|mx{#C>gK8DVD*^$cudf~R=;J{6uPkxPU| z$egDy&^)0TQRmcW%awqvGO3LPf0@Z>7`c2BtqkLQxA=SZz;9fic9QJUg5~P`m)BEv zVcHY%&AkUdCzSSB0ZXRJe*0QMl^ufX#QH8S1};iGMnL8nEoUCx6z<8rs4Mx?=%D1E z?npconqe0X@|OjuFnGOkKy4Ls{`tJ{vmG9=f=DAE^;xF%aA{6Jz+&aE4e-L=-#k1^ zjnnGppYz#m^5>=pL`TJ~8=||&BhSR?9`FGb1+C&LnitBAodoFsOO}W;?#zBAVRZBg zzrZd?0Ub-Pv8d6tqbQp@Zqd#9NI`c9#(m=I)8+K#KfkicpUxMLxaDKMz2Or6lKAP= z<}?)G05n#K+Ybl7;53))zH~|Kc#8DMFb1Bo;ks-RoYd1V`;ic&0`;+$Y_~(EaEX7t zm!>!wyeiq0#S7ZOjy@&%I}lAP)i-+Dx7|^UG9f|g+@#BCvY!2m^xHmDdK=J|R|9(? zt@vGtvBU|ft8==r7HAmcYwCm10${0e%erV(ThQwl)xS2{g7oa#wWWQkK?8o0K*?-! zy%E3}XdxT_eM|J)G}wyN!n#G`uVWYb6r%F+i688LM|2kU>uDVf}6SrA8&JpwjFuQ}_hdrj_DGk_bp|?;~*aL87^FOj;cs{=bHR>*iO_ix9 z-p`OS0*8J)D2`Hm2nVZ*gHxlduRfHgMvi^#x~t1>gq+$Z!!KVZ97c1j3ne1S1 zfaBZY9k;+16aNQr*Di5lj(zt>E)@_XEkHIE4%OiO*D~x>DR2ue;x9GkWBOME-v;b8r&UVu(#+a*x zZ2sf9)t*%`$ylezT-BAU-D2XdVx_6&NAW0Khird=|VM#>Dr;6MElINrxI znjVNut^B!Lvh;w@!3F4q@;Sk(A_`UZTx-XP2amj*lMTiHQuojab;@BnewAvv`)?@X z-dNO4qaR3gT+)p1J?7|CdWTU5>KGmW=_K0(N7xI&pXn{T0Zj1Q`{5v)UH`28VCUl( zff9PiB?IaYVH;+1)^p>_647*^JX+raMwq1wk!i})Y?~pUNFGySX>N0lv4PXLhmcFX zeC1K##jXQ2-vwpr!6^1afNL_8e{hMbtj@Z|9@)Scp~-`#g}*!I?4vz;<|@OCSx~23 z9q^jp?>SvYpuxvGjhx*liHx=;ebl*tf#PE^BA+_v)A54%wVX8Ad|VD3brNL~p|8SMyq{ z9#;<+$B{a7031ImKePf5ikfE>%O#h>b7d)1d>yG>HEiIkL8#*@LxTcS!Vh5gKqrlT zFsHicY5kSOaHZr-M#Red?>P01$2O=gko7D+JBq7x1kYIfz31eFhS#r83s2vrn^OP< z%&QxbDnkKAwa5uvCLk6mk6|(6Q67~|O`3SQ8j4{5sCPINL8@5)Nn#39H;MUb9wB`@DI&Khj!C$iB-Q6 znOQ?*!jp|?unQSFphwy_Z@jhB7ct&BuIHBL><85Ze!h(-LpM3W8igMuZwN^w@Jj#F zjqV__gLDhg#^_n})WU?jKDKzt^}Myuv{C3(#t?ELf=<+n`Bk8@TedTMFcj z&32bKc*GVf66bL7#Q_i6-BYDEs^j52YXLnOv@AUiQaDKWtS01_0>c|Kv#sVPUp0avUZ;kBw$HO#I7Dv>8z4-h%Z zZ>nR9`rAw}KG45&N!{VuJXc`i+|hk5*~KWZ^pu?~CKpD6Vevck5xC45z&Vf4J=m4N zadxK1(rRiv7RjR@Jl62Y3Dlg-ZTf+w8OZ=^S`nv64Cw`WvQbo9{e_5*`?_n`5 z{!@R#J4ewSEGbOWS>w>kg#4efyk{m6ft{j7S+7 zg@-s2*_29@Q5hj4WJC@s6lIg0Cp4@wQnozVD?~;{j+uF6bG+C09MAjvJz z?RMSQeSNO$bB+7!?CR7}uiieJ0+@G_i+%iwZz{}Qt;lhkB`n+UsMDd|GuByGrWov- za@<}7dp^dzq7di0ojri94mKFWO;|$uNxSab@2<=k@s7_AQw0b>oxJAD?U)mQ`sjSK zO;xqOWVwAb{m>NUqZa?YHMG)AIJ=AX*{43jN3(jh5jqbAEHH2#R8OdqvG1vk563fb z{a4@5_6lQ@F8=6WlspdBk^CeH-YwedLM*Rjl z_zjhe?BPZD+FVDb@2skV7fdMCQV+O~Ou2jyu6feX({u(~>HKl#TTy=#U%M>KC1`*S z&O}XF9nDFUiB=Bd65!~LEAP1{=<>Yzi*Qy_n7nF&WlRGuHa>qvIC<>pixRCDeGgk1 zg;~JMi!7Aho@gAa`^9MG=&LndI$MhSGQqZKs}V{Gwjm0(G2F1!-`=L+`$|#KJ>7Et zT=AIc_F~$|6q__d`SjYk(xh!Xrj&bqD^wf^F)Q0E%7$;mc^iv+9NQzQPhysW-0B2A zqdLdMqRKaueCs4W-%s-bT@+%}K$bPGa&d?wWhI>JQpkNl$tOt9#M6@S4HNIlYItH=i3Jot2>XOs431{tPYk- z;d>YxLU^%<>KFH3Yd1~kj$`Ca5RH$I7;2&W^o>IRkc#j_Wmo3Lh+Bh2MndAohxHv> zqx11!zuYj#*I(GI?K=1HY@T&TrB#iANjNKbAv24Kxl=Cq*~++#EXdiVRlT1Pmgua0 zMck)vNhxIh4?{?+;`&KA7M8t{SN2xTa+~n@gsO{FV|vzxZ{5^BSIb+);~f>(0>bPM z&%nzZCJe^1X@$pSK#Z}z|K|?fSy~FJ_YOi%I-3`1O)@os$f|*$(eW$iQu^KJW45QW z&Z^1xMrKJ^OumqmVgBY*+mvrU)=_(1-ldgTowS2dw<+D|ID(OWoj6RcE`fM%_|3{V}t5-P8pr#`eFWck4f}x|14p;X-G;7jCS8OKo z`5`NxV}9G!k0wf6Gjy_v>0)s9Gq7v;BOzUcfLZ!0@i0bBIDXK9$xj_?=Mx_GJfq$= z&IkUwc!5*3iV66cs!)OqQbp^e3|yJyZzKHRZ)j>gnf$3}YiD&i%<_BSliZ@Ss!$>d zgc1?Ql1?m~j0~kU{D8cC>``j+vEKNtiMA)^!S^yY$10}i25vq+3BMRkPM|z_Ghg!n z91VlPg$nF#+zC}yeWfz6?%?S*rS-1c^cr&R-9`ihvJ5SQx}mSA<%=D8eKeJx(A91+ zF?fExMzoufrp26rMFqVN;-)PolMdFBk?+u4U5?s6_EfTN!^wi2`^&txS)5qE2L);1 zp$s~Wi>H&7kdsmP@HscFD@SnYaZHE2qwr$7;yxQusZ=RgFLK-+c+m^+N1X4bXb~A; zc*{^+K|5D2Gj)gR;9F+h#9|%y`R`nB&q-f}OF9j@rMt6%)Nzp*tgarYxK$8>%NMx2 zX|1EeU0-~~qj8ijj`H?oC`?^+fai#`b}k`ZaH`+M2U}waA!FJ8rdzTf$ev85$cI>A zZEgM3n+*U8bZ{9GT~kQ63sdERGM=s|+u0bCA; zfaPJsQ%Khlk@};2FTVLnTvG(k6_=nvyTLTi#%8timoAN0HdvjZMh|nr@*y2cVjG5O z;XbkS@o`LRYN+H9Z{Yq9l4YA?>hU|{3jSQOdtg@g7ma~mdRsyYqG<{kv?{(7(Ofxu zbgH{h1*1NbcWrQ6ly3iqy*m3o6alh`#U7vIoWyHMrIr!R6`&K=kFMeDUTz2ukPeMA z!iwbiEND7YHERG>%|UK)EK?d;?vJJ^yxE1(ax6cc&?7?I@%El%cd1R;aLDcB)S%&1 zFu9%a2h2#zlX^|#`MnV9{K=I^9We46rarclrkEYlDMd!ctEPEI<-+P9r}4)P=^e&s zW_~}QUq>(K8jjpm+kE(geSL+Muawsm>*5On0Dl`q9-0s7UP-~!R)REL99=eT^ zVg8G;HQ~o;zz*I=RD~V$x`f_ksKAF!klOV#JF~`1u(3airs$B{LNB0dHdiBsvF=YT zvtl}XS?IPLdQ0&w9z((mf+%w6fDD`K-^fgWX(&+s0E^squs^@+S8qv{>26PD6k9E=B#-EZH^VO#0ne2F zfm$6gUCeNJ)kS4_6<>voZ>katM>4Crzk833^uo463=;en&q440QF@I;<;~Fy_z-OI zS%!fnJr){Q?!LwC>n*Zz(kKuBZ=(U+OprtDI#E=nV7}vH`31NMVTQ-=g5r)+5=tF{ zpw$`K_;L#%b04mRKE>xe(tu=g*0<!Z0Bvi1`khO+U#s0aw<422uy5G2cdjKWu6Nkqrtku+=^(`)tIP%>e9&Y6 z1)uG=(W?i#7&4npME5ehIzZbCc)1K{xbZUOFQVAz`N9*U#M-v(0=U1XsU1yV^hxA( zT2mPp$0{s%g@Zj@0QZ}|;m-XCu?;_rj{m1E#dz1In2ySeqt7;Vv5T!71Cc$yhRE@< zSHMBctP2Av2IFR>=@K~_y^S`D7N* z^D7{%y8)i2&n)dJuSz2!L($0N1?wBApKr1)>5C{d|vMO4+n%!=+;{6Dww6 z`f{($JMrMD%Dp(JSh5{_{D~pU5JVrt`~5q^xCODi*g#8b>ovcN(;`2QMKR#-tAA;xahfoB2uc3^l0`VtK! zk7H`_!?tED_eUE_&r|+c5>v5K+0rO6tsL#{BVA8 zpkk=#Ea4BQM_;G}!~8@*ZJEt7UPzixy=G$3m|@e{7R0!)%x-wJ;<<_~LhT~3{n4yi8bNErB-gePUYHcy9_v?PLM|LHFVJ%rgwvo=M+`Q9T4nFkh0~NC$osX_vCfWow zf{h8MkLOEH96R3$!#Gcl}}1- zIGb2Fp7E0Id*Zfy%yJc2eJ__E@sY^~2s_cr@W&3<-8ⅈ^jL4!wWlEpSh9OSzyWM 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 Z?*CG2aQ|g30~!3&RMR_?d)gx4e*nFT;%NW? literal 0 HcmV?d00001 diff --git a/BadMC_Launcher/BadMC_Launcher.csproj b/BadMC_Launcher/BadMC_Launcher.csproj index 4cd54ff..f8c35bb 100644 --- a/BadMC_Launcher/BadMC_Launcher.csproj +++ b/BadMC_Launcher/BadMC_Launcher.csproj @@ -1,4 +1,4 @@ - + net9.0-windows10.0.26100;net9.0-desktop;net9.0-maccatalyst;net9.0 preview @@ -72,117 +72,28 @@ + - - - - - MSBuild:Compile - - - - - MSBuild:Compile - + + + + + + - - - - - MSBuild:Compile - - - - - MSBuild:Compile - - - - - - - - - TextTemplatingFileGenerator - MainDashboardResources.resw - MainDashboardResources.Designer.cs - - - - - - - - MSBuild:Compile - - - - - MSBuild:Compile - - - - - MSBuild:Compile - - - - - - - - True - True - MainDashboardResources.Designer.tt - - - MinecraftFolderContentDialog.xaml - - - LaunchSettingsPage.xaml - - - SettingsDashboardPage.xaml - - - - - - - - - - - - - - - - MSBuild:Compile - - - - - MSBuild:Compile - - - - - MSBuild:Compile - - - - + MSBuild:Compile + + diff --git a/BadMC_Launcher/Controls/MainSearch/MainMenuSearchMinecraftEntryFilter.cs b/BadMC_Launcher/Controls/MainSearch/MainMenuSearchMinecraftEntryFilter.cs index 8337217..6188c6b 100644 --- a/BadMC_Launcher/Controls/MainSearch/MainMenuSearchMinecraftEntryFilter.cs +++ b/BadMC_Launcher/Controls/MainSearch/MainMenuSearchMinecraftEntryFilter.cs @@ -20,7 +20,7 @@ public IEnumerable Search(string searchText) { var returnList = new List(); //Get MinecraftFolders App.GetService().MinecraftFolders.ForEach(minecraftPath => { - MinecraftFolderEntry pathEntry = minecraftPath; + MinecraftFolderViewItem pathEntry = minecraftPath; foreach (var minecraftEntry in pathEntry.GetMinecrafts().Where(item => item.Id.Contains(searchText))) { var viewItem = pathEntry.GetMinecraftItem(minecraftEntry); if (viewItem != null) { @@ -39,7 +39,7 @@ public IEnumerable Search(string searchText) { return returnList; } - public Action NavigateTo(MinecraftEntryItem minecraftItem) { + public Action NavigateTo(MinecraftViewItem minecraftItem) { return () => { Debug.WriteLine($"诶诶还妹写呢Σ(っ °Д °;)っ {minecraftItem.MinecraftId}"); }; diff --git a/BadMC_Launcher/Controls/Minecraft/JavaViewItem.cs b/BadMC_Launcher/Controls/Minecraft/JavaViewItem.cs new file mode 100644 index 0000000..c359bfc --- /dev/null +++ b/BadMC_Launcher/Controls/Minecraft/JavaViewItem.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using CommunityToolkit.WinUI.Controls; +using Microsoft.UI.Xaml.Media.Imaging; +using MinecraftLaunch.Base.Models.Game; + +namespace BadMC_Launcher.Controls.Minecraft; +public partial class JavaViewItem { + public JavaViewItem(JavaEntry javaEntry) { + Entry = javaEntry; + + JavaId = $"{Entry.JavaType} {Entry.MajorVersion}"; + + var is64Bit = Entry.Is64bit ? "64Bit" : "32Bit"; + JavaType = $"{is64Bit} / {Entry.JavaVersion}"; + + JavaPath = Entry.JavaPath; + + JavaIcon = Entry.GetJavaIcon(); + } + + public JavaEntry Entry { get; init; } + + public string JavaId { get; init; } + + public string JavaType { get; init; } + + public string JavaPath { get; init; } + + public BitmapImage JavaIcon { get; init; } + + public static bool operator ==(JavaViewItem? left, JavaViewItem? right) { + return left is not null && right is not null ? + left.JavaPath == right.JavaPath : + ReferenceEquals(left, right); + } + + public static bool operator !=(JavaViewItem? left, JavaViewItem? right) { + return left is not null && right is not null + ? left.JavaPath != right.JavaPath : + !ReferenceEquals(left, right); + } + + public override bool Equals(object? obj) { + if (obj is JavaViewItem viewItem) { + if (ReferenceEquals(this.JavaPath, viewItem.JavaPath)) { + return true; + } + + if (!ReferenceEquals(this.JavaPath, viewItem.JavaPath)) { + return false; + } + } + throw new NotImplementedException(); + } + + public override int GetHashCode() { + // HashCode.Combine generates a hash code by combining the hash codes of the provided fields. + // This ensures that the hash code is unique based on the values of these fields. + return HashCode.Combine(JavaPath); + } +} diff --git a/BadMC_Launcher/Controls/Minecraft/MinecraftFolderEntry.cs b/BadMC_Launcher/Controls/Minecraft/MinecraftEntryViewItem.cs similarity index 73% rename from BadMC_Launcher/Controls/Minecraft/MinecraftFolderEntry.cs rename to BadMC_Launcher/Controls/Minecraft/MinecraftEntryViewItem.cs index f64b7d3..c643403 100644 --- a/BadMC_Launcher/Controls/Minecraft/MinecraftFolderEntry.cs +++ b/BadMC_Launcher/Controls/Minecraft/MinecraftEntryViewItem.cs @@ -8,17 +8,18 @@ using System.Xml.Linq; using BadMC_Launcher.Extensions; using BadMC_Launcher.Services.Settings; +using GEmojiSharp; using MinecraftLaunch.Base.Models.Game; using MinecraftLaunch.Components.Parser; using Uno.Extensions.Specialized; namespace BadMC_Launcher.Controls.Minecraft; -public partial class MinecraftFolderEntry : ObservableObject { +public partial class MinecraftFolderViewItem : ObservableObject { - public MinecraftFolderEntry() { - MinecraftFolderId = "NewFolder"; - StarredMinecraftIds = new(); + public MinecraftFolderViewItem(string minecraftFolderPath, string? minecraftFolderId = null) { + MinecraftFolderId = !string.IsNullOrWhiteSpace(minecraftFolderId) ? minecraftFolderId : "NewFolder" + Emoji.All.ElementAtOrDefault(App.GetService().Next(Emoji.All.Count()))?.Raw; + MinecraftFolderPath = minecraftFolderPath; } public event PropertyChangedEventHandler? ActiveMinecraftEntryIdChanged; @@ -26,26 +27,26 @@ public MinecraftFolderEntry() { [ObservableProperty] public partial string MinecraftFolderId { get; set; } - public required string MinecraftFolderPath { get; init; } + public string MinecraftFolderPath { get; init; } [IgnoreListChanged] [ObservableProperty] public partial string? ActiveMinecraftEntryId { get; set; } [ObservableProperty] - public partial ObservableDataList StarredMinecraftIds { get; set; } + public partial ObservableDataList StarredMinecraftIds { get; set; } = new(); public MinecraftParser GetMinecraftParser() => new MinecraftParser(MinecraftFolderPath); public IEnumerable GetMinecrafts() => GetMinecraftParser().GetMinecrafts(); - public static bool operator ==(MinecraftFolderEntry? left, MinecraftFolderEntry? right) { + public static bool operator ==(MinecraftFolderViewItem? left, MinecraftFolderViewItem? right) { return left is not null && right is not null ? left.MinecraftFolderPath == right.MinecraftFolderPath : ReferenceEquals(left, right); } - public static bool operator !=(MinecraftFolderEntry? left, MinecraftFolderEntry? right) { + public static bool operator !=(MinecraftFolderViewItem? left, MinecraftFolderViewItem? right) { return left is not null && right is not null ? left.MinecraftFolderPath != right.MinecraftFolderPath : !ReferenceEquals(left, right); @@ -53,7 +54,7 @@ public MinecraftFolderEntry() { public override bool Equals(object? obj) { - if (obj is MinecraftFolderEntry folderEntry) { + if (obj is MinecraftFolderViewItem folderEntry) { return this.MinecraftFolderPath == folderEntry.MinecraftFolderPath; } return false; diff --git a/BadMC_Launcher/Controls/Minecraft/MinecraftEntryItem.cs b/BadMC_Launcher/Controls/Minecraft/MinecraftViewItem.cs similarity index 76% rename from BadMC_Launcher/Controls/Minecraft/MinecraftEntryItem.cs rename to BadMC_Launcher/Controls/Minecraft/MinecraftViewItem.cs index add94dc..70a237a 100644 --- a/BadMC_Launcher/Controls/Minecraft/MinecraftEntryItem.cs +++ b/BadMC_Launcher/Controls/Minecraft/MinecraftViewItem.cs @@ -16,16 +16,18 @@ using static System.Runtime.InteropServices.JavaScript.JSType; namespace BadMC_Launcher.Controls.Minecraft; -public class MinecraftEntryItem { +public partial class MinecraftViewItem : ObservableObject { public string MinecraftId => MinecraftEntry.Id; public required MinecraftEntry MinecraftEntry { get; init; } public required BitmapImage MinecraftImage { get; init; } - public required HashSet MinecraftTags { get; init; } + + public required ObservableDataList MinecraftTags { get; init; } - public bool IsStarred { get; set; } + [ObservableProperty] + public partial bool IsStarred { get; set; } public void SetIsStarredEvent(object? sender, NotifyCollectionChangedEventArgs e) { if (sender is ObservableDataList folderEntry) { @@ -33,23 +35,21 @@ public void SetIsStarredEvent(object? sender, NotifyCollectionChangedEventArgs e } } - public static bool operator ==(MinecraftEntryItem? left, MinecraftEntryItem? right) { + public static bool operator ==(MinecraftViewItem? left, MinecraftViewItem? right) { return left is not null && right is not null ? - left.MinecraftId == right.MinecraftId && - left.MinecraftTags == right.MinecraftTags : + left.MinecraftId == right.MinecraftId : ReferenceEquals(left, right); } - public static bool operator !=(MinecraftEntryItem? left, MinecraftEntryItem? right) { + public static bool operator !=(MinecraftViewItem? left, MinecraftViewItem? right) { return left is not null && right is not null ? - left.MinecraftId != right.MinecraftId && - left.MinecraftTags != right.MinecraftTags : + left.MinecraftId != right.MinecraftId : !ReferenceEquals(left, right); } public override bool Equals(object? obj) { - if (obj is MinecraftEntryItem entryItem) { + if (obj is MinecraftViewItem entryItem) { if (ReferenceEquals(this.MinecraftId, entryItem.MinecraftId)) { return true; } diff --git a/BadMC_Launcher/Dictionaries/Templates/ItemTemplate/JavaItemsTemplate.xaml b/BadMC_Launcher/Dictionaries/Templates/ItemTemplate/JavaItemsTemplate.xaml new file mode 100644 index 0000000..79f5876 --- /dev/null +++ b/BadMC_Launcher/Dictionaries/Templates/ItemTemplate/JavaItemsTemplate.xaml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BadMC_Launcher/Dictionaries/Templates/ItemTemplate/MinecraftFolderItemsTemplate.xaml b/BadMC_Launcher/Dictionaries/Templates/ItemTemplate/MinecraftFolderItemsTemplate.xaml index f5bb029..efb2954 100644 --- a/BadMC_Launcher/Dictionaries/Templates/ItemTemplate/MinecraftFolderItemsTemplate.xaml +++ b/BadMC_Launcher/Dictionaries/Templates/ItemTemplate/MinecraftFolderItemsTemplate.xaml @@ -88,7 +88,7 @@ - @@ -99,7 +99,7 @@ - diff --git a/BadMC_Launcher/Dictionaries/Templates/ItemTemplate/MinecraftItemsTemplate.xaml b/BadMC_Launcher/Dictionaries/Templates/ItemTemplate/MinecraftItemsTemplate.xaml index f07c38e..39cb2d3 100644 --- a/BadMC_Launcher/Dictionaries/Templates/ItemTemplate/MinecraftItemsTemplate.xaml +++ b/BadMC_Launcher/Dictionaries/Templates/ItemTemplate/MinecraftItemsTemplate.xaml @@ -13,6 +13,8 @@ + + + + + + + + addList) { + this.RaiseListChangedEvents = false; + + this.AddRange(addList); + + this.RaiseListChangedEvents = true; + + OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1)); + } + protected override void OnListChanged(ListChangedEventArgs e) { // Check if the property has the IgnoreListChangedAttribute if (e.PropertyDescriptor?.Attributes[typeof(IgnoreListChangedAttribute)] != null) { return; } diff --git a/BadMC_Launcher/Extensions/JavaEntryExtension.cs b/BadMC_Launcher/Extensions/JavaEntryExtension.cs new file mode 100644 index 0000000..f71d21b --- /dev/null +++ b/BadMC_Launcher/Extensions/JavaEntryExtension.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using BadMC_Launcher.Controls.Minecraft; +using Microsoft.UI.Xaml.Media.Imaging; +using MinecraftLaunch.Base.Models.Game; + +namespace BadMC_Launcher.Extensions; +public static class JavaEntryExtension { + public static BitmapImage GetJavaIcon(this JavaEntry javaEntry) { + var ImagePath = $"ms-appx:///Assets/Icons/JavaIcons/{javaEntry.JavaType.ToLower()}.png"; + + if (File.Exists(ImagePath)) { + return new BitmapImage(new Uri(ImagePath)); + } + return new BitmapImage(new Uri("ms-appx:///Assets/Icons/JavaIcons/openjdk.png")); + } +} diff --git a/BadMC_Launcher/Extensions/MinecraftEntryExtension.cs b/BadMC_Launcher/Extensions/MinecraftEntryExtension.cs index 57a1b2e..fa6dc03 100644 --- a/BadMC_Launcher/Extensions/MinecraftEntryExtension.cs +++ b/BadMC_Launcher/Extensions/MinecraftEntryExtension.cs @@ -64,8 +64,8 @@ public static MinecraftEntryImageEnum GetMinecraftImageEnum(this MinecraftEntry throw new NotImplementedException("欸等一下Σ(っ °Д °;)っ我们还没支持这个类型呢你怎么就给(*#……*!&@%!*……@"); } - public static IEnumerable GetMinecraftEntryTags(this MinecraftEntry minecraftEntry) { - var tags = new HashSet() { new MetadataItem() { Label = $"{minecraftEntry.Version.Type} {minecraftEntry.Version.VersionId}" } }; + public static ObservableDataList GetMinecraftEntryTags(this MinecraftEntry minecraftEntry) { + var tags = new ObservableDataList() { new MetadataItem() { Label = $"{minecraftEntry.Version.Type} {minecraftEntry.Version.VersionId}" } }; if (minecraftEntry is ModifiedMinecraftEntry modifiedEntry) { modifiedEntry.ModLoaders.ForEach(item => tags.Add(new MetadataItem() { Label = $"{item.Type} {item.Version}" })); } diff --git a/BadMC_Launcher/Extensions/MinecraftFolderEntryExtension.cs b/BadMC_Launcher/Extensions/MinecraftFolderViewItemExtension.cs similarity index 82% rename from BadMC_Launcher/Extensions/MinecraftFolderEntryExtension.cs rename to BadMC_Launcher/Extensions/MinecraftFolderViewItemExtension.cs index ed44af4..f75ef6d 100644 --- a/BadMC_Launcher/Extensions/MinecraftFolderEntryExtension.cs +++ b/BadMC_Launcher/Extensions/MinecraftFolderViewItemExtension.cs @@ -13,8 +13,8 @@ using BadMC_Launcher.Models.Enums; namespace BadMC_Launcher.Extensions; -public static class MinecraftFolderEntryExtension { - public static MinecraftEntryItem? GetMinecraftItem(this MinecraftFolderEntry minecraftPath, string minecraftEntryId) { +public static class MinecraftFolderViewItemExtension { + public static MinecraftViewItem? GetMinecraftItem(this MinecraftFolderViewItem minecraftPath, string minecraftEntryId) { try { return minecraftPath.GetMinecraftItem(minecraftPath.GetMinecraftParser().GetMinecraft(minecraftEntryId)); } @@ -24,7 +24,7 @@ public static class MinecraftFolderEntryExtension { return null; } - public static MinecraftEntryItem? GetMinecraftItem(this MinecraftFolderEntry minecraftFolderEntry, MinecraftEntry minecraftEntry) { + public static MinecraftViewItem? GetMinecraftItem(this MinecraftFolderViewItem minecraftFolderEntry, MinecraftEntry minecraftEntry) { try { if (minecraftEntry != null) { var isStarred = false; @@ -51,10 +51,10 @@ public static class MinecraftFolderEntryExtension { isStarred = minecraftFolderEntry.StarredMinecraftIds.IndexOf(minecraftEntry.Id) >= 0; } - var entryItem = new MinecraftEntryItem() { + var entryItem = new MinecraftViewItem() { MinecraftEntry = minecraftEntry, MinecraftImage = image, - MinecraftTags = (HashSet)minecraftEntry.GetMinecraftEntryTags(), + MinecraftTags = minecraftEntry.GetMinecraftEntryTags(), IsStarred = isStarred }; @@ -72,9 +72,9 @@ public static class MinecraftFolderEntryExtension { return null; } - public static IEnumerable GetMinecraftItems(this MinecraftFolderEntry minecraftPath) { + public static IEnumerable GetMinecraftItems(this MinecraftFolderViewItem minecraftPath) { var minecraftParser = minecraftPath.GetMinecraftParser(); - var items = new ObservableCollection(); + var items = new ObservableCollection(); foreach (var entry in minecraftParser.GetMinecrafts()) { var isStarred = false; string path; @@ -95,10 +95,10 @@ public static IEnumerable GetMinecraftItems(this MinecraftFo if (minecraftPath.StarredMinecraftIds != null) { isStarred = minecraftPath.StarredMinecraftIds.IndexOf(entry.Id) >= 0; } - items.Add(new MinecraftEntryItem() { + items.Add(new MinecraftViewItem() { MinecraftEntry = entry, MinecraftImage = new BitmapImage() { UriSource = new Uri(path) }, - MinecraftTags = (HashSet)entry.GetMinecraftEntryTags(), + MinecraftTags = entry.GetMinecraftEntryTags(), IsStarred = isStarred, }); } diff --git a/BadMC_Launcher/Extensions/ObservableDataList.cs b/BadMC_Launcher/Extensions/ObservableDataList.cs index f70223d..e81bc78 100644 --- a/BadMC_Launcher/Extensions/ObservableDataList.cs +++ b/BadMC_Launcher/Extensions/ObservableDataList.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Collections.Specialized; using System.Linq; using System.Text; using System.Text.Json; @@ -9,7 +10,6 @@ namespace BadMC_Launcher.Extensions; public class ObservableDataList : ObservableCollection { - public ObservableDataList(IEnumerable initialData) : base(initialData) { } @@ -26,4 +26,12 @@ protected override void SetItem(int index, T item) { base.SetItem(index, item); } } + + public void MargeItems(IEnumerable addList) { + CheckReentrancy(); + + Items.AddRange(addList); + + OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); + } } diff --git a/BadMC_Launcher/Models/Datas/AppParameters.cs b/BadMC_Launcher/Models/Datas/AppParameters.cs index 7981b6b..660ae11 100644 --- a/BadMC_Launcher/Models/Datas/AppParameters.cs +++ b/BadMC_Launcher/Models/Datas/AppParameters.cs @@ -16,6 +16,6 @@ namespace BadMC_Launcher.Models.Datas; public static class AppParameters { public readonly static SizeInt32 windowSize = new() { Width = 1024, - Height = 624 + Height = 620 }; } diff --git a/BadMC_Launcher/Models/Datas/Mappings/UpdateMapping.cs b/BadMC_Launcher/Models/Datas/Mappings/UpdateMapping.cs index 945b4bf..96de5bf 100644 --- a/BadMC_Launcher/Models/Datas/Mappings/UpdateMapping.cs +++ b/BadMC_Launcher/Models/Datas/Mappings/UpdateMapping.cs @@ -7,6 +7,6 @@ namespace BadMC_Launcher.Models.Datas.Mappings; public static class UpdateMapping { public readonly static Dictionary MinecraftConfig = new() { - { "MinecraftPaths", "MinecraftFolders" } + { "OwO", "MinecraftFolderId" } }; } diff --git a/BadMC_Launcher/Models/Datas/SettingsDatas/MinecraftConfig.cs b/BadMC_Launcher/Models/Datas/SettingsDatas/MinecraftConfig.cs index ad429cc..7750fcc 100644 --- a/BadMC_Launcher/Models/Datas/SettingsDatas/MinecraftConfig.cs +++ b/BadMC_Launcher/Models/Datas/SettingsDatas/MinecraftConfig.cs @@ -17,7 +17,7 @@ internal static class MinecraftConfig { internal static DistinctiveItemBindingList javaPaths = new() { PropertyName = nameof(MinecraftConfigService.JavaPaths) }; - internal static DistinctiveItemBindingList minecraftFolders = new() { PropertyName = nameof(MinecraftConfigService.MinecraftFolders) }; + internal static DistinctiveItemBindingList minecraftFolders = new() { PropertyName = nameof(MinecraftConfigService.MinecraftFolders) }; internal static string? activeJavaPath; diff --git a/BadMC_Launcher/Models/Datas/ViewDatas/MainMenuData.cs b/BadMC_Launcher/Models/Datas/ViewDatas/MainMenuData.cs deleted file mode 100644 index e3b03a0..0000000 --- a/BadMC_Launcher/Models/Datas/ViewDatas/MainMenuData.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using BadMC_Launcher.Interfaces; -using BadMC_Launcher.Controls; - -namespace BadMC_Launcher.Models.Datas.ViewDatas; - -internal static class MainMenuData { - internal static DistinctiveItemBindingList MainMenuSharchFilterItems { get; set; } = new(); - - internal static DistinctiveItemBindingList MainMenuItems { get; set; } = new(); -} diff --git a/BadMC_Launcher/Models/Datas/ViewDatas/MainSideBarData.cs b/BadMC_Launcher/Models/Datas/ViewDatas/MainSideBarData.cs index 6059ead..7b2ca1e 100644 --- a/BadMC_Launcher/Models/Datas/ViewDatas/MainSideBarData.cs +++ b/BadMC_Launcher/Models/Datas/ViewDatas/MainSideBarData.cs @@ -7,10 +7,15 @@ using BadMC_Launcher.Classes; using BadMC_Launcher.Controls; using BadMC_Launcher.Extensions; +using BadMC_Launcher.Interfaces; namespace BadMC_Launcher.Models.Datas.ViewDatas; internal static class MainSideBarData { internal static DistinctiveItemBindingList MainSideBarItems { get; set; } = new(); internal static DistinctiveItemBindingList MainSideBarFooterItems { get; set; } = new(); + + internal static DistinctiveItemBindingList MainMenuSharchFilterItems { get; set; } = new(); + + internal static DistinctiveItemBindingList MainMenuItems { get; set; } = new(); } diff --git a/BadMC_Launcher/Services/Settings/MinecraftConfigService.cs b/BadMC_Launcher/Services/Settings/MinecraftConfigService.cs index 38ff04f..6d63b56 100644 --- a/BadMC_Launcher/Services/Settings/MinecraftConfigService.cs +++ b/BadMC_Launcher/Services/Settings/MinecraftConfigService.cs @@ -16,7 +16,7 @@ public MinecraftConfigService() { //Triggers an event when a property is changed MinecraftConfig.minecraftAccounts.ListChanged += OnListChanged; MinecraftConfig.javaPaths.ListChanged += OnListChanged; - MinecraftConfig.minecraftFolders.ListChanged += OnListChanged; + MinecraftConfig.minecraftFolders.ListChanged += OnListChanged; MinecraftConfig.jvmArguments.ListChanged += OnListChanged; } @@ -24,7 +24,7 @@ public DistinctiveItemBindingList MinecraftAccounts { get => MinecraftConfig.minecraftAccounts; set { MinecraftConfig.minecraftAccounts.Clear(); - MinecraftConfig.minecraftAccounts.AddRange(value); + MinecraftConfig.minecraftAccounts.MargeItems(value); // Write to Json SyncSettingSet(); @@ -34,17 +34,17 @@ public DistinctiveItemBindingList JavaPaths { get => MinecraftConfig.javaPaths; set { MinecraftConfig.javaPaths.Clear(); - MinecraftConfig.javaPaths.AddRange(value); + MinecraftConfig.javaPaths.MargeItems(value); // Write to Json SyncSettingSet(); } } - public DistinctiveItemBindingList MinecraftFolders { + public DistinctiveItemBindingList MinecraftFolders { get => MinecraftConfig.minecraftFolders; set { MinecraftConfig.minecraftFolders.Clear(); - MinecraftConfig.minecraftFolders.AddRange(value); + MinecraftConfig.minecraftFolders.MargeItems(value); // Write to Json SyncSettingSet(); @@ -171,9 +171,13 @@ public string? LauncherName { public BindingList JvmArguments { get => MinecraftConfig.jvmArguments; set { + MinecraftConfig.jvmArguments.RaiseListChangedEvents = false; + MinecraftConfig.jvmArguments.Clear(); MinecraftConfig.jvmArguments.AddRange(value); + MinecraftConfig.jvmArguments.RaiseListChangedEvents = true; + // Write to Json SyncSettingSet(); } diff --git a/BadMC_Launcher/Services/Settings/SingleMinecraftConfigService.cs b/BadMC_Launcher/Services/Settings/SingleMinecraftConfigService.cs index 62a0ae0..ab049cf 100644 --- a/BadMC_Launcher/Services/Settings/SingleMinecraftConfigService.cs +++ b/BadMC_Launcher/Services/Settings/SingleMinecraftConfigService.cs @@ -126,9 +126,13 @@ public string? LauncherName { public BindingList JvmArguments { get => singleMinecraftConfigInstance.jvmArguments; set { + singleMinecraftConfigInstance.jvmArguments.RaiseListChangedEvents = false; + singleMinecraftConfigInstance.jvmArguments.Clear(); singleMinecraftConfigInstance.jvmArguments.AddRange(value); + singleMinecraftConfigInstance.jvmArguments.RaiseListChangedEvents = true; + // Write to Json SyncSettingSet(); } diff --git a/BadMC_Launcher/Services/ViewServices/MainMenuService.cs b/BadMC_Launcher/Services/ViewServices/MainMenuService.cs deleted file mode 100644 index 644fb42..0000000 --- a/BadMC_Launcher/Services/ViewServices/MainMenuService.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using BadMC_Launcher.Classes; -using BadMC_Launcher.Interfaces; -using BadMC_Launcher.Models.Datas.ViewDatas; -using BadMC_Launcher.Controls; - -namespace BadMC_Launcher.Services.ViewServices; - -public class MainMenuService { - public void SearchFilterRegister(IMainMenuSharchFilterItem mainMenuSharchItem) { - MainMenuData.MainMenuSharchFilterItems.Add(mainMenuSharchItem); - } - - public void MenuItemRegister(MainMenuItem mainMenuItem) { - MainMenuData.MainMenuItems.Add(mainMenuItem); - } -} diff --git a/BadMC_Launcher/Services/ViewServices/MainSideBarManagerService.cs b/BadMC_Launcher/Services/ViewServices/MainSideBarService.cs similarity index 74% rename from BadMC_Launcher/Services/ViewServices/MainSideBarManagerService.cs rename to BadMC_Launcher/Services/ViewServices/MainSideBarService.cs index 19c56ef..a9387ae 100644 --- a/BadMC_Launcher/Services/ViewServices/MainSideBarManagerService.cs +++ b/BadMC_Launcher/Services/ViewServices/MainSideBarService.cs @@ -8,15 +8,15 @@ using BadMC_Launcher.ViewModels.Pages; using BadMC_Launcher.Classes; using Microsoft.Windows.ApplicationModel.Resources; -using BadMC_Launcher.Views.Pages.MainSideBar; using CommunityToolkit.Mvvm.Messaging.Messages; using CommunityToolkit.Mvvm.Messaging; using Newtonsoft.Json.Linq; using BadMC_Launcher.Controls; using BadMC_Launcher.Models.Enums; +using BadMC_Launcher.Interfaces; namespace BadMC_Launcher.Services.ViewServices; -public class MainSideBarManagerService { +public class MainSideBarService { public void NavigateToPage() where T : Page { WeakReferenceMessenger.Default.Send(new ValueChangedMessage(typeof(T)), MainPageMessengerTokenEnum.MainSideBarFrameToken.ToString()); } @@ -29,4 +29,12 @@ public void Register(MainSideBarItem mainSideBarItem, bool isFooter = false) { MainSideBarData.MainSideBarItems.Add(mainSideBarItem); } } + + public void SearchFilterRegister(IMainMenuSharchFilterItem mainMenuSharchItem) { + MainSideBarData.MainMenuSharchFilterItems.Add(mainMenuSharchItem); + } + + public void MenuItemRegister(MainMenuItem mainMenuItem) { + MainSideBarData.MainMenuItems.Add(mainMenuItem); + } } diff --git a/BadMC_Launcher/Strings/en-US/Resources.resw b/BadMC_Launcher/Strings/en-US/Resources.resw index 635464f..d325e76 100644 --- a/BadMC_Launcher/Strings/en-US/Resources.resw +++ b/BadMC_Launcher/Strings/en-US/Resources.resw @@ -124,7 +124,7 @@ Launch with BadMCL (NOT BMCL!!!)
- No ontology selected _( ゚Д゚)ノ + No item selected _( ゚Д゚)ノ Launch Minecraft! @@ -141,33 +141,24 @@ Can't find any Minecraft ontologies :( - - Go to the Ontology page to manage Minecraft ontologies. + + Go to the Ontology page to manage Minecraft ontologies folders. - + Try searching for what? ψ(`∇´)ψ - - Menu + + 设置 - + Minecraft Ontologies - + Filter search results This feature is currently in beta status and may be changed or removed at any time. - - Real-time updates - - - Settings - - - Scripts - Let's BadMC Launcher! 🥳😝😈 @@ -214,34 +205,34 @@ If something in this setting has been changed in an ontology-specific customizat OK - + Adding a new Minecraft ontologies folder - + Rename item (Does not affect local folder) - + Apply - + Cancel - + Path - Minecraft ontology folder not selected (´-ω-`) + Minecraft ontologies folder not selected (´-ω-`) View in File Manager - + Delete (Does not affect local folder) - + Rename (Does not affect local folder) - + The name must not be empty or duplicated. @@ -256,13 +247,43 @@ If something in this setting has been changed in an ontology-specific customizat Set an active Java runtime first to display available Java runtimes 😰 - + Can't find any Minecraft ontologies folder :( - - Add a new Minecraft ontologies folder + + Add a Minecraft ontologies folder from local - + etc! Renaming will be turned off when clicked! (Flyout is too hard so I can't fix it QAQ) + + Manage Java Runtimes + + + OK + + + Add the Java Runtime from local + + + Can't find any Java Runtimes + + + Search the Java Runtime from local + + + Search the Java Runtime from local + + + Download new Java Runtime from the web + + + View in File Manager + + + Delete (Does not affect local Java Runtime) + + + Getting Java Runtime...... + \ No newline at end of file diff --git a/BadMC_Launcher/Strings/zh-Hans/Resources.resw b/BadMC_Launcher/Strings/zh-Hans/Resources.resw index 23994eb..c7bf8c1 100644 --- a/BadMC_Launcher/Strings/zh-Hans/Resources.resw +++ b/BadMC_Launcher/Strings/zh-Hans/Resources.resw @@ -141,33 +141,24 @@ 找不到任何 Minecraft 本体 :( - - 转到本体页面以管理Minecraft本体. + + 转到本体页面以管理Minecraft本体文件夹. - + 搜点什么?ψ(`∇´)ψ - - 菜单 + + 设置 - + Minecraft 本体 - + 筛选搜索结果 该功能目前为测试状态,随时可能更改或删除. - - 实时更新 - - - 设置 - - - 脚本 - 让我们一起 BadMC Launcher! 🥳😝😈 @@ -214,19 +205,19 @@ 确定 - + 添加新的 Minecraft 本体文件夹 - + 重命名项 (不影响本地文件夹) - + 应用 - + 取消 - + 路径 @@ -235,13 +226,13 @@ 在文件管理器中显示 - + 删除 (不影响本地文件夹) - + 重命名 (不影响本地文件夹) - + 名称不可为空或与其它项重名. @@ -256,13 +247,43 @@ 在显示 Java 运行时之前请设置活动的 Java 运行时 😰 - + 找不到任何 Minecraft 本体文件夹 :( - - 添加新的 Minecraft 本体文件夹 + + 从本地添加 Minecraft 本体文件夹 - + 等等!点击时将会关闭重命名!(Flyout太难了所以修不了 QAQ) + + 管理 Java 运行时 + + + 确定 + + + 从本地添加 Java 运行时 + + + 找不到任何 Java 运行时 + + + 在本地搜索 Java 运行时 + + + 在本地搜索 Java 运行时 + + + 从网络下载新的 Java 运行时 暂未实现(嘿嘿🤤) + + + 在文件管理器中显示 + + + 删除 (不影响本地 Java 运行时) + + + 正在获取 Java 运行时...... + \ No newline at end of file diff --git a/BadMC_Launcher/ViewModels/ContentDialogs/Settings/JavaContentDialogViewModel.cs b/BadMC_Launcher/ViewModels/ContentDialogs/Settings/JavaContentDialogViewModel.cs new file mode 100644 index 0000000..c9fbeed --- /dev/null +++ b/BadMC_Launcher/ViewModels/ContentDialogs/Settings/JavaContentDialogViewModel.cs @@ -0,0 +1,163 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using BadMC_Launcher.Controls.Minecraft; +using BadMC_Launcher.Services.Settings; +using CommunityToolkit.Mvvm.Input; +using CommunityToolkit.WinUI; +using Microsoft.UI.Dispatching; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Media.Imaging; +using MinecraftLaunch.Base.Models.Game; +using MinecraftLaunch.Utilities; +using Uno.Extensions; +using Windows.ApplicationModel.Core; +using Windows.Storage.Pickers; +using Windows.UI.Core; +using WinRT.Interop; + +namespace BadMC_Launcher.ViewModels.ContentDialogs.Settings; + +public partial class JavaContentDialogViewModel : ObservableObject { + private readonly MinecraftConfigService minecraftConfigService; + + public JavaContentDialogViewModel() { + minecraftConfigService = App.GetService(); + + minecraftConfigService.PropertyChanged += JavaList_PropertyChanged; + + // Initialize List + JavasList = new(); + SetJavaList(); + } + + [ObservableProperty] + public partial bool IsJavasListEmpty { get; set; } + + [ObservableProperty] + public partial bool IsJavasListLoading { get; set; } + + [ObservableProperty] + public partial ObservableDataList JavasList { get; set; } + + [ObservableProperty] + public partial int JavasListSelectedIndex { get; set; } + + [RelayCommand(FlowExceptionsToTaskScheduler = true)] + private async Task AddJava() { + // Create new file picker + var filePicker = new FileOpenPicker(); + + // Get window handle + var hwnd = WindowNative.GetWindowHandle(App.Current.MainWindow); + InitializeWithWindow.Initialize(filePicker, hwnd); + + if (OperatingSystem.IsWindows()) { + filePicker.FileTypeFilter.Add(".exe"); + } + + // Show file picker dialog + var file = await filePicker.PickSingleFileAsync(); + + if (file != null && file.DisplayName == "java") { + minecraftConfigService.JavaPaths.Add(file.Path); + return; + } + else if(file != null && file.DisplayName == "javaw") { + var javaFolder = Directory.GetParent(file.Path); + + if (javaFolder != null) { + if (OperatingSystem.IsWindows()) { + minecraftConfigService.JavaPaths.Add(@$"{javaFolder.FullName}\java{file.FileType}"); + return; + } + + minecraftConfigService.JavaPaths.Add($"{javaFolder.FullName}/java{file.FileType}"); + return; + } + } + + // TODO: Show tip toast + } + + [RelayCommand] + private async Task SearchJavas() { + IAsyncEnumerable? javas = JavaUtil.EnumerableJavaAsync(); + if (javas != null) { + var javaList = await Task.Run(async () => { + var list = new List(); + await foreach (var item in javas) { + list.Add(item.JavaPath); + } + return list; + }); + + minecraftConfigService.JavaPaths.MargeItems(javaList); + return; + } + + //TODO: Show tip toast + } + + [RelayCommand] + private void SetActiveJava() { + // Get selected item + var selectedItem = JavasList.ElementAtOrDefault(JavasListSelectedIndex); + + // Set active Java path + minecraftConfigService.ActiveJavaPath = minecraftConfigService.JavaPaths.FirstOrDefault(selectedItem?.JavaPath); + } + + [RelayCommand] + private void DeleteJava(string parameter) { + // TODO: Search Java + } + + [RelayCommand] + private void LocalViewJava(string parameter) { + App.GetService().TryOpenFolderFromPath(parameter); + } + + partial void OnJavasListChanged(ObservableDataList value) { + IsJavasListEmpty = !JavasList.Any(); + } + + private async void SetJavaList() { + IsJavasListLoading = true; + + var javaList = await Task.Run(async () => { + // Get Java paths + var tasks = minecraftConfigService.JavaPaths + .Select(async item => await JavaUtil.GetJavaInfoAsync(item)).ToList(); + + // Convert list + return await Task.WhenAll(tasks); + }); + + // Add to list + JavasList.AddRange(javaList.Select(info => new JavaViewItem(info)).ToList()); + IsJavasListEmpty = !JavasList.Any(); + + // Find selected Java + JavasListSelectedIndex = JavasList.GetIndex(item => item.JavaPath == minecraftConfigService.ActiveJavaPath); + + IsJavasListLoading = false; + } + + private void JavaList_PropertyChanged(object? sender, PropertyChangedEventArgs e) { + switch(e.PropertyName) { + case nameof(MinecraftConfigService.JavaPaths): + // Update Java list + SetJavaList(); + break; + case nameof(MinecraftConfigService.ActiveJavaPath): + // Update selected index + JavasListSelectedIndex = JavasList.GetIndex(item => item.JavaPath == minecraftConfigService.ActiveJavaPath); + break; + } + IsJavasListEmpty = !JavasList.Any(); + } +} diff --git a/BadMC_Launcher/ViewModels/ContentDialogs/Settings/MinecraftFolderContentDialogViewModel.cs b/BadMC_Launcher/ViewModels/ContentDialogs/Settings/MinecraftFolderContentDialogViewModel.cs index f7449c6..81ad6e0 100644 --- a/BadMC_Launcher/ViewModels/ContentDialogs/Settings/MinecraftFolderContentDialogViewModel.cs +++ b/BadMC_Launcher/ViewModels/ContentDialogs/Settings/MinecraftFolderContentDialogViewModel.cs @@ -1,13 +1,17 @@ -using BadMC_Launcher.Services.Settings; +using System.Collections.ObjectModel; +using System.ComponentModel; using BadMC_Launcher.Controls.Minecraft; +using BadMC_Launcher.Models.Enums; +using BadMC_Launcher.Services.Settings; using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Messaging; using CommunityToolkit.Mvvm.Messaging.Messages; +using GEmojiSharp; +using Microsoft.UI.Xaml.Input; +using Uno.Extensions.Specialized; using Windows.Storage.Pickers; +using Windows.System; using WinRT.Interop; -using BadMC_Launcher.Models.Enums; -using System.ComponentModel; -using System.Collections.ObjectModel; namespace BadMC_Launcher.ViewModels.ContentDialogs.Settings; public partial class MinecraftFolderContentDialogViewModel : ObservableObject { @@ -27,14 +31,13 @@ public MinecraftFolderContentDialogViewModel() { } [ObservableProperty] - [NotifyCanExecuteChangedFor(nameof(ApplyRenameCommand))] - public partial bool CanRename { get; set; } + public partial ObservableCollection MinecraftFoldersList { get; set; } [ObservableProperty] - public partial ObservableCollection MinecraftFoldersList { get; set; } + public partial bool IsMinecraftFoldersListEmpty { get; set; } [ObservableProperty] - public partial bool IsMinecraftFoldersListEmpty { get; set; } + public partial bool IsCanRename { get; set; } [ObservableProperty] public partial int MinecraftFoldersListSelectedIndex { get; set; } @@ -43,6 +46,8 @@ public MinecraftFolderContentDialogViewModel() { public partial string OldRenameMinecraftFolderId { get; set; } [ObservableProperty] + [NotifyCanExecuteChangedFor(nameof(ApplyRenameCommand))] + public partial string NewRenameMinecraftFolderId { get; set; } [ObservableProperty] @@ -61,21 +66,18 @@ private async Task AddMinecraftFolder() { StorageFolder folder = await folderPicker.PickSingleFolderAsync(); if (folder != null) { - var folderId = "NewFolder"; - if (minecraftConfigService.MinecraftFolders.Any(item => item.MinecraftFolderPath == folder.Path)) { //Show tip toast return; } + var item = new MinecraftFolderViewItem(folder.Path); + // Add folder to list - minecraftConfigService.MinecraftFolders.Add(new() { - MinecraftFolderId = folderId, - MinecraftFolderPath = folder.Path - }); + minecraftConfigService.MinecraftFolders.Add(item); // Set new folder name - OldRenameMinecraftFolderId = folderId; + OldRenameMinecraftFolderId = item.MinecraftFolderId; RenameMinecraftFolderPath = folder.Path; SendInvokeFuncMessage(string.Empty, MinecraftFolderContentDialogMessengerTokenEnum.ShowRenameFlyoutToken); } @@ -89,29 +91,40 @@ private void OpenMinecraftFolder() { } } + [RelayCommand] + private void TryApplyRename(KeyRoutedEventArgs args) { + if (args.Key == VirtualKey.Enter) { + // Get minecraft folder entry + var minecraftPathEntry = minecraftConfigService.MinecraftFolders.FirstOrDefault(item => item.MinecraftFolderPath == RenameMinecraftFolderPath); + if (minecraftPathEntry != null) { + // Check if folder with new name already exists + if (CanRename()) { + // Rename folder + minecraftPathEntry.MinecraftFolderId = NewRenameMinecraftFolderId; + + // Hide Flyout + HideRenameFlyout(); + return; + } + } + } + } + [RelayCommand(CanExecute = nameof(CanRename))] private void ApplyRename() { // Get minecraft folder entry var minecraftPathEntry = minecraftConfigService.MinecraftFolders.FirstOrDefault(item => item.MinecraftFolderPath == RenameMinecraftFolderPath); if (minecraftPathEntry != null) { // Check if folder with new name already exists - if ((string.IsNullOrWhiteSpace(NewRenameMinecraftFolderId) && - NewRenameMinecraftFolderId == OldRenameMinecraftFolderId) || - minecraftConfigService.MinecraftFolders.Any(item => item.MinecraftFolderId == NewRenameMinecraftFolderId)) { - - //TODO: tip toast + if (CanRename()) { + // Rename folder + minecraftPathEntry.MinecraftFolderId = NewRenameMinecraftFolderId; + // Hide Flyout + HideRenameFlyout(); return; } - - // Rename folder - minecraftPathEntry.MinecraftFolderId = NewRenameMinecraftFolderId; - - // Hide Flyout - HideRenameFlyout(); - return; } - //TODO: Tip Toast } [RelayCommand] @@ -126,7 +139,7 @@ private void DeleteRenameFlyoutData() { private void SetActiveMinecraftFolder(SelectionChangedEventArgs args) { var selectedItem = MinecraftFoldersList.ElementAtOrDefault(MinecraftFoldersListSelectedIndex); if (args.AddedItems.Any(item => { - if (item is MinecraftFolderEntry entry) { + if (item is MinecraftFolderViewItem entry) { return entry.MinecraftFolderPath != minecraftConfigService.ActiveMinecraftFolderPath; } return false; @@ -164,18 +177,7 @@ private void DeleteItem(string parameter) { // TODO: Toast Tip(ERROR) } - [RelayCommand] - private void SetCanRename() { - // Check if text is not empty and not equal to old folder name - if (!string.IsNullOrWhiteSpace(NewRenameMinecraftFolderId) && !minecraftConfigService.MinecraftFolders.Any(item => item.MinecraftFolderId == NewRenameMinecraftFolderId)) { - // Set apply button enabled - CanRename = true; - return; - } - // Set apply button disabled - CanRename = false; - } [RelayCommand] private void HideRenameFlyout() => SendInvokeFuncMessage(string.Empty, MinecraftFolderContentDialogMessengerTokenEnum.HideRenameFlyoutToken); @@ -184,6 +186,18 @@ private ValueChangedMessage SendInvokeFuncMessage(T value, Enum tokenEnum) return WeakReferenceMessenger.Default.Send(new ValueChangedMessage(value), tokenEnum.ToString()); } + private bool CanRename() { + // Check if text is not empty and not equal to old folder name + if (!string.IsNullOrWhiteSpace(NewRenameMinecraftFolderId) && !minecraftConfigService.MinecraftFolders.Any(item => item.MinecraftFolderId == NewRenameMinecraftFolderId)) { + // Set apply button enabled + IsCanRename = true; + return true; + } + + // Set apply button disabled + IsCanRename = true; + return false; + } private void MinecraftConfig_PropertyChanged(object? sender, PropertyChangedEventArgs e) { // Update Property @@ -201,7 +215,7 @@ private void MinecraftConfig_PropertyChanged(object? sender, PropertyChangedEven IsMinecraftFoldersListEmpty = !MinecraftFoldersList.Any(); } - partial void OnMinecraftFoldersListChanged(ObservableCollection value) { + partial void OnMinecraftFoldersListChanged(ObservableCollection value) { IsMinecraftFoldersListEmpty = !MinecraftFoldersList.Any(); } } diff --git a/BadMC_Launcher/ViewModels/Pages/MainPageViewModel.cs b/BadMC_Launcher/ViewModels/Pages/MainPageViewModel.cs index 13e6614..254722b 100644 --- a/BadMC_Launcher/ViewModels/Pages/MainPageViewModel.cs +++ b/BadMC_Launcher/ViewModels/Pages/MainPageViewModel.cs @@ -1,38 +1,50 @@ using System.Collections.ObjectModel; +using System.ComponentModel; using BadMC_Launcher.Classes; +using BadMC_Launcher.Controls; +using BadMC_Launcher.Controls.MainSearch; using BadMC_Launcher.Extensions; +using BadMC_Launcher.Interfaces; using BadMC_Launcher.Models.Datas.ViewDatas; +using BadMC_Launcher.Models.Enums; using BadMC_Launcher.Services.Settings; using BadMC_Launcher.Views.Pages; +using CommunityToolkit.Labs.WinUI; using CommunityToolkit.Mvvm.Input; -using CommunityToolkit.Mvvm.Messaging.Messages; using CommunityToolkit.Mvvm.Messaging; +using CommunityToolkit.Mvvm.Messaging.Messages; using Microsoft.UI.Xaml.Controls.Primitives; using Microsoft.UI.Xaml.Media.Animation; using Uno.UI.RemoteControl; -using BadMC_Launcher.Controls; -using BadMC_Launcher.Models.Enums; namespace BadMC_Launcher.ViewModels.Pages; public partial class MainPageViewModel : ObservableObject { - - public bool MainSideBarFrameCanGoBack { get; set; } - public MainPageViewModel() { //Init Property WindowName = App.GetService().WindowName; + MainSideBarToolVisibility = Visibility.Collapsed; MainSideBarItems = MainSideBarData.MainSideBarItems; MainSideBarFooterItems = MainSideBarData.MainSideBarFooterItems; + + SearchFilterItems = MainSideBarData.MainMenuSharchFilterItems; + SearchItems = new(); + SearchFilterSelectedItems = new(); + SearchText = string.Empty; + App.GetService().SetBackground((brush) => { - AppBackground = brush; + AppBackground = brush; }); } [ObservableProperty] - public partial string? WindowName { get; set; } + [NotifyCanExecuteChangedFor(nameof(PageGoBackCommand))] + public partial bool MainSideBarFrameCanGoBack { get; set; } + + [ObservableProperty] + public partial string WindowName { get; set; } [ObservableProperty] public partial Brush? AppBackground { get; set; } @@ -48,25 +60,44 @@ public MainPageViewModel() { public partial MainSideBarItem? MainSideBarSelectedItem { get; set; } [ObservableProperty] - public partial UIElement? MainSideBarFlyoutContent { get; set; } + public partial Visibility MainSideBarToolVisibility { get; set; } [ObservableProperty] - public partial Visibility MainSideBarToolVisibility { get; set; } + public partial DistinctiveItemBindingList SearchFilterItems { get; set; } + + [ObservableProperty] + public partial DistinctiveItemBindingList SearchFilterSelectedItems { get; set; } + + [ObservableProperty] + public partial DistinctiveItemBindingList SearchItems { get; set; } + + [ObservableProperty] + public partial string SearchText { get; set; } [RelayCommand] - private void ChangeToolVisibility(Frame parameter) { + private void ChangeToolVisibilityAndSelectedItem(Frame parameter) { if (parameter.Content == null) { MainSideBarToolVisibility = Visibility.Collapsed; } else { MainSideBarToolVisibility = Visibility.Visible; } + + // Set CanGoBack + MainSideBarFrameCanGoBack = parameter.CanGoBack; + + var list = new List(); + list.AddRange(MainSideBarItems); + list.AddRange(MainSideBarFooterItems); + + // Set SelectedItem + MainSideBarSelectedItem = list.FirstOrDefault(item => item.NavigatePage == parameter.Content?.GetType()); } [RelayCommand] - private void ShowFlyoutPage(NavigationView parameter) { - if (parameter.SelectedItem != null) { - SendInvokeFuncMessage(((MainSideBarItem)parameter.SelectedItem).NavigatePage, MainPageMessengerTokenEnum.FlyoutPageNavigateToken); + private void NavigateToPage(NavigationViewSelectionChangedEventArgs args) { + if (args.SelectedItem != null && args.SelectedItem != MainSideBarSelectedItem) { + SendInvokeFuncMessage(((MainSideBarItem)args.SelectedItem).NavigatePage, MainPageMessengerTokenEnum.PageNavigateToken); } } @@ -88,25 +119,39 @@ private void DeselectItem() { MainSideBarSelectedItem = null; } - internal void SetCanGoBack() { - var mainSideBarFrame = SendGetValueMessage(MainPageMessengerTokenEnum.MainSideBarFrameToken); - if (mainSideBarFrame != null) { - MainSideBarFrameCanGoBack = mainSideBarFrame.Response.CanGoBack; - if (mainSideBarFrame.Response.Content == null) { - MainSideBarToolVisibility = Visibility.Collapsed; - } - else { - MainSideBarToolVisibility = Visibility.Visible; + [RelayCommand] + private void SearchItem(AutoSuggestBoxTextChangedEventArgs e) { + if (e.Reason == AutoSuggestionBoxTextChangeReason.UserInput) { + var searchItems = new DistinctiveItemBindingList(); + foreach (var item in SearchFilterSelectedItems) { + foreach (var searchMainMenuSearchResultItem in item.Search(SearchText)) { + searchItems.Add(searchMainMenuSearchResultItem); + } } + SearchItems = searchItems; } } - private void SendInvokeFuncMessage(T value, Enum tokenEnum) { - WeakReferenceMessenger.Default.Send(new ValueChangedMessage(value), tokenEnum.ToString()); + [RelayCommand] + private void SearchItemNavigateToPage(AutoSuggestBoxSuggestionChosenEventArgs e) { + if (e.SelectedItem is MainMenuSearchResultItem selectedItem) { + selectedItem.Navigate.Invoke(); + } } - private RequestMessage SendGetValueMessage(Enum tokenEnum) { - return WeakReferenceMessenger.Default.Send(new RequestMessage(), tokenEnum.ToString()); + [RelayCommand] + private void OpenSearchFilter(AutoSuggestBox parameter) { + FlyoutBase.ShowAttachedFlyout(parameter); + } + + [RelayCommand] + private void ChangeSearchFilter(IMainMenuSharchFilterItem[] parameter) { + SearchFilterSelectedItems.Clear(); + SearchFilterSelectedItems.AddRange(parameter.ToObservableCollection()); + } + + private void SendInvokeFuncMessage(T value, Enum tokenEnum) { + WeakReferenceMessenger.Default.Send(new ValueChangedMessage(value), tokenEnum.ToString()); } } diff --git a/BadMC_Launcher/ViewModels/Pages/MainSideBar/MainMenuPageViewModel.cs b/BadMC_Launcher/ViewModels/Pages/MainSideBar/MainMenuPageViewModel.cs deleted file mode 100644 index 3801123..0000000 --- a/BadMC_Launcher/ViewModels/Pages/MainSideBar/MainMenuPageViewModel.cs +++ /dev/null @@ -1,97 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; -using System.Reflection.Metadata; -using System.Text; -using System.Threading.Tasks; -using BadMC_Launcher.Classes; -using BadMC_Launcher.Extensions; -using BadMC_Launcher.Interfaces; -using BadMC_Launcher.Models.Datas.ViewDatas; -using BadMC_Launcher.Services.ViewServices; -using BadMC_Launcher.Controls; -using BadMC_Launcher.Controls.MainSearch; -using BadMC_Launcher.Views.Pages.MainSideBar; -using BadMC_Launcher.Views.Pages.Settings; -using CommunityToolkit.Labs.WinUI; -using CommunityToolkit.Mvvm.Input; -using CommunityToolkit.Mvvm.Messaging; -using CommunityToolkit.Mvvm.Messaging.Messages; -using CommunityToolkit.WinUI.Controls; -using Microsoft.Windows.ApplicationModel.Resources; -using BadMC_Launcher.Models.Enums; - -namespace BadMC_Launcher.ViewModels.Pages.MainSideBar; -public partial class MainMenuPageViewModel : ObservableObject { - public MainMenuPageViewModel() { - MainMenuItems = MainMenuData.MainMenuItems; - SearchFilterItems = MainMenuData.MainMenuSharchFilterItems; - SearchItems = new(); - SearchFilterSelectedItems = new(); - SearchFilterRealTimeToggleIsOn = true; - SearchText = string.Empty; - } - - [ObservableProperty] - public partial DistinctiveItemBindingList SearchFilterItems { get; set; } - - [ObservableProperty] - public partial DistinctiveItemBindingList SearchFilterSelectedItems { get; set; } - - [ObservableProperty] - public partial DistinctiveItemBindingList SearchItems { get; set; } - - [ObservableProperty] - public partial string SearchText { get; set; } - - [ObservableProperty] - public partial bool SearchFilterRealTimeToggleIsOn { get; set; } - - [ObservableProperty] - public partial DistinctiveItemBindingList MainMenuItems { get; set; } - - //TODO: 该写Blog了,还能这样的啊???Σ(っ °Д °;)っ - [RelayCommand] - private void SearchTextChanged_SearchItem(AutoSuggestBoxQuerySubmittedEventArgs e) { - MainMenuSearch(e.QueryText); - } - - [RelayCommand] - private void SearchButtonClicked_SearchItem(AutoSuggestBoxTextChangedEventArgs e) { - if (SearchFilterRealTimeToggleIsOn && e.Reason == AutoSuggestionBoxTextChangeReason.UserInput) { - MainMenuSearch(SearchText); - } - } - - [RelayCommand] - private void SearchItemNavigateToPage(AutoSuggestBoxSuggestionChosenEventArgs e) { - if (e.SelectedItem is MainMenuSearchResultItem selectedItem) { - selectedItem.Navigate.Invoke(); - } - } - - [RelayCommand] - private void AddSearchFilter(TokenView parameter) { - parameter.SelectedItems.ForEach(item => { - if (item is IMainMenuSharchFilterItem mainMenuSharchFilterItem) { - SearchFilterSelectedItems.Add(mainMenuSharchFilterItem); - } - }); - } - - [RelayCommand] - private void NavigateToSettingsPage() { - WeakReferenceMessenger.Default.Send(new ValueChangedMessage(typeof(SettingsDashboardPage)), MainPageMessengerTokenEnum.PageNavigateToken.ToString()); - } - - private void MainMenuSearch(string queryText) { - var searchItems = new DistinctiveItemBindingList(); - foreach (var item in SearchFilterSelectedItems) { - foreach (var searchMainMenuSearchResultItem in item.Search(queryText)) { - searchItems.Add(searchMainMenuSearchResultItem); - } - } - SearchItems = searchItems; - } -} diff --git a/BadMC_Launcher/ViewModels/Pages/Settings/LaunchSettingsPageViewModel.cs b/BadMC_Launcher/ViewModels/Pages/Settings/LaunchSettingsPageViewModel.cs index d82c5ee..e49af0f 100644 --- a/BadMC_Launcher/ViewModels/Pages/Settings/LaunchSettingsPageViewModel.cs +++ b/BadMC_Launcher/ViewModels/Pages/Settings/LaunchSettingsPageViewModel.cs @@ -4,9 +4,11 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using BadMC_Launcher.Controls.Minecraft; using BadMC_Launcher.Models.Datas.SettingsDatas; +using BadMC_Launcher.Models.Enums; using BadMC_Launcher.Services.Settings; -using BadMC_Launcher.Controls.Minecraft; +using BadMC_Launcher.ViewModels.ContentDialogs.Settings; using BadMC_Launcher.Views.ContentDialogs.Settings; using BadMC_Launcher.Views.Pages.Settings; using CommunityToolkit.Mvvm.Input; @@ -14,7 +16,6 @@ using CommunityToolkit.Mvvm.Messaging.Messages; using MinecraftLaunch.Base.Models.Game; using MinecraftLaunch.Utilities; -using BadMC_Launcher.Models.Enums; namespace BadMC_Launcher.ViewModels.Pages.Settings; @@ -23,7 +24,7 @@ public partial class LaunchSettingsPageViewModel : ObservableObject { private readonly XamlRoot? mainPageXamlRoot; private MinecraftConfigService minecraftService = App.GetService(); private ResourceLoader sourceService = App.GetService(); - private MinecraftFolderEntry? minecraftFolder; + private MinecraftFolderViewItem? minecraftFolder; private JavaEntry? java; public LaunchSettingsPageViewModel() { @@ -69,9 +70,9 @@ private async Task ShowMinecraftFolderManagerDialog() { } [RelayCommand(FlowExceptionsToTaskScheduler = true)] - private async Task ShowJavaPathManagerDialog() { + private async Task ShowJavaManagerDialog() { if (mainPageXamlRoot != null) { - var dialog = App.GetService(); + var dialog = App.GetService(); dialog.XamlRoot = mainPageXamlRoot; await dialog.ShowAsync(); @@ -86,7 +87,7 @@ private void SetIsAutoMemorySize() { private async void GetJavaInfo() { java = await JavaUtil.GetJavaInfoAsync(minecraftService.ActiveJavaPath); - JavaId = java != null ? java.JavaVersion : sourceService.GetString("Global_NullJavaId"); + JavaId = java != null ? $"{java.JavaType} {java.JavaVersion}" : sourceService.GetString("Global_NullJavaId"); JavaPath = java != null ? java.JavaPath : sourceService.GetString("Global_NullJavaPath"); } diff --git a/BadMC_Launcher/ViewModels/UserControls/LaunchPadViewModel.cs b/BadMC_Launcher/ViewModels/UserControls/LaunchPadViewModel.cs index c17572d..8818f6c 100644 --- a/BadMC_Launcher/ViewModels/UserControls/LaunchPadViewModel.cs +++ b/BadMC_Launcher/ViewModels/UserControls/LaunchPadViewModel.cs @@ -61,14 +61,14 @@ public LaunchPadViewModel() { //MinecraftsList [ObservableProperty] - public partial ObservableCollection MinecraftEntryList { get; set; } + public partial ObservableCollection MinecraftEntryList { get; set; } [ObservableProperty] public partial bool IsMinecraftEntryListEmpty { get; set; } //MinecraftFolderPathsList [ObservableProperty] - public partial ObservableCollection MinecraftFolderEntryList { get; set; } + public partial ObservableCollection MinecraftFolderEntryList { get; set; } [ObservableProperty] public partial int MinecraftFolderEntryListSelectedIndex { get; set; } @@ -149,11 +149,11 @@ partial void OnMinecraftEntryListSelectedIndexChanged(int value) { LaunchButtonMinecraftIcon = MinecraftEntryList.ElementAtOrDefault(MinecraftEntryListSelectedIndex)?.MinecraftImage ?? new() { UriSource = new(@"ms-appx:///Assets/Icons/MinecraftIcons/drowned.png")}; } - private void MinecraftConfig_PropertyChanged(object? sender, PropertyChangedEventArgs e) { + private void MinecraftConfig_PropertyChanged(object? sender, PropertyChangedEventArgs args) { var selectedItem = minecraftService.MinecraftFolders.FirstOrDefault(item => item.MinecraftFolderPath == minecraftService.ActiveMinecraftFolderPath); // Update Property - switch (e.PropertyName) { + switch (args.PropertyName) { case nameof(MinecraftConfigService.ActiveMinecraftFolderPath): // Set MinecraftFolderEntries SelectedIndex MinecraftFolderEntryListSelectedIndex = MinecraftFolderEntryList.GetIndex(item => item.MinecraftFolderPath == minecraftService.ActiveMinecraftFolderPath); @@ -184,7 +184,12 @@ private void MinecraftConfig_PropertyChanged(object? sender, PropertyChangedEven } //Set CanExecute for ViewLoaclMinecraftFolderCommand - private bool SetIsNotActiveMinecraftEntryEmpty() => MinecraftEntryListSelectedIndex >= 0; + private bool SetIsNotActiveMinecraftEntryEmpty() { + if (MinecraftEntryList.Any()) { + return MinecraftEntryListSelectedIndex >= 0; + } + return false; + } private void RefreshMinecraftEntryList() { if (MinecraftFolderEntryList.TryElementAt(MinecraftFolderEntryListSelectedIndex, out var selectedItem) && selectedItem != null) { @@ -201,7 +206,7 @@ private void RefreshMinecraftEntryList() { MinecraftEntryList.Clear(); } - partial void OnMinecraftEntryListChanged(ObservableCollection value) { + partial void OnMinecraftEntryListChanged(ObservableCollection value) { IsMinecraftEntryListEmpty = !MinecraftEntryList.Any(); } diff --git a/BadMC_Launcher/Views/ContentDialogs/Settings/JavaContentDialog.xaml b/BadMC_Launcher/Views/ContentDialogs/Settings/JavaContentDialog.xaml new file mode 100644 index 0000000..3a365ab --- /dev/null +++ b/BadMC_Launcher/Views/ContentDialogs/Settings/JavaContentDialog.xaml @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BadMC_Launcher/Views/ContentDialogs/Settings/JavaContentDialog.xaml.cs b/BadMC_Launcher/Views/ContentDialogs/Settings/JavaContentDialog.xaml.cs new file mode 100644 index 0000000..8473626 --- /dev/null +++ b/BadMC_Launcher/Views/ContentDialogs/Settings/JavaContentDialog.xaml.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices.WindowsRuntime; +using BadMC_Launcher.ViewModels.ContentDialogs.Settings; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Controls.Primitives; +using Microsoft.UI.Xaml.Data; +using Microsoft.UI.Xaml.Input; +using Microsoft.UI.Xaml.Media; +using Microsoft.UI.Xaml.Navigation; +using Windows.Foundation; +using Windows.Foundation.Collections; + +namespace BadMC_Launcher.Views.ContentDialogs.Settings; +public sealed partial class JavaContentDialog : ContentDialog { + public JavaContentDialog() { + InitializeComponent(); + DataContext = new JavaContentDialogViewModel(); + } +} diff --git a/BadMC_Launcher/Views/ContentDialogs/Settings/MinecraftFolderContentDialog.xaml b/BadMC_Launcher/Views/ContentDialogs/Settings/MinecraftFolderContentDialog.xaml index 369cf10..70c093e 100644 --- a/BadMC_Launcher/Views/ContentDialogs/Settings/MinecraftFolderContentDialog.xaml +++ b/BadMC_Launcher/Views/ContentDialogs/Settings/MinecraftFolderContentDialog.xaml @@ -6,12 +6,15 @@ xmlns:local="using:BadMC_Launcher.Views.ContentDialogs.Settings" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" x:Uid="MinecraftFolderContentDialog_ViewContentDialog" + MaxWidth="900" + MaxHeight="550" PrimaryButtonStyle="{StaticResource AccentButtonStyle}" Style="{ThemeResource DefaultContentDialogStyle}"> - + @@ -35,41 +38,31 @@ - - - - - + - - - - - - + Text="{Binding NewRenameMinecraftFolderId, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> - - - + - @@ -106,18 +99,18 @@ Spacing="8"> + + + - + + Opacity="{Binding IsMinecraftFoldersListEmpty, Converter={StaticResource BoolToOpacityConverter}}" + Spacing="8" + Visibility="{Binding IsMinecraftFoldersListEmpty, Converter={StaticResource BoolToVisibilityConverter}}"> @@ -158,10 +152,10 @@ - - diff --git a/BadMC_Launcher/Views/ContentDialogs/Settings/MinecraftFolderContentDialog.xaml.cs b/BadMC_Launcher/Views/ContentDialogs/Settings/MinecraftFolderContentDialog.xaml.cs index 62378af..c571c8b 100644 --- a/BadMC_Launcher/Views/ContentDialogs/Settings/MinecraftFolderContentDialog.xaml.cs +++ b/BadMC_Launcher/Views/ContentDialogs/Settings/MinecraftFolderContentDialog.xaml.cs @@ -21,7 +21,7 @@ namespace BadMC_Launcher.Views.ContentDialogs.Settings; public sealed partial class MinecraftFolderContentDialog : ContentDialog { public MinecraftFolderContentDialog() { - this.InitializeComponent(); + this.InitializeComponent(); DataContext = new MinecraftFolderContentDialogViewModel(); //Register Messenger diff --git a/BadMC_Launcher/Views/Pages/MainPage.xaml b/BadMC_Launcher/Views/Pages/MainPage.xaml index 8df60fa..94a06fb 100644 --- a/BadMC_Launcher/Views/Pages/MainPage.xaml +++ b/BadMC_Launcher/Views/Pages/MainPage.xaml @@ -6,6 +6,7 @@ xmlns:animations="using:CommunityToolkit.WinUI.Animations" xmlns:behaviors="using:CommunityToolkit.WinUI.Behaviors" xmlns:converters="using:CommunityToolkit.WinUI.Converters" + xmlns:labs="using:CommunityToolkit.Labs.WinUI" xmlns:local="using:BadMC_Launcher" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:skia="http://uno.ui/skia" @@ -15,7 +16,7 @@ Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" mc:Ignorable="skia"> - @@ -56,7 +57,7 @@ - + @@ -89,7 +90,7 @@ Margin="-1" FooterMenuItemsSource="{Binding MainSideBarFooterItems}" IsBackButtonVisible="Collapsed" - IsSettingsVisible="false" + IsSettingsVisible="False" MenuItemsSource="{Binding MainSideBarItems}" PaneDisplayMode="LeftCompact" SelectedItem="{Binding MainSideBarSelectedItem, Mode=TwoWay}"> @@ -100,6 +101,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -111,7 +187,7 @@ - + @@ -120,14 +196,11 @@ - - + @@ -138,12 +211,12 @@ + Duration="0:0:0.6" /> + Duration="0:0:0.6" /> @@ -152,12 +225,12 @@ EasingType="Circle" From="1" To="0" - Duration="0:0:0.3" /> + Duration="0:0:0.2" /> + Duration="0:0:0.2" /> @@ -173,7 +246,7 @@ - - - + - + @@ -236,6 +309,11 @@ + + + diff --git a/BadMC_Launcher/Views/Pages/MainPage.xaml.cs b/BadMC_Launcher/Views/Pages/MainPage.xaml.cs index 257b0ed..72782c5 100644 --- a/BadMC_Launcher/Views/Pages/MainPage.xaml.cs +++ b/BadMC_Launcher/Views/Pages/MainPage.xaml.cs @@ -15,16 +15,13 @@ public MainPage() { //Register NavigationToPage Messengers WeakReferenceMessenger.Default.Register, string>(this, MainPageMessengerTokenEnum.PageNavigateToken.ToString(), MainFrameNavigate); - WeakReferenceMessenger.Default.Register, string>(this, MainPageMessengerTokenEnum.FlyoutPageNavigateToken.ToString(), MainFlyoutFrameNavigate); - //Register Frame Messengers - WeakReferenceMessenger.Default.Register, string>(this, MainPageMessengerTokenEnum.MainSideBarFrameToken.ToString(), (r, m) => m.Reply(MainSideBarFrame)); - WeakReferenceMessenger.Default.Register, string>(this, MainPageMessengerTokenEnum.MainSideBarFlyoutFrameToken.ToString(), (r, m) => m.Reply(MainSideBarFlyoutFrame)); + //Register GetXamlRoot Messengers WeakReferenceMessenger.Default.Register, string>(this, MainPageMessengerTokenEnum.XamlRootToken.ToString(), (r, m) => m.Reply(this.XamlRoot)); } public void MainFrameNavigate(object recipient, ValueChangedMessage message) { - MainSideBarFlyout.Hide(); + //MainSideBarFlyout.Hide(); if (MainSideBarFrame.Content != null && MainSideBarFrame.Content.GetType() == message.Value) { return; } @@ -33,15 +30,4 @@ public void MainFrameNavigate(object recipient, ValueChangedMessage messag MainSideBarFrame.Navigate(message.Value, null, new EntranceNavigationTransitionInfo()); } } - - public void MainFlyoutFrameNavigate(object recipient, ValueChangedMessage message) { - if (MainSideBarFrame.Content != null && MainSideBarFrame.Content.GetType() == message.Value) { - return; - } - - if (typeof(Page).IsAssignableFrom(message.Value)) { - MainSideBarFlyoutFrame.Navigate(message.Value, null, new SuppressNavigationTransitionInfo()); - FlyoutBase.ShowAttachedFlyout(AppTitleBar); - } - } } diff --git a/BadMC_Launcher/Views/Pages/MainSideBar/MainMenuPage.xaml b/BadMC_Launcher/Views/Pages/MainSideBar/MainMenuPage.xaml deleted file mode 100644 index ef1b950..0000000 --- a/BadMC_Launcher/Views/Pages/MainSideBar/MainMenuPage.xaml +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/BadMC_Launcher/Views/Pages/MainSideBar/MainMenuPage.xaml.cs b/BadMC_Launcher/Views/Pages/MainSideBar/MainMenuPage.xaml.cs deleted file mode 100644 index d61bdd6..0000000 --- a/BadMC_Launcher/Views/Pages/MainSideBar/MainMenuPage.xaml.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Runtime.InteropServices.WindowsRuntime; -using Windows.Foundation; -using Windows.Foundation.Collections; -using Microsoft.UI.Xaml; -using Microsoft.UI.Xaml.Controls; -using Microsoft.UI.Xaml.Controls.Primitives; -using Microsoft.UI.Xaml.Data; -using Microsoft.UI.Xaml.Input; -using Microsoft.UI.Xaml.Media; -using Microsoft.UI.Xaml.Navigation; -using BadMC_Launcher.ViewModels.Pages.MainSideBar; - -// The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=234238 - -namespace BadMC_Launcher.Views.Pages.MainSideBar; - -/// -/// An empty page that can be used on its own or navigated to within a Frame. -/// -public sealed partial class MainMenuPage : Page -{ - public MainMenuPage() - { - this.InitializeComponent(); - DataContext = new MainMenuPageViewModel(); - } -} diff --git a/BadMC_Launcher/Views/Pages/Settings/LaunchSettingsPage.xaml b/BadMC_Launcher/Views/Pages/Settings/LaunchSettingsPage.xaml index c1445ac..0e3a1b7 100644 --- a/BadMC_Launcher/Views/Pages/Settings/LaunchSettingsPage.xaml +++ b/BadMC_Launcher/Views/Pages/Settings/LaunchSettingsPage.xaml @@ -13,7 +13,7 @@ + Severity="Informational"/> @@ -32,19 +32,20 @@ + TextWrapping="Wrap" /> - + @@ -53,16 +54,18 @@ - diff --git a/BadMC_Launcher/Views/UserControls/LaunchPad.xaml b/BadMC_Launcher/Views/UserControls/LaunchPad.xaml index be757b1..a886b2f 100644 --- a/BadMC_Launcher/Views/UserControls/LaunchPad.xaml +++ b/BadMC_Launcher/Views/UserControls/LaunchPad.xaml @@ -12,9 +12,10 @@ d:DesignWidth="400" mc:Ignorable="d"> - + @@ -64,12 +65,13 @@ + Opacity="{Binding IsMinecraftEntryListEmpty, Converter={StaticResource BoolToOpacityConverter}}" + Spacing="8" + Visibility="{Binding IsMinecraftEntryListEmpty, Converter={StaticResource BoolToVisibilityConverter}}"> @@ -205,11 +208,17 @@ FontSize="40" Glyph="" /> - + HorizontalTextAlignment="Center" + Style="{ThemeResource BodyStrongTextBlockStyle}" + TextWrapping="Wrap" /> + + + diff --git a/BadMC_Launcher/Views/UserControls/LaunchPad.xaml.cs b/BadMC_Launcher/Views/UserControls/LaunchPad.xaml.cs index 93e9c36..f4458d8 100644 --- a/BadMC_Launcher/Views/UserControls/LaunchPad.xaml.cs +++ b/BadMC_Launcher/Views/UserControls/LaunchPad.xaml.cs @@ -1,18 +1,4 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Runtime.InteropServices.WindowsRuntime; using BadMC_Launcher.ViewModels.UserControls; -using Microsoft.UI.Xaml; -using Microsoft.UI.Xaml.Controls; -using Microsoft.UI.Xaml.Controls.Primitives; -using Microsoft.UI.Xaml.Data; -using Microsoft.UI.Xaml.Input; -using Microsoft.UI.Xaml.Media; -using Microsoft.UI.Xaml.Navigation; -using Windows.Foundation; -using Windows.Foundation.Collections; // The User Control item template is documented at https://go.microsoft.com/fwlink/?LinkId=234236 diff --git a/BadMC_Launcher/Views/UserControls/LoadingAnimation.xaml b/BadMC_Launcher/Views/UserControls/LoadingAnimation.xaml new file mode 100644 index 0000000..02158af --- /dev/null +++ b/BadMC_Launcher/Views/UserControls/LoadingAnimation.xaml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/BadMC_Launcher/Views/UserControls/LoadingAnimation.xaml.cs b/BadMC_Launcher/Views/UserControls/LoadingAnimation.xaml.cs new file mode 100644 index 0000000..11a3f49 --- /dev/null +++ b/BadMC_Launcher/Views/UserControls/LoadingAnimation.xaml.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices.WindowsRuntime; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Controls.Primitives; +using Microsoft.UI.Xaml.Data; +using Microsoft.UI.Xaml.Input; +using Microsoft.UI.Xaml.Media; +using Microsoft.UI.Xaml.Navigation; +using Windows.Foundation; +using Windows.Foundation.Collections; + +// The User Control item template is documented at https://go.microsoft.com/fwlink/?LinkId=234236 + +namespace BadMC_Launcher.Views.UserControls; +public sealed partial class LoadingAnimation : UserControl { + public LoadingAnimation() { + InitializeComponent(); + } + + // Register property + public static readonly DependencyProperty IsLoadingProperty = + DependencyProperty.Register( + nameof(IsLoading), + typeof(bool), + typeof(LoadingAnimation), + new PropertyMetadata(false, OnIsLoadingChanged)); + + public static readonly DependencyProperty LoadDescriptionProperty = + DependencyProperty.Register( + nameof(LoadDescription), + typeof(string), + typeof(LoadingAnimation), + new PropertyMetadata(false, OnLoadDescriptionChanged)); + + public bool IsLoading { + get => (bool)GetValue(IsLoadingProperty); + set => SetValue(IsLoadingProperty, value); + } + + public string LoadDescription { + get => (string)GetValue(IsLoadingProperty); + set => SetValue(LoadDescriptionProperty, value); + } + + // On property changed + private static void OnIsLoadingChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { + var control = (LoadingAnimation)d; + + if ((bool)e.NewValue) { + control.IsHitTestVisible = true; + +#if HAS_UNO_WINUI + control.LoadBeginAnimation.Start(); +#else + control.Opacity = 1; +#endif + + return; + } + control.IsHitTestVisible = false; + +#if HAS_UNO_WINUI + control.LoadEndAnimation.Start(); +#else + control.Opacity = 0; +#endif + } + + private static void OnLoadDescriptionChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { + var control = (LoadingAnimation)d; + control.LoadLoadDescriptionTextBlock.Text = (string)e.NewValue; + } +} diff --git a/Directory.Packages.props b/Directory.Packages.props index cc3663c..994c71f 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -21,6 +21,7 @@ + From 6925077ec50d0abed13575310eefd86f3787fef2 Mon Sep 17 00:00:00 2001 From: Starcloudsea <84891987+Starcloudsea@users.noreply.github.com> Date: Mon, 14 Apr 2025 21:01:54 +0800 Subject: [PATCH 10/40] HaveBug. --- .idea/.idea.BadMC_Launcher/.idea/.gitignore | 13 +++++++++++ .../.idea/indexLayout.xml | 8 +++++++ .idea/.idea.BadMC_Launcher/.idea/vcs.xml | 6 +++++ .../BadMC_Launcher.Benchmarks.csproj | 1 - .../BadMC_Launcher.Tests.csproj | 3 +-- BadMC_Launcher/App.xaml.cs | 2 -- BadMC_Launcher/BadMC_Launcher.csproj | 2 +- .../ViewModels/Pages/MainPageViewModel.cs | 2 -- .../Settings/LaunchSettingsPageViewModel.cs | 1 + BadMC_Launcher/Views/Pages/MainPage.xaml | 22 +++++++++---------- Directory.Packages.props | 21 +++++++++--------- 11 files changed, 52 insertions(+), 29 deletions(-) create mode 100644 .idea/.idea.BadMC_Launcher/.idea/.gitignore create mode 100644 .idea/.idea.BadMC_Launcher/.idea/indexLayout.xml create mode 100644 .idea/.idea.BadMC_Launcher/.idea/vcs.xml diff --git a/.idea/.idea.BadMC_Launcher/.idea/.gitignore b/.idea/.idea.BadMC_Launcher/.idea/.gitignore new file mode 100644 index 0000000..92cd002 --- /dev/null +++ b/.idea/.idea.BadMC_Launcher/.idea/.gitignore @@ -0,0 +1,13 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# Rider 忽略的文件 +/contentModel.xml +/modules.xml +/projectSettingsUpdater.xml +/.idea.BadMC_Launcher.iml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/.idea.BadMC_Launcher/.idea/indexLayout.xml b/.idea/.idea.BadMC_Launcher/.idea/indexLayout.xml new file mode 100644 index 0000000..7b08163 --- /dev/null +++ b/.idea/.idea.BadMC_Launcher/.idea/indexLayout.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/.idea.BadMC_Launcher/.idea/vcs.xml b/.idea/.idea.BadMC_Launcher/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/.idea.BadMC_Launcher/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/BadMC_Launcher.Benchmarks/BadMC_Launcher.Benchmarks.csproj b/BadMC_Launcher.Benchmarks/BadMC_Launcher.Benchmarks.csproj index b9f90c0..6ffe01f 100644 --- a/BadMC_Launcher.Benchmarks/BadMC_Launcher.Benchmarks.csproj +++ b/BadMC_Launcher.Benchmarks/BadMC_Launcher.Benchmarks.csproj @@ -12,7 +12,6 @@ - diff --git a/BadMC_Launcher.Tests/BadMC_Launcher.Tests.csproj b/BadMC_Launcher.Tests/BadMC_Launcher.Tests.csproj index baf6f73..3746251 100644 --- a/BadMC_Launcher.Tests/BadMC_Launcher.Tests.csproj +++ b/BadMC_Launcher.Tests/BadMC_Launcher.Tests.csproj @@ -1,4 +1,4 @@ - + net9.0 @@ -10,7 +10,6 @@ - diff --git a/BadMC_Launcher/App.xaml.cs b/BadMC_Launcher/App.xaml.cs index 8eb0caf..a11be3f 100644 --- a/BadMC_Launcher/App.xaml.cs +++ b/BadMC_Launcher/App.xaml.cs @@ -31,8 +31,6 @@ public App() { ApplicationLanguages.PrimaryLanguageOverride = "zh-Hans"; } - public static new App Current => (App)Application.Current; - public Window? MainWindow { get; private set; } public IHost? Host { get; private set; } diff --git a/BadMC_Launcher/BadMC_Launcher.csproj b/BadMC_Launcher/BadMC_Launcher.csproj index f8c35bb..caa2b53 100644 --- a/BadMC_Launcher/BadMC_Launcher.csproj +++ b/BadMC_Launcher/BadMC_Launcher.csproj @@ -63,10 +63,10 @@ - + diff --git a/BadMC_Launcher/ViewModels/Pages/MainPageViewModel.cs b/BadMC_Launcher/ViewModels/Pages/MainPageViewModel.cs index 254722b..91f8e0b 100644 --- a/BadMC_Launcher/ViewModels/Pages/MainPageViewModel.cs +++ b/BadMC_Launcher/ViewModels/Pages/MainPageViewModel.cs @@ -8,8 +8,6 @@ using BadMC_Launcher.Models.Datas.ViewDatas; using BadMC_Launcher.Models.Enums; using BadMC_Launcher.Services.Settings; -using BadMC_Launcher.Views.Pages; -using CommunityToolkit.Labs.WinUI; using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Messaging; using CommunityToolkit.Mvvm.Messaging.Messages; diff --git a/BadMC_Launcher/ViewModels/Pages/Settings/LaunchSettingsPageViewModel.cs b/BadMC_Launcher/ViewModels/Pages/Settings/LaunchSettingsPageViewModel.cs index e49af0f..b078537 100644 --- a/BadMC_Launcher/ViewModels/Pages/Settings/LaunchSettingsPageViewModel.cs +++ b/BadMC_Launcher/ViewModels/Pages/Settings/LaunchSettingsPageViewModel.cs @@ -11,6 +11,7 @@ using BadMC_Launcher.ViewModels.ContentDialogs.Settings; using BadMC_Launcher.Views.ContentDialogs.Settings; using BadMC_Launcher.Views.Pages.Settings; +using BadMC_Launcher.Views.UserControls; using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Messaging; using CommunityToolkit.Mvvm.Messaging.Messages; diff --git a/BadMC_Launcher/Views/Pages/MainPage.xaml b/BadMC_Launcher/Views/Pages/MainPage.xaml index 94a06fb..129404e 100644 --- a/BadMC_Launcher/Views/Pages/MainPage.xaml +++ b/BadMC_Launcher/Views/Pages/MainPage.xaml @@ -5,8 +5,8 @@ xmlns:animatedvisuals="using:Microsoft.UI.Xaml.Controls.AnimatedVisuals" xmlns:animations="using:CommunityToolkit.WinUI.Animations" xmlns:behaviors="using:CommunityToolkit.WinUI.Behaviors" + xmlns:controls="using:CommunityToolkit.WinUI.Controls" xmlns:converters="using:CommunityToolkit.WinUI.Converters" - xmlns:labs="using:CommunityToolkit.Labs.WinUI" xmlns:local="using:BadMC_Launcher" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:skia="http://uno.ui/skia" @@ -103,8 +103,8 @@ - @@ -115,7 +115,7 @@ - + @@ -145,11 +145,11 @@ - - + + - + @@ -168,7 +168,7 @@ - + diff --git a/Directory.Packages.props b/Directory.Packages.props index 994c71f..911b3f3 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -9,16 +9,17 @@ - - - - - - - - + + + + + + + + + - + @@ -31,6 +32,6 @@ - + \ No newline at end of file From b98ca4ad2c20f0737ae248887ba6d28bbefc5c78 Mon Sep 17 00:00:00 2001 From: Starcloudsea <84891987+Starcloudsea@users.noreply.github.com> Date: Tue, 22 Apr 2025 12:04:24 +0800 Subject: [PATCH 11/40] =?UTF-8?q?=E6=88=91=E5=A4=8D=E6=B4=BB=E4=BA=86(?= =?UTF-8?q?=E5=96=9C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BadMC_Launcher.Benchmarks/UnitTest1.cs | 8 +- BadMC_Launcher/App.xaml | 5 + BadMC_Launcher/App.xaml.cs | 2 + .../Icons/JavaIcons/{oracle.png => java.png} | Bin BadMC_Launcher/BadMC_Launcher.csproj | 1 + .../Controls/Minecraft/JavaViewItem.cs | 4 +- .../ItemTemplate/JavaItemsTemplate.xaml | 2 +- .../Extensions/IEnumerableExtension.cs | 4 + .../Extensions/JavaEntryExtension.cs | 6 +- .../Datas/SettingsDatas/MinecraftConfig.cs | 2 + .../SettingsDatas/SingleMinecraftConfig.cs | 2 + .../Datas/SettingsDatas/ThemeSetting.cs | 2 +- .../Models/Enums/MessengerTokenEnum.cs | 5 +- BadMC_Launcher/Services/FileService.cs | 147 +++++++----------- .../Settings/MinecraftConfigService.cs | 72 +++++++-- .../Settings/SingleMinecraftConfigService.cs | 17 +- .../ViewServices/MainSideBarService.cs | 2 +- BadMC_Launcher/Strings/zh-Hans/Resources.resw | 3 + .../Settings/JavaContentDialogViewModel.cs | 23 ++- .../ViewModels/Pages/MainPageViewModel.cs | 68 ++++---- .../Settings/JavaContentDialog.xaml | 15 +- .../MinecraftFolderContentDialog.xaml | 9 +- BadMC_Launcher/Views/Pages/MainPage.xaml | 82 ++++------ BadMC_Launcher/Views/Pages/MainPage.xaml.cs | 21 ++- global.json | 5 +- 25 files changed, 297 insertions(+), 210 deletions(-) rename BadMC_Launcher/Assets/Icons/JavaIcons/{oracle.png => java.png} (100%) diff --git a/BadMC_Launcher.Benchmarks/UnitTest1.cs b/BadMC_Launcher.Benchmarks/UnitTest1.cs index d469b15..6bb37b7 100644 --- a/BadMC_Launcher.Benchmarks/UnitTest1.cs +++ b/BadMC_Launcher.Benchmarks/UnitTest1.cs @@ -1,16 +1,14 @@ using System.Collections.ObjectModel; using BadMC_Launcher.Classes; -using BadMC_Launcher.Servicess; -using BadMC_Launcher.Servicess.Settings; +using BadMC_Launcher.Services.Settings; using BenchmarkDotNet.Attributes; -using static System.Runtime.InteropServices.JavaScript.JSType; namespace BadMC_Launcher.Benchmarks; public class UnitTest1 { [Benchmark] - public async void Test1() { - await ThemeSettingService.GetBingWallpaperUrl(); + public void Test1() { + } } diff --git a/BadMC_Launcher/App.xaml b/BadMC_Launcher/App.xaml index 8a4ae7b..0dd7db5 100644 --- a/BadMC_Launcher/App.xaml +++ b/BadMC_Launcher/App.xaml @@ -9,6 +9,11 @@ + + + + + diff --git a/BadMC_Launcher/App.xaml.cs b/BadMC_Launcher/App.xaml.cs index a11be3f..8eb0caf 100644 --- a/BadMC_Launcher/App.xaml.cs +++ b/BadMC_Launcher/App.xaml.cs @@ -31,6 +31,8 @@ public App() { ApplicationLanguages.PrimaryLanguageOverride = "zh-Hans"; } + public static new App Current => (App)Application.Current; + public Window? MainWindow { get; private set; } public IHost? Host { get; private set; } diff --git a/BadMC_Launcher/Assets/Icons/JavaIcons/oracle.png b/BadMC_Launcher/Assets/Icons/JavaIcons/java.png similarity index 100% rename from BadMC_Launcher/Assets/Icons/JavaIcons/oracle.png rename to BadMC_Launcher/Assets/Icons/JavaIcons/java.png diff --git a/BadMC_Launcher/BadMC_Launcher.csproj b/BadMC_Launcher/BadMC_Launcher.csproj index caa2b53..322aa84 100644 --- a/BadMC_Launcher/BadMC_Launcher.csproj +++ b/BadMC_Launcher/BadMC_Launcher.csproj @@ -79,6 +79,7 @@ + diff --git a/BadMC_Launcher/Controls/Minecraft/JavaViewItem.cs b/BadMC_Launcher/Controls/Minecraft/JavaViewItem.cs index c359bfc..d9597c0 100644 --- a/BadMC_Launcher/Controls/Minecraft/JavaViewItem.cs +++ b/BadMC_Launcher/Controls/Minecraft/JavaViewItem.cs @@ -19,7 +19,7 @@ public JavaViewItem(JavaEntry javaEntry) { JavaPath = Entry.JavaPath; - JavaIcon = Entry.GetJavaIcon(); + JavaIconPath = Entry.GetJavaIconPath(); } public JavaEntry Entry { get; init; } @@ -30,7 +30,7 @@ public JavaViewItem(JavaEntry javaEntry) { public string JavaPath { get; init; } - public BitmapImage JavaIcon { get; init; } + public string JavaIconPath { get; init; } public static bool operator ==(JavaViewItem? left, JavaViewItem? right) { return left is not null && right is not null ? diff --git a/BadMC_Launcher/Dictionaries/Templates/ItemTemplate/JavaItemsTemplate.xaml b/BadMC_Launcher/Dictionaries/Templates/ItemTemplate/JavaItemsTemplate.xaml index 79f5876..c3d0f43 100644 --- a/BadMC_Launcher/Dictionaries/Templates/ItemTemplate/JavaItemsTemplate.xaml +++ b/BadMC_Launcher/Dictionaries/Templates/ItemTemplate/JavaItemsTemplate.xaml @@ -44,7 +44,7 @@ BorderThickness="4" CornerRadius="8"> - + (this IEnumerable source, int index, out T? returnItem = default; return false; } + + public static bool HasIndex(this IEnumerable list, int index) { + return index >= 0 && index < list.Count(); + } } diff --git a/BadMC_Launcher/Extensions/JavaEntryExtension.cs b/BadMC_Launcher/Extensions/JavaEntryExtension.cs index f71d21b..252a3be 100644 --- a/BadMC_Launcher/Extensions/JavaEntryExtension.cs +++ b/BadMC_Launcher/Extensions/JavaEntryExtension.cs @@ -9,12 +9,12 @@ namespace BadMC_Launcher.Extensions; public static class JavaEntryExtension { - public static BitmapImage GetJavaIcon(this JavaEntry javaEntry) { + public static string GetJavaIconPath(this JavaEntry javaEntry) { var ImagePath = $"ms-appx:///Assets/Icons/JavaIcons/{javaEntry.JavaType.ToLower()}.png"; if (File.Exists(ImagePath)) { - return new BitmapImage(new Uri(ImagePath)); + return ImagePath; } - return new BitmapImage(new Uri("ms-appx:///Assets/Icons/JavaIcons/openjdk.png")); + return "ms-appx:///Assets/Icons/JavaIcons/openjdk.png"; } } diff --git a/BadMC_Launcher/Models/Datas/SettingsDatas/MinecraftConfig.cs b/BadMC_Launcher/Models/Datas/SettingsDatas/MinecraftConfig.cs index 7750fcc..b3221f7 100644 --- a/BadMC_Launcher/Models/Datas/SettingsDatas/MinecraftConfig.cs +++ b/BadMC_Launcher/Models/Datas/SettingsDatas/MinecraftConfig.cs @@ -25,6 +25,8 @@ internal static class MinecraftConfig { internal static Account? activeMinecraftAccount; + internal static bool isAutoJavaEnabled = false; + internal static bool isFullscreen = false; internal static bool isEnableIndependencyCore = false; diff --git a/BadMC_Launcher/Models/Datas/SettingsDatas/SingleMinecraftConfig.cs b/BadMC_Launcher/Models/Datas/SettingsDatas/SingleMinecraftConfig.cs index 65e46c4..a9b9bdd 100644 --- a/BadMC_Launcher/Models/Datas/SettingsDatas/SingleMinecraftConfig.cs +++ b/BadMC_Launcher/Models/Datas/SettingsDatas/SingleMinecraftConfig.cs @@ -11,6 +11,8 @@ namespace BadMC_Launcher.Models.Datas.SettingsDatas; internal class SingleMinecraftConfig { internal string? targetMinecraftEntryPath; + internal bool isAutoJavaEnabled = false; + internal bool? isFullscreen; internal bool? isEnableIndependencyCore; diff --git a/BadMC_Launcher/Models/Datas/SettingsDatas/ThemeSetting.cs b/BadMC_Launcher/Models/Datas/SettingsDatas/ThemeSetting.cs index 2acdbc5..2d0b427 100644 --- a/BadMC_Launcher/Models/Datas/SettingsDatas/ThemeSetting.cs +++ b/BadMC_Launcher/Models/Datas/SettingsDatas/ThemeSetting.cs @@ -7,7 +7,7 @@ namespace BadMC_Launcher.Models.Datas.SettingsDatas; internal static class ThemeSetting { - internal static BackgroundTypeEnum backgroundType = BackgroundTypeEnum.BingWallpaper; + internal static BackgroundTypeEnum backgroundType = BackgroundTypeEnum.StaticImage; internal static ThemeTypeEnum themeType = ThemeTypeEnum.Light; diff --git a/BadMC_Launcher/Models/Enums/MessengerTokenEnum.cs b/BadMC_Launcher/Models/Enums/MessengerTokenEnum.cs index 042a072..c0818c4 100644 --- a/BadMC_Launcher/Models/Enums/MessengerTokenEnum.cs +++ b/BadMC_Launcher/Models/Enums/MessengerTokenEnum.cs @@ -8,11 +8,10 @@ namespace BadMC_Launcher.Models.Enums; public enum MainPageMessengerTokenEnum { //Func Token PageNavigateToken, - FlyoutPageNavigateToken, + PageCloseToken, + PageGoBackToken, //GetValue Token - MainSideBarFlyoutFrameToken, - MainSideBarFrameToken, XamlRootToken } diff --git a/BadMC_Launcher/Services/FileService.cs b/BadMC_Launcher/Services/FileService.cs index 462f343..60dd64a 100644 --- a/BadMC_Launcher/Services/FileService.cs +++ b/BadMC_Launcher/Services/FileService.cs @@ -35,21 +35,8 @@ public bool CheckFolderAndFile(string path, bool isCheckFile) { } } catch (Exception ex) { - switch (ex) { - case SecurityException: - //TODO - break; - case UnauthorizedAccessException: - //TODO - break; - case PathTooLongException: - //TODO - break; - case IOException: - //TODO - break; - default: - throw; + if (!ShowErrorToast(ex)) { + throw; } } } @@ -67,28 +54,19 @@ public bool ReadConfig(string filePath, JsonTypeInfo jsonTypeInfo, out T? } catch (Exception ex) { switch (ex) { - case SecurityException: - //TODO - break; - case UnauthorizedAccessException: - //TODO - break; - case PathTooLongException: - //TODO - break; - case IOException: - //TODO - break; case JsonException: if (updateMapping != null && TryReadConfigWithMappings(filePath, jsonTypeInfo, updateMapping)) { ReadConfig(filePath, jsonTypeInfo, out _, updateMapping); } else { - //TODO + //TODO: Dialog } break; default: - throw; + if (!ShowErrorToast(ex)) { + throw; + } + break; } } } @@ -110,24 +88,8 @@ public bool ReadConfigToJsonElement(string filePath, out JsonElement? returnValu } catch (Exception ex) { - switch (ex) { - case SecurityException: - //TODO - break; - case UnauthorizedAccessException: - //TODO - break; - case PathTooLongException: - //TODO - break; - case IOException: - //TODO - break; - case JsonException: - //TODO - break; - default: - throw; + if(!ShowErrorToast(ex)) { + throw; } } } @@ -143,24 +105,8 @@ public bool WriteConfig(string filePath, JsonTypeInfo jsonTypeInfo, T valu return true; } catch (Exception ex) { - switch (ex) { - case SecurityException: - //TODO - break; - case UnauthorizedAccessException: - //TODO - break; - case PathTooLongException: - //TODO - break; - case IOException: - //TODO - break; - case JsonException: - //TODO - break; - default: - throw; + if (!ShowErrorToast(ex)) { + throw; } } } @@ -189,24 +135,8 @@ public bool TryReadConfigWithMappings(string filePath, JsonTypeInfo jsonTy } } catch(Exception ex) { - switch (ex) { - case SecurityException: - //TODO - break; - case UnauthorizedAccessException: - //TODO - break; - case PathTooLongException: - //TODO - break; - case IOException: - //TODO - break; - case JsonException: - //TODO - break; - default: - throw; + if (!ShowErrorToast(ex)) { + throw; } } return false; @@ -236,23 +166,31 @@ public bool TryOpenFolderFromPath(string path) { return false; } - //TODO: TEST private bool ProcessJsonNode(JsonNode node, Dictionary updateMapping) { - bool modified = false; + var DeleteItems = new Dictionary(); + bool isModified = false; switch (node) { case JsonObject obj: // Loop to find nested objects foreach (var prop in obj.ToList()) { if (prop.Value != null && ProcessJsonNode(prop.Value, updateMapping)) { - modified = true; + isModified = true; } // Modify the key name to correspond to the mapping if (prop.Value != null && updateMapping.TryGetValue(prop.Key, out var newKey)) { - obj.Add(newKey, prop.Value.DeepClone()); - obj.Remove(prop.Key); - modified = true; + if (newKey == "_Delete") { + DeleteItems.Add(prop.Key, prop.Value.ToJsonString(new() { + WriteIndented = true, + Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping + })); + } + else { + obj.Add(newKey, prop.Value.DeepClone()); + obj.Remove(prop.Key); + isModified = true; + } } } break; @@ -260,12 +198,37 @@ private bool ProcessJsonNode(JsonNode node, Dictionary updateMap // 处理数组元素 for (int i = 0; i < arr.Count; i++) { if (arr[i] is JsonNode element && ProcessJsonNode(element, updateMapping)) { - arr[i] = element.DeepClone(); // 更新修改后的元素 - modified = true; + // Update Modified + arr[i] = element.DeepClone(); + isModified = true; } } break; } - return modified; + + // Toast Tip + if (DeleteItems.Any()) { + // TODO: Toast + } + return isModified; + } + private bool ShowErrorToast(Exception ex) { + switch (ex) { + case SecurityException: + //TODO + break; + case UnauthorizedAccessException: + //TODO + break; + case PathTooLongException: + //TODO + break; + case IOException: + //TODO + break; + default: + return false; + } + return true; } } diff --git a/BadMC_Launcher/Services/Settings/MinecraftConfigService.cs b/BadMC_Launcher/Services/Settings/MinecraftConfigService.cs index 6d63b56..6ce04cd 100644 --- a/BadMC_Launcher/Services/Settings/MinecraftConfigService.cs +++ b/BadMC_Launcher/Services/Settings/MinecraftConfigService.cs @@ -1,12 +1,15 @@ -using MinecraftLaunch.Base.Models.Authentication; -using MinecraftLaunch.Base.Models.Game; -using System.Text.Json.Serialization; using System.ComponentModel; -using BadMC_Launcher.Models.Datas.SettingsDatas; -using BadMC_Launcher.Models.Datas; -using BadMC_Launcher.Models.Datas.Mappings; +using System.Linq; +using System.Text.Json.Serialization; using BadMC_Launcher.Classes; using BadMC_Launcher.Controls.Minecraft; +using BadMC_Launcher.Models.Datas; +using BadMC_Launcher.Models.Datas.Mappings; +using BadMC_Launcher.Models.Datas.SettingsDatas; +using MinecraftLaunch.Base.Models.Authentication; +using MinecraftLaunch.Base.Models.Game; +using Uno.Extensions; +using Uno.Extensions.Specialized; namespace BadMC_Launcher.Services.Settings; public class MinecraftConfigService : ConfigClass { @@ -31,7 +34,17 @@ public DistinctiveItemBindingList MinecraftAccounts { } } public DistinctiveItemBindingList JavaPaths { - get => MinecraftConfig.javaPaths; + get { + // Check if the Java folder exists + foreach (var item in MinecraftConfig.javaPaths.ToList()) { + if (!Path.Exists(item)) { + MinecraftConfig.javaPaths.Remove(item); + // TODO: Tip Toast + } + } + + return MinecraftConfig.javaPaths; + } set { MinecraftConfig.javaPaths.Clear(); MinecraftConfig.javaPaths.MargeItems(value); @@ -41,7 +54,17 @@ public DistinctiveItemBindingList JavaPaths { } } public DistinctiveItemBindingList MinecraftFolders { - get => MinecraftConfig.minecraftFolders; + get { + // Check if the Minecraft folder exists + foreach (var item in MinecraftConfig.minecraftFolders.ToList()) { + if (!Path.Exists(item.MinecraftFolderPath)) { + MinecraftConfig.minecraftFolders.Remove(item); + // TODO: Tip Toast + } + } + + return MinecraftConfig.minecraftFolders; + } set { MinecraftConfig.minecraftFolders.Clear(); MinecraftConfig.minecraftFolders.MargeItems(value); @@ -54,7 +77,14 @@ public DistinctiveItemBindingList MinecraftFolders { public string? ActiveJavaPath { get => MinecraftConfig.activeJavaPath; set { - MinecraftConfig.activeJavaPath = value; + // CHeck folder is exists + if (!Path.Exists(value)) { + MinecraftConfig.activeJavaPath = string.Empty; + // TODO: Tip Toast + } + else { + MinecraftConfig.activeJavaPath = value; + } // Trigger Event OnPropertyChanged(nameof(ActiveJavaPath)); @@ -67,7 +97,14 @@ public string? ActiveJavaPath { public string? ActiveMinecraftFolderPath { get => MinecraftConfig.activeMinecraftFolder; set { - MinecraftConfig.activeMinecraftFolder = value; + // CHeck folder is exists + if (!Path.Exists(value)) { + MinecraftConfig.activeMinecraftFolder = string.Empty; + // TODO: Tip Toast + } + else { + MinecraftConfig.activeMinecraftFolder = value; + } // Trigger Event OnPropertyChanged(nameof(ActiveMinecraftFolderPath)); @@ -90,6 +127,19 @@ public Account? ActiveMinecraftAccount { } } + public bool IsAutoJavaEnabled { + get => MinecraftConfig.isAutoJavaEnabled; + set { + MinecraftConfig.isAutoJavaEnabled = value; + + // Trigger Event + OnPropertyChanged(nameof(IsAutoJavaEnabled)); + + //Write to Json + SyncSettingSet(); + } + } + public bool IsFullscreen { get => MinecraftConfig.isFullscreen; set { @@ -221,6 +271,7 @@ public override bool SyncSettingGet() { MinecraftConfig.activeJavaPath = jsonClass.ActiveJavaPath; MinecraftConfig.activeMinecraftFolder = jsonClass.ActiveMinecraftFolderPath; MinecraftConfig.activeMinecraftAccount = jsonClass.ActiveMinecraftAccount; + MinecraftConfig.isAutoJavaEnabled = jsonClass.IsAutoJavaEnabled; MinecraftConfig.isFullscreen = jsonClass.IsFullscreen; MinecraftConfig.isEnableIndependencyCore = jsonClass.IsEnableIndependencyCore; MinecraftConfig.isAutoMemorySize = jsonClass.IsAutoMemorySize; @@ -228,6 +279,7 @@ public override bool SyncSettingGet() { MinecraftConfig.maxMemorySize = jsonClass.MaxMemorySize; MinecraftConfig.launcherName = jsonClass.LauncherName; MinecraftConfig.jvmArguments = jsonClass.JvmArguments; + return true; } return false; diff --git a/BadMC_Launcher/Services/Settings/SingleMinecraftConfigService.cs b/BadMC_Launcher/Services/Settings/SingleMinecraftConfigService.cs index ab049cf..f156312 100644 --- a/BadMC_Launcher/Services/Settings/SingleMinecraftConfigService.cs +++ b/BadMC_Launcher/Services/Settings/SingleMinecraftConfigService.cs @@ -32,6 +32,19 @@ public string? TargetMinecraftEntryPath { } } + public bool IsAutoJavaEnabled { + get => singleMinecraftConfigInstance.isAutoJavaEnabled; + set { + singleMinecraftConfigInstance.isAutoJavaEnabled = value; + + // Trigger Event + OnPropertyChanged(nameof(IsAutoJavaEnabled)); + + //Write to Json + SyncSettingSet(); + } + } + public bool? IsFullscreen { get => singleMinecraftConfigInstance.isFullscreen; set { @@ -148,7 +161,7 @@ private void OnListChanged(object? sender, ListChangedEventArgs e) { public override bool SyncSettingGet() { if (TargetMinecraftEntryPath != null) { if (File.Exists(Path.Combine(TargetMinecraftEntryPath, @"BadBCConfigs\MinecraftConfig.json"))) { - if(App.GetService().ReadConfig(Path.Combine(TargetMinecraftEntryPath, @"BadBCConfigs\MinecraftConfig.json"), SingleMinecraftConfigServiceContext.Default.SingleMinecraftConfigService, out var jsonClass) && jsonClass != null) { + if(App.GetService().ReadConfig(Path.Combine(TargetMinecraftEntryPath, @"BadBCConfigs\MinecraftConfig.json"), SingleMinecraftConfigServiceContext.Default.SingleMinecraftConfigService, out var jsonClass) && jsonClass != null) { singleMinecraftConfigInstance.isFullscreen = jsonClass.IsFullscreen; singleMinecraftConfigInstance.isEnableIndependencyCore = jsonClass.IsEnableIndependencyCore; singleMinecraftConfigInstance.isAutoMemorySize = jsonClass.IsAutoMemorySize; @@ -167,7 +180,7 @@ public override bool SyncSettingGet() { public override bool SyncSettingSet() { if (TargetMinecraftEntryPath != null) { - return App.GetService().WriteConfig(Path.Combine(TargetMinecraftEntryPath, @"BadBCConfigs\MinecraftConfig.json"), SingleMinecraftConfigServiceContext.Default.SingleMinecraftConfigService, this); + return App.GetService().WriteConfig(Path.Combine(TargetMinecraftEntryPath, @"BadBCConfigs\MinecraftConfig.json"), SingleMinecraftConfigServiceContext.Default.SingleMinecraftConfigService, this); } //TODO: Toast return false; diff --git a/BadMC_Launcher/Services/ViewServices/MainSideBarService.cs b/BadMC_Launcher/Services/ViewServices/MainSideBarService.cs index a9387ae..cdb5d97 100644 --- a/BadMC_Launcher/Services/ViewServices/MainSideBarService.cs +++ b/BadMC_Launcher/Services/ViewServices/MainSideBarService.cs @@ -18,7 +18,7 @@ namespace BadMC_Launcher.Services.ViewServices; public class MainSideBarService { public void NavigateToPage() where T : Page { - WeakReferenceMessenger.Default.Send(new ValueChangedMessage(typeof(T)), MainPageMessengerTokenEnum.MainSideBarFrameToken.ToString()); + WeakReferenceMessenger.Default.Send(new ValueChangedMessage(typeof(T)), MainPageMessengerTokenEnum.PageNavigateToken.ToString()); } public void Register(MainSideBarItem mainSideBarItem, bool isFooter = false) { diff --git a/BadMC_Launcher/Strings/zh-Hans/Resources.resw b/BadMC_Launcher/Strings/zh-Hans/Resources.resw index c7bf8c1..f122d93 100644 --- a/BadMC_Launcher/Strings/zh-Hans/Resources.resw +++ b/BadMC_Launcher/Strings/zh-Hans/Resources.resw @@ -286,4 +286,7 @@ 正在获取 Java 运行时...... + + 自动设置 Java + \ No newline at end of file diff --git a/BadMC_Launcher/ViewModels/ContentDialogs/Settings/JavaContentDialogViewModel.cs b/BadMC_Launcher/ViewModels/ContentDialogs/Settings/JavaContentDialogViewModel.cs index c9fbeed..5f788ed 100644 --- a/BadMC_Launcher/ViewModels/ContentDialogs/Settings/JavaContentDialogViewModel.cs +++ b/BadMC_Launcher/ViewModels/ContentDialogs/Settings/JavaContentDialogViewModel.cs @@ -29,6 +29,8 @@ public JavaContentDialogViewModel() { minecraftConfigService.PropertyChanged += JavaList_PropertyChanged; + IsAutoJavaEnabled = minecraftConfigService.IsAutoJavaEnabled; + // Initialize List JavasList = new(); SetJavaList(); @@ -40,6 +42,9 @@ public JavaContentDialogViewModel() { [ObservableProperty] public partial bool IsJavasListLoading { get; set; } + [ObservableProperty] + public partial bool IsAutoJavaEnabled { get; set; } + [ObservableProperty] public partial ObservableDataList JavasList { get; set; } @@ -108,12 +113,17 @@ private void SetActiveJava() { var selectedItem = JavasList.ElementAtOrDefault(JavasListSelectedIndex); // Set active Java path - minecraftConfigService.ActiveJavaPath = minecraftConfigService.JavaPaths.FirstOrDefault(selectedItem?.JavaPath); + minecraftConfigService.ActiveJavaPath = minecraftConfigService.JavaPaths.FirstOrDefault(item => item == selectedItem?.JavaPath); + } + + [RelayCommand] + private void ChangeIsAutoJavaEnabled() { + minecraftConfigService.IsAutoJavaEnabled = IsAutoJavaEnabled; } [RelayCommand] private void DeleteJava(string parameter) { - // TODO: Search Java + // TODO: Delete Java } [RelayCommand] @@ -128,7 +138,7 @@ partial void OnJavasListChanged(ObservableDataList value) { private async void SetJavaList() { IsJavasListLoading = true; - var javaList = await Task.Run(async () => { + var javaEntries = await Task.Run(async () => { // Get Java paths var tasks = minecraftConfigService.JavaPaths .Select(async item => await JavaUtil.GetJavaInfoAsync(item)).ToList(); @@ -137,8 +147,10 @@ private async void SetJavaList() { return await Task.WhenAll(tasks); }); - // Add to list - JavasList.AddRange(javaList.Select(info => new JavaViewItem(info)).ToList()); + foreach (var item in javaEntries) { + JavasList.Add(new JavaViewItem(item)); + } + IsJavasListEmpty = !JavasList.Any(); // Find selected Java @@ -155,6 +167,7 @@ private void JavaList_PropertyChanged(object? sender, PropertyChangedEventArgs e break; case nameof(MinecraftConfigService.ActiveJavaPath): // Update selected index + // TODO: Debug JavasListSelectedIndex = JavasList.GetIndex(item => item.JavaPath == minecraftConfigService.ActiveJavaPath); break; } diff --git a/BadMC_Launcher/ViewModels/Pages/MainPageViewModel.cs b/BadMC_Launcher/ViewModels/Pages/MainPageViewModel.cs index 91f8e0b..bba4611 100644 --- a/BadMC_Launcher/ViewModels/Pages/MainPageViewModel.cs +++ b/BadMC_Launcher/ViewModels/Pages/MainPageViewModel.cs @@ -1,5 +1,6 @@ using System.Collections.ObjectModel; using System.ComponentModel; +using System.Reflection.Metadata; using BadMC_Launcher.Classes; using BadMC_Launcher.Controls; using BadMC_Launcher.Controls.MainSearch; @@ -11,6 +12,8 @@ using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Messaging; using CommunityToolkit.Mvvm.Messaging.Messages; +using CommunityToolkit.WinUI.Controls; +using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Controls.Primitives; using Microsoft.UI.Xaml.Media.Animation; using Uno.UI.RemoteControl; @@ -23,7 +26,7 @@ public MainPageViewModel() { //Init Property WindowName = App.GetService().WindowName; - MainSideBarToolVisibility = Visibility.Collapsed; + IsMainSideBarToolShow = false; MainSideBarItems = MainSideBarData.MainSideBarItems; MainSideBarFooterItems = MainSideBarData.MainSideBarFooterItems; @@ -37,10 +40,6 @@ public MainPageViewModel() { }); } - [ObservableProperty] - [NotifyCanExecuteChangedFor(nameof(PageGoBackCommand))] - public partial bool MainSideBarFrameCanGoBack { get; set; } - [ObservableProperty] public partial string WindowName { get; set; } @@ -58,7 +57,7 @@ public MainPageViewModel() { public partial MainSideBarItem? MainSideBarSelectedItem { get; set; } [ObservableProperty] - public partial Visibility MainSideBarToolVisibility { get; set; } + public partial bool IsMainSideBarToolShow { get; set; } [ObservableProperty] public partial DistinctiveItemBindingList SearchFilterItems { get; set; } @@ -73,43 +72,48 @@ public MainPageViewModel() { public partial string SearchText { get; set; } [RelayCommand] - private void ChangeToolVisibilityAndSelectedItem(Frame parameter) { - if (parameter.Content == null) { - MainSideBarToolVisibility = Visibility.Collapsed; + private void ChangeToolVisibilityAndSelectedItem(object? parameter) { + if (parameter == null) { + IsMainSideBarToolShow = false; } else { - MainSideBarToolVisibility = Visibility.Visible; + IsMainSideBarToolShow = true; } - // Set CanGoBack - MainSideBarFrameCanGoBack = parameter.CanGoBack; - var list = new List(); list.AddRange(MainSideBarItems); list.AddRange(MainSideBarFooterItems); // Set SelectedItem - MainSideBarSelectedItem = list.FirstOrDefault(item => item.NavigatePage == parameter.Content?.GetType()); + MainSideBarSelectedItem = list.FirstOrDefault(item => item.NavigatePage == parameter?.GetType()); } [RelayCommand] - private void NavigateToPage(NavigationViewSelectionChangedEventArgs args) { - if (args.SelectedItem != null && args.SelectedItem != MainSideBarSelectedItem) { - SendInvokeFuncMessage(((MainSideBarItem)args.SelectedItem).NavigatePage, MainPageMessengerTokenEnum.PageNavigateToken); + private void NavigateToPage(NavigationViewItemInvokedEventArgs args) { + if (args.InvokedItem != null) { + var list = new List(); + list.AddRange(MainSideBarItems); + list.AddRange(MainSideBarFooterItems); + + // Set SelectedItem + var navigateItem = list.FirstOrDefault(item => item.ItemName == args.InvokedItem.ToString()); + + if (navigateItem != null && navigateItem != MainSideBarSelectedItem) { + SendInvokeFuncMessage(navigateItem.NavigatePage, MainPageMessengerTokenEnum.PageNavigateToken); + return; + } } + SendInvokeFuncMessage(null, MainPageMessengerTokenEnum.PageCloseToken); } - [RelayCommand(CanExecute = nameof(MainSideBarFrameCanGoBack))] - private void PageGoBack(Frame parameter) { - if (parameter.CanGoBack) { - parameter.GoBack(); - } + [RelayCommand] + private void PageGoBack() { + SendInvokeFuncMessage(null, MainPageMessengerTokenEnum.PageGoBackToken); } [RelayCommand] - private void ClosePage(Frame parameter) { - parameter.Content = null; - MainSideBarToolVisibility = Visibility.Collapsed; + private void ClosePage() { + SendInvokeFuncMessage(null, MainPageMessengerTokenEnum.PageCloseToken); } [RelayCommand] @@ -143,13 +147,23 @@ private void OpenSearchFilter(AutoSuggestBox parameter) { } [RelayCommand] - private void ChangeSearchFilter(IMainMenuSharchFilterItem[] parameter) { + private void ChangeSearchFilter(Segmented parameter) { + var items = new List(); + foreach (var selectedItem in parameter.SelectedItems) { + if (selectedItem is IMainMenuSharchFilterItem item) { + items.Add(item); + } + } SearchFilterSelectedItems.Clear(); - SearchFilterSelectedItems.AddRange(parameter.ToObservableCollection()); + SearchFilterSelectedItems.AddRange(items.ToObservableCollection()); } private void SendInvokeFuncMessage(T value, Enum tokenEnum) { WeakReferenceMessenger.Default.Send(new ValueChangedMessage(value), tokenEnum.ToString()); } + + partial void OnIsMainSideBarToolShowChanged(bool value) { + + } } diff --git a/BadMC_Launcher/Views/ContentDialogs/Settings/JavaContentDialog.xaml b/BadMC_Launcher/Views/ContentDialogs/Settings/JavaContentDialog.xaml index 3a365ab..447aff9 100644 --- a/BadMC_Launcher/Views/ContentDialogs/Settings/JavaContentDialog.xaml +++ b/BadMC_Launcher/Views/ContentDialogs/Settings/JavaContentDialog.xaml @@ -8,7 +8,7 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:userControls="using:BadMC_Launcher.Views.UserControls" x:Uid="JavaContentDialog_ViewContentDialog" - PrimaryButtonStyle="{StaticResource AccentButtonStyle}" + CloseButtonStyle="{StaticResource AccentButtonStyle}" Style="{ThemeResource DefaultContentDialogStyle}"> + + + + + + + + diff --git a/BadMC_Launcher/Views/ContentDialogs/Settings/MinecraftFolderContentDialog.xaml b/BadMC_Launcher/Views/ContentDialogs/Settings/MinecraftFolderContentDialog.xaml index 70c093e..d98f074 100644 --- a/BadMC_Launcher/Views/ContentDialogs/Settings/MinecraftFolderContentDialog.xaml +++ b/BadMC_Launcher/Views/ContentDialogs/Settings/MinecraftFolderContentDialog.xaml @@ -6,9 +6,7 @@ xmlns:local="using:BadMC_Launcher.Views.ContentDialogs.Settings" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" x:Uid="MinecraftFolderContentDialog_ViewContentDialog" - MaxWidth="900" - MaxHeight="550" - PrimaryButtonStyle="{StaticResource AccentButtonStyle}" + CloseButtonStyle="{StaticResource AccentButtonStyle}" Style="{ThemeResource DefaultContentDialogStyle}"> - + diff --git a/BadMC_Launcher/Views/Pages/MainPage.xaml b/BadMC_Launcher/Views/Pages/MainPage.xaml index 129404e..24873cf 100644 --- a/BadMC_Launcher/Views/Pages/MainPage.xaml +++ b/BadMC_Launcher/Views/Pages/MainPage.xaml @@ -19,6 +19,7 @@ + @@ -89,7 +90,7 @@ x:Uid="MainPage_MainSideBarNavigationView" Margin="-1" FooterMenuItemsSource="{Binding MainSideBarFooterItems}" - IsBackButtonVisible="Collapsed" + IsBackEnabled="{x:Bind MainFrame.CanGoBack}" IsSettingsVisible="False" MenuItemsSource="{Binding MainSideBarItems}" PaneDisplayMode="LeftCompact" @@ -145,10 +146,10 @@ - + Style="{ThemeResource ButtonSegmentedStyle}"> - + @@ -185,10 +186,17 @@ + - + + + + + + + @@ -243,10 +251,10 @@ - + - - - + - + - - - - - - - - - - - - - - - - - + + diff --git a/BadMC_Launcher/Views/Pages/MainPage.xaml.cs b/BadMC_Launcher/Views/Pages/MainPage.xaml.cs index 72782c5..d4ec744 100644 --- a/BadMC_Launcher/Views/Pages/MainPage.xaml.cs +++ b/BadMC_Launcher/Views/Pages/MainPage.xaml.cs @@ -1,3 +1,4 @@ +using System.Reflection.Metadata; using BadMC_Launcher.Models.Enums; using BadMC_Launcher.Services.Settings; using BadMC_Launcher.ViewModels.Pages; @@ -15,19 +16,33 @@ public MainPage() { //Register NavigationToPage Messengers WeakReferenceMessenger.Default.Register, string>(this, MainPageMessengerTokenEnum.PageNavigateToken.ToString(), MainFrameNavigate); + WeakReferenceMessenger.Default.Register, string>(this, MainPageMessengerTokenEnum.PageCloseToken.ToString(), MainFrameClose); + WeakReferenceMessenger.Default.Register, string>(this, MainPageMessengerTokenEnum.PageGoBackToken.ToString(), MainFrameGoBack); //Register GetXamlRoot Messengers WeakReferenceMessenger.Default.Register, string>(this, MainPageMessengerTokenEnum.XamlRootToken.ToString(), (r, m) => m.Reply(this.XamlRoot)); } - public void MainFrameNavigate(object recipient, ValueChangedMessage message) { + private void MainFrameNavigate(object recipient, ValueChangedMessage message) { //MainSideBarFlyout.Hide(); - if (MainSideBarFrame.Content != null && MainSideBarFrame.Content.GetType() == message.Value) { + if (MainFrame.Content != null && MainFrame.Content.GetType() == message.Value) { return; } if (typeof(Page).IsAssignableFrom(message.Value)) { - MainSideBarFrame.Navigate(message.Value, null, new EntranceNavigationTransitionInfo()); + MainFrame.Navigate(message.Value, null, new EntranceNavigationTransitionInfo()); + } + } + + private void MainFrameClose(object recipient, ValueChangedMessage _) { + MainFrame.Content = null; + MainFrame.BackStack.Clear(); + ClosePageButton.Visibility = Visibility.Collapsed; + } + + private void MainFrameGoBack(object recipient, ValueChangedMessage _) { + if (MainFrame.CanGoBack) { + MainFrame.GoBack(); } } } diff --git a/global.json b/global.json index 2f88fa9..9fa54cf 100644 --- a/global.json +++ b/global.json @@ -3,7 +3,8 @@ "msbuild-sdks": { "Uno.Sdk": "5.6.20" }, - "sdk":{ - "allowPrerelease": "true" + "sdk": { + "allowPrerelease": "true", + "version": "9.0.203" } } From f09a41a79fb48d1d21d4fb557cf61ecb3906a21a Mon Sep 17 00:00:00 2001 From: Starcloudsea <84891987+Starcloudsea@users.noreply.github.com> Date: Tue, 22 Apr 2025 16:17:35 +0800 Subject: [PATCH 12/40] qwq --- BadMC_Launcher/Controls/Minecraft/JavaViewItem.cs | 8 ++++++-- BadMC_Launcher/Extensions/JavaEntryExtension.cs | 5 +++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/BadMC_Launcher/Controls/Minecraft/JavaViewItem.cs b/BadMC_Launcher/Controls/Minecraft/JavaViewItem.cs index d9597c0..ef2a86c 100644 --- a/BadMC_Launcher/Controls/Minecraft/JavaViewItem.cs +++ b/BadMC_Launcher/Controls/Minecraft/JavaViewItem.cs @@ -19,7 +19,7 @@ public JavaViewItem(JavaEntry javaEntry) { JavaPath = Entry.JavaPath; - JavaIconPath = Entry.GetJavaIconPath(); + SetIconPath(); } public JavaEntry Entry { get; init; } @@ -30,7 +30,11 @@ public JavaViewItem(JavaEntry javaEntry) { public string JavaPath { get; init; } - public string JavaIconPath { get; init; } + public string? JavaIconPath { get; private set; } + + private async void SetIconPath() { + JavaIconPath = await Entry.GetJavaIconPathAsync(); + } public static bool operator ==(JavaViewItem? left, JavaViewItem? right) { return left is not null && right is not null ? diff --git a/BadMC_Launcher/Extensions/JavaEntryExtension.cs b/BadMC_Launcher/Extensions/JavaEntryExtension.cs index 252a3be..d40c292 100644 --- a/BadMC_Launcher/Extensions/JavaEntryExtension.cs +++ b/BadMC_Launcher/Extensions/JavaEntryExtension.cs @@ -6,13 +6,14 @@ using BadMC_Launcher.Controls.Minecraft; using Microsoft.UI.Xaml.Media.Imaging; using MinecraftLaunch.Base.Models.Game; +using Uno.Disposables; namespace BadMC_Launcher.Extensions; public static class JavaEntryExtension { - public static string GetJavaIconPath(this JavaEntry javaEntry) { + public async static Task GetJavaIconPathAsync(this JavaEntry javaEntry) { var ImagePath = $"ms-appx:///Assets/Icons/JavaIcons/{javaEntry.JavaType.ToLower()}.png"; - if (File.Exists(ImagePath)) { + if (await StorageFile.GetFileFromApplicationUriAsync(new Uri(ImagePath)) != null) { return ImagePath; } return "ms-appx:///Assets/Icons/JavaIcons/openjdk.png"; From f543bc6abf3685401e95ab0116ba5c3caa1022a6 Mon Sep 17 00:00:00 2001 From: Starcloudsea <84891987+Starcloudsea@users.noreply.github.com> Date: Wed, 23 Apr 2025 23:23:01 +0800 Subject: [PATCH 13/40] =?UTF-8?q?=E4=BD=A0=E6=8A=B9=E7=9A=84Bug=E7=BB=88?= =?UTF-8?q?=E4=BA=8E=E4=BF=AE=E5=AE=8C=E4=BA=86=E5=95=8A=E5=95=8A=E5=95=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Classes/Comparers/JavaPathListComparer.cs | 21 +++++++++++++++ .../Controls/Minecraft/JavaViewItem.cs | 21 ++++++++++----- .../Extensions/DistinctiveItemBindingList.cs | 20 ++++++++++++-- .../Datas/SettingsDatas/MinecraftConfig.cs | 3 ++- .../Settings/MinecraftConfigService.cs | 7 ++--- .../Settings/SingleMinecraftConfigService.cs | 26 +++++++++---------- .../Services/Settings/ThemeSettingService.cs | 4 --- BadMC_Launcher/Strings/en-US/Resources.resw | 6 +++++ BadMC_Launcher/Strings/zh-Hans/Resources.resw | 3 +++ .../Settings/JavaContentDialogViewModel.cs | 12 ++++++++- .../Settings/LaunchSettingsPageViewModel.cs | 6 ++++- .../UserControls/LoadingAnimation.xaml.cs | 1 + 12 files changed, 95 insertions(+), 35 deletions(-) create mode 100644 BadMC_Launcher/Classes/Comparers/JavaPathListComparer.cs diff --git a/BadMC_Launcher/Classes/Comparers/JavaPathListComparer.cs b/BadMC_Launcher/Classes/Comparers/JavaPathListComparer.cs new file mode 100644 index 0000000..3f586ce --- /dev/null +++ b/BadMC_Launcher/Classes/Comparers/JavaPathListComparer.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BadMC_Launcher.Classes.Comparers; +public class JavaPathListComparer : IEqualityComparer { + public bool Equals(string? left, string? right) { + var leftDirectoryPath = Path.GetDirectoryName(left); + var rightDirectoryPath = Path.GetDirectoryName(right); + + return left is not null && right is not null + ? leftDirectoryPath == rightDirectoryPath + : ReferenceEquals(left, right); + } + + public int GetHashCode(string obj) { + return obj.ToLower().GetHashCode(); + } +} diff --git a/BadMC_Launcher/Controls/Minecraft/JavaViewItem.cs b/BadMC_Launcher/Controls/Minecraft/JavaViewItem.cs index ef2a86c..147b268 100644 --- a/BadMC_Launcher/Controls/Minecraft/JavaViewItem.cs +++ b/BadMC_Launcher/Controls/Minecraft/JavaViewItem.cs @@ -8,7 +8,7 @@ using MinecraftLaunch.Base.Models.Game; namespace BadMC_Launcher.Controls.Minecraft; -public partial class JavaViewItem { +public partial class JavaViewItem : ObservableObject { public JavaViewItem(JavaEntry javaEntry) { Entry = javaEntry; @@ -30,22 +30,29 @@ public JavaViewItem(JavaEntry javaEntry) { public string JavaPath { get; init; } - public string? JavaIconPath { get; private set; } + [ObservableProperty] + public partial string? JavaIconPath { get; private set; } private async void SetIconPath() { JavaIconPath = await Entry.GetJavaIconPathAsync(); } public static bool operator ==(JavaViewItem? left, JavaViewItem? right) { - return left is not null && right is not null ? - left.JavaPath == right.JavaPath : - ReferenceEquals(left, right); + var leftDirectoryPath = Path.GetDirectoryName(left?.JavaPath); + var rightDirectoryPath = Path.GetDirectoryName(right?.JavaPath); + + return left is not null && right is not null + ? leftDirectoryPath == rightDirectoryPath + : ReferenceEquals(left, right); } public static bool operator !=(JavaViewItem? left, JavaViewItem? right) { + var leftDirectoryPath = Path.GetDirectoryName(left?.JavaPath); + var rightDirectoryPath = Path.GetDirectoryName(right?.JavaPath); + return left is not null && right is not null - ? left.JavaPath != right.JavaPath : - !ReferenceEquals(left, right); + ? leftDirectoryPath != right.JavaPath + : !ReferenceEquals(left, right); } public override bool Equals(object? obj) { diff --git a/BadMC_Launcher/Extensions/DistinctiveItemBindingList.cs b/BadMC_Launcher/Extensions/DistinctiveItemBindingList.cs index f55ab39..a2b3257 100644 --- a/BadMC_Launcher/Extensions/DistinctiveItemBindingList.cs +++ b/BadMC_Launcher/Extensions/DistinctiveItemBindingList.cs @@ -12,10 +12,22 @@ namespace BadMC_Launcher.Extensions; public class DistinctiveItemBindingList : BindingList { - public DistinctiveItemBindingList(IList initialData) : base(initialData) { + private readonly IEqualityComparer _comparer; + public DistinctiveItemBindingList(IList initialData, IEqualityComparer? comparer = null) : base(initialData) { + if (comparer == null) { + _comparer = EqualityComparer.Default; + } + else { + _comparer = comparer; + } } - public DistinctiveItemBindingList() { + + public DistinctiveItemBindingList(IEqualityComparer comparer) { + _comparer = comparer ?? throw new ArgumentNullException(nameof(comparer)); + } + + public DistinctiveItemBindingList() : this(EqualityComparer.Default) { } @@ -48,6 +60,10 @@ protected override void OnListChanged(ListChangedEventArgs e) { base.OnListChanged(e); } + + public new bool Contains(T item) { + return this.Any(existingItem => _comparer.Equals(existingItem, item)); + } } [AttributeUsage(AttributeTargets.Property)] diff --git a/BadMC_Launcher/Models/Datas/SettingsDatas/MinecraftConfig.cs b/BadMC_Launcher/Models/Datas/SettingsDatas/MinecraftConfig.cs index b3221f7..71032d8 100644 --- a/BadMC_Launcher/Models/Datas/SettingsDatas/MinecraftConfig.cs +++ b/BadMC_Launcher/Models/Datas/SettingsDatas/MinecraftConfig.cs @@ -10,12 +10,13 @@ using BadMC_Launcher.Controls.Minecraft; using System.ComponentModel; using BadMC_Launcher.Services.Settings; +using BadMC_Launcher.Classes.Comparers; namespace BadMC_Launcher.Models.Datas.SettingsDatas; internal static class MinecraftConfig { internal static DistinctiveItemBindingList minecraftAccounts = new() { PropertyName = nameof(MinecraftConfigService.MinecraftAccounts) }; - internal static DistinctiveItemBindingList javaPaths = new() { PropertyName = nameof(MinecraftConfigService.JavaPaths) }; + internal static DistinctiveItemBindingList javaPaths = new(new JavaPathListComparer()) { PropertyName = nameof(MinecraftConfigService.JavaPaths) }; internal static DistinctiveItemBindingList minecraftFolders = new() { PropertyName = nameof(MinecraftConfigService.MinecraftFolders) }; diff --git a/BadMC_Launcher/Services/Settings/MinecraftConfigService.cs b/BadMC_Launcher/Services/Settings/MinecraftConfigService.cs index 6ce04cd..58d34f3 100644 --- a/BadMC_Launcher/Services/Settings/MinecraftConfigService.cs +++ b/BadMC_Launcher/Services/Settings/MinecraftConfigService.cs @@ -8,6 +8,7 @@ using BadMC_Launcher.Models.Datas.SettingsDatas; using MinecraftLaunch.Base.Models.Authentication; using MinecraftLaunch.Base.Models.Game; +using Newtonsoft.Json.Linq; using Uno.Extensions; using Uno.Extensions.Specialized; @@ -265,12 +266,9 @@ private void OnListChanged(object? sender, ListChangedEventArgs e) { public override bool SyncSettingGet() { if (App.GetService().ReadConfig(Path.Combine(AppDataPath.ConfigsPath, "MinecraftConfigs.json"), MinecraftConfigServiceContext.Default.MinecraftConfigService, out var jsonClass, UpdateMapping.MinecraftConfig) && jsonClass != null) { //TODO: 解蜜 - MinecraftConfig.minecraftAccounts = jsonClass.MinecraftAccounts; - MinecraftConfig.javaPaths = jsonClass.JavaPaths; - MinecraftConfig.minecraftFolders = jsonClass.MinecraftFolders; MinecraftConfig.activeJavaPath = jsonClass.ActiveJavaPath; MinecraftConfig.activeMinecraftFolder = jsonClass.ActiveMinecraftFolderPath; - MinecraftConfig.activeMinecraftAccount = jsonClass.ActiveMinecraftAccount; + //MinecraftConfig.activeMinecraftAccount = jsonClass.ActiveMinecraftAccount; MinecraftConfig.isAutoJavaEnabled = jsonClass.IsAutoJavaEnabled; MinecraftConfig.isFullscreen = jsonClass.IsFullscreen; MinecraftConfig.isEnableIndependencyCore = jsonClass.IsEnableIndependencyCore; @@ -278,7 +276,6 @@ public override bool SyncSettingGet() { MinecraftConfig.minMemorySize = jsonClass.MinMemorySize; MinecraftConfig.maxMemorySize = jsonClass.MaxMemorySize; MinecraftConfig.launcherName = jsonClass.LauncherName; - MinecraftConfig.jvmArguments = jsonClass.JvmArguments; return true; } diff --git a/BadMC_Launcher/Services/Settings/SingleMinecraftConfigService.cs b/BadMC_Launcher/Services/Settings/SingleMinecraftConfigService.cs index f156312..8125a43 100644 --- a/BadMC_Launcher/Services/Settings/SingleMinecraftConfigService.cs +++ b/BadMC_Launcher/Services/Settings/SingleMinecraftConfigService.cs @@ -159,20 +159,18 @@ private void OnListChanged(object? sender, ListChangedEventArgs e) { } public override bool SyncSettingGet() { - if (TargetMinecraftEntryPath != null) { - if (File.Exists(Path.Combine(TargetMinecraftEntryPath, @"BadBCConfigs\MinecraftConfig.json"))) { - if(App.GetService().ReadConfig(Path.Combine(TargetMinecraftEntryPath, @"BadBCConfigs\MinecraftConfig.json"), SingleMinecraftConfigServiceContext.Default.SingleMinecraftConfigService, out var jsonClass) && jsonClass != null) { - singleMinecraftConfigInstance.isFullscreen = jsonClass.IsFullscreen; - singleMinecraftConfigInstance.isEnableIndependencyCore = jsonClass.IsEnableIndependencyCore; - singleMinecraftConfigInstance.isAutoMemorySize = jsonClass.IsAutoMemorySize; - singleMinecraftConfigInstance.minMemorySize = jsonClass.MinMemorySize; - singleMinecraftConfigInstance.maxMemorySize = jsonClass.MaxMemorySize; - singleMinecraftConfigInstance.javaPath = jsonClass.JavaPath; - singleMinecraftConfigInstance.launcherName = jsonClass.LauncherName; - singleMinecraftConfigInstance.jvmArguments = jsonClass.JvmArguments; - return true; - } - } + if(TargetMinecraftEntryPath != null + && File.Exists(Path.Combine(TargetMinecraftEntryPath, @"BadBCConfigs\MinecraftConfig.json")) + && App.GetService().ReadConfig(Path.Combine(TargetMinecraftEntryPath, @"BadBCConfigs\MinecraftConfig.json"), SingleMinecraftConfigServiceContext.Default.SingleMinecraftConfigService, out var jsonClass) && jsonClass != null) { + singleMinecraftConfigInstance.isFullscreen = jsonClass.IsFullscreen; + singleMinecraftConfigInstance.isEnableIndependencyCore = jsonClass.IsEnableIndependencyCore; + singleMinecraftConfigInstance.isAutoMemorySize = jsonClass.IsAutoMemorySize; + singleMinecraftConfigInstance.minMemorySize = jsonClass.MinMemorySize; + singleMinecraftConfigInstance.maxMemorySize = jsonClass.MaxMemorySize; + singleMinecraftConfigInstance.javaPath = jsonClass.JavaPath; + singleMinecraftConfigInstance.launcherName = jsonClass.LauncherName; + singleMinecraftConfigInstance.jvmArguments = jsonClass.JvmArguments; + return true; } //TODO: Toast return false; diff --git a/BadMC_Launcher/Services/Settings/ThemeSettingService.cs b/BadMC_Launcher/Services/Settings/ThemeSettingService.cs index 35fc6d5..891e431 100644 --- a/BadMC_Launcher/Services/Settings/ThemeSettingService.cs +++ b/BadMC_Launcher/Services/Settings/ThemeSettingService.cs @@ -108,10 +108,6 @@ public string WindowName { } } - public ThemeSettingService() { - - } - public async void SetBackground(Action? backgroundChanged = null) { if (backgroundChanged == null) { //TODO: 这应该得从代码介入了,应该得Dialog( diff --git a/BadMC_Launcher/Strings/en-US/Resources.resw b/BadMC_Launcher/Strings/en-US/Resources.resw index d325e76..da8e604 100644 --- a/BadMC_Launcher/Strings/en-US/Resources.resw +++ b/BadMC_Launcher/Strings/en-US/Resources.resw @@ -286,4 +286,10 @@ If something in this setting has been changed in an ontology-specific customizat Getting Java Runtime...... + + Automatically Setting Java + + + Automatic settings + \ No newline at end of file diff --git a/BadMC_Launcher/Strings/zh-Hans/Resources.resw b/BadMC_Launcher/Strings/zh-Hans/Resources.resw index f122d93..eac548f 100644 --- a/BadMC_Launcher/Strings/zh-Hans/Resources.resw +++ b/BadMC_Launcher/Strings/zh-Hans/Resources.resw @@ -289,4 +289,7 @@ 自动设置 Java + + 自动设置 + \ No newline at end of file diff --git a/BadMC_Launcher/ViewModels/ContentDialogs/Settings/JavaContentDialogViewModel.cs b/BadMC_Launcher/ViewModels/ContentDialogs/Settings/JavaContentDialogViewModel.cs index 5f788ed..8804abd 100644 --- a/BadMC_Launcher/ViewModels/ContentDialogs/Settings/JavaContentDialogViewModel.cs +++ b/BadMC_Launcher/ViewModels/ContentDialogs/Settings/JavaContentDialogViewModel.cs @@ -123,7 +123,13 @@ private void ChangeIsAutoJavaEnabled() { [RelayCommand] private void DeleteJava(string parameter) { - // TODO: Delete Java + // Check if parameter is null or empty + if (minecraftConfigService.JavaPaths.Contains(parameter)) { + // Remove Java path + minecraftConfigService.JavaPaths.Remove(parameter); + return; + } + // TODO: Toast Tips } [RelayCommand] @@ -147,6 +153,10 @@ private async void SetJavaList() { return await Task.WhenAll(tasks); }); + // Clear list + JavasList.Clear(); + + // Add items foreach (var item in javaEntries) { JavasList.Add(new JavaViewItem(item)); } diff --git a/BadMC_Launcher/ViewModels/Pages/Settings/LaunchSettingsPageViewModel.cs b/BadMC_Launcher/ViewModels/Pages/Settings/LaunchSettingsPageViewModel.cs index b078537..49e5a22 100644 --- a/BadMC_Launcher/ViewModels/Pages/Settings/LaunchSettingsPageViewModel.cs +++ b/BadMC_Launcher/ViewModels/Pages/Settings/LaunchSettingsPageViewModel.cs @@ -88,7 +88,10 @@ private void SetIsAutoMemorySize() { private async void GetJavaInfo() { java = await JavaUtil.GetJavaInfoAsync(minecraftService.ActiveJavaPath); - JavaId = java != null ? $"{java.JavaType} {java.JavaVersion}" : sourceService.GetString("Global_NullJavaId"); + // Set Java information + JavaId = minecraftService.IsAutoJavaEnabled ? + $"{sourceService.GetString("Global_AutoJavaPath")}" : + ( java != null ? $"{java.JavaType} {java.JavaVersion}" : sourceService.GetString("Global_NullJavaId") ); JavaPath = java != null ? java.JavaPath : sourceService.GetString("Global_NullJavaPath"); } @@ -100,6 +103,7 @@ private RequestMessage SendGetValueMessage(Enum tokenEnum) { private void MinecraftConfig_PropertyChanged(object? sender, PropertyChangedEventArgs e) { switch (e.PropertyName) { case nameof(minecraftService.ActiveJavaPath): + case nameof(minecraftService.IsAutoJavaEnabled): GetJavaInfo(); break; case nameof(minecraftService.MinecraftFolders): diff --git a/BadMC_Launcher/Views/UserControls/LoadingAnimation.xaml.cs b/BadMC_Launcher/Views/UserControls/LoadingAnimation.xaml.cs index 11a3f49..b9cfb83 100644 --- a/BadMC_Launcher/Views/UserControls/LoadingAnimation.xaml.cs +++ b/BadMC_Launcher/Views/UserControls/LoadingAnimation.xaml.cs @@ -52,6 +52,7 @@ private static void OnIsLoadingChanged(DependencyObject d, DependencyPropertyCha if ((bool)e.NewValue) { control.IsHitTestVisible = true; + //TODO: 懂的都懂( #if HAS_UNO_WINUI control.LoadBeginAnimation.Start(); From 6fb85e113cc84d849cd0ded31094303593cea125 Mon Sep 17 00:00:00 2001 From: Starcloudsea <84891987+Starcloudsea@users.noreply.github.com> Date: Wed, 30 Apr 2025 19:54:33 +0800 Subject: [PATCH 14/40] =?UTF-8?q?=E4=B8=8D=E5=86=99=E4=BA=86(=E6=81=BC)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BadMC_Launcher.Tests/UnitTest1.cs | 9 +- BadMC_Launcher/App.xaml.cs | 5 +- BadMC_Launcher/BadMC_Launcher.csproj | 1 + .../Controls/Converters/SizeConverter.cs | 22 + .../Controls/Minecraft/JavaViewItem.cs | 6 +- .../ItemTemplate/JavaItemsTemplate.xaml | 12 +- .../Extensions/ConverterExtension.cs | 12 + .../Extensions/JavaEntryExtension.cs | 8 +- BadMC_Launcher/Models/Datas/AppParameters.cs | 5 +- BadMC_Launcher/Strings/en-US/Resources.resw | 31 +- BadMC_Launcher/Strings/zh-Hans/Resources.resw | 31 +- .../Settings/JavaContentDialogViewModel.cs | 16 + .../ViewModels/Pages/MainPageViewModel.cs | 28 +- .../Settings/LaunchSettingsPageViewModel.cs | 53 ++- .../Settings/JavaContentDialog.xaml | 3 +- BadMC_Launcher/Views/Pages/MainPage.xaml | 49 +- BadMC_Launcher/Views/Pages/MainPage.xaml.cs | 35 +- .../Pages/Settings/LaunchSettingsPage.xaml | 123 ++++- .../Pages/Settings/LaunchSettingsPage.xaml.cs | 52 ++- .../Views/UserControls/LaunchPad.xaml | 422 ++++++++++-------- .../Views/UserControls/LaunchPad.xaml.cs | 59 +++ .../UserControls/LoadingAnimation.xaml.cs | 43 +- Directory.Packages.props | 1 + global.json | 2 +- 24 files changed, 739 insertions(+), 289 deletions(-) create mode 100644 BadMC_Launcher/Controls/Converters/SizeConverter.cs create mode 100644 BadMC_Launcher/Extensions/ConverterExtension.cs diff --git a/BadMC_Launcher.Tests/UnitTest1.cs b/BadMC_Launcher.Tests/UnitTest1.cs index c381201..b759863 100644 --- a/BadMC_Launcher.Tests/UnitTest1.cs +++ b/BadMC_Launcher.Tests/UnitTest1.cs @@ -2,6 +2,7 @@ using System.Diagnostics; using System.Net; using BadMC_Launcher.Classes; +using BadMC_Launcher.Models.Datas; using Microsoft.Extensions.DependencyInjection; using Microsoft.UI.Xaml.Media.Imaging; using MinecraftLaunch.Base.Models.Game; @@ -24,10 +25,8 @@ public void Setup() { } [Test] - public async Task Test1() - { - var a = await JavaUtil.GetJavaInfoAsync(@"C:\Program Files\Zulu\zulu-23\bin\java.exe"); - - Assert.Pass($"{a.JavaPath}\n{a.JavaType}\n{a.JavaVersion}\n{a.MajorVersion}"); + public void Test1() { + AppParameters.SystemInfo.RefreshMemoryStatus(); + Assert.Pass((AppParameters.SystemInfo.MemoryStatus.TotalPhysical / 8).ToString()); } } diff --git a/BadMC_Launcher/App.xaml.cs b/BadMC_Launcher/App.xaml.cs index 8eb0caf..dd9326f 100644 --- a/BadMC_Launcher/App.xaml.cs +++ b/BadMC_Launcher/App.xaml.cs @@ -27,8 +27,7 @@ public partial class App : Application { /// public App() { InitializeComponent(); - - ApplicationLanguages.PrimaryLanguageOverride = "zh-Hans"; + //ApplicationLanguages.PrimaryLanguageOverride = "zh-Hans"; } public static new App Current => (App)Application.Current; @@ -119,7 +118,7 @@ protected override void OnLaunched(LaunchActivatedEventArgs args) { //Set MainWindow Configs MainWindow.AppWindow.Title = GetService().WindowName; - MainWindow.AppWindow.Resize(AppParameters.windowSize); + MainWindow.AppWindow.Resize(AppParameters.WindowSize); MainWindow.AppWindow.TitleBar.ExtendsContentIntoTitleBar = true; //TODO: 要是Uno Platform 3月还没回信,那自定义拖拽区域估计只能自己写啦(悲)不过Desktop的三大金刚键肯定得自己写啦(大悲) #if WINDOWS diff --git a/BadMC_Launcher/BadMC_Launcher.csproj b/BadMC_Launcher/BadMC_Launcher.csproj index 322aa84..a9413e6 100644 --- a/BadMC_Launcher/BadMC_Launcher.csproj +++ b/BadMC_Launcher/BadMC_Launcher.csproj @@ -73,6 +73,7 @@ + diff --git a/BadMC_Launcher/Controls/Converters/SizeConverter.cs b/BadMC_Launcher/Controls/Converters/SizeConverter.cs new file mode 100644 index 0000000..4d00346 --- /dev/null +++ b/BadMC_Launcher/Controls/Converters/SizeConverter.cs @@ -0,0 +1,22 @@ + + +using Microsoft.UI.Xaml.Data; + +namespace BadMC_Launcher.Controls.Converters; +public class SSuffixAppendConverter : IValueConverter { + + public object Convert(object value, Type targetType, object parameter, string culture) { + if (value is double number && parameter is double parameterNumber) { + return ( number / parameterNumber ) * 100.0; + } + return value; + } + + + public object ConvertBack(object value, Type targetType, object parameter, string culture) { + if (value is double number && parameter is double parameterNumber) { + return ( number / 100.0 ) * parameterNumber; + } + return value; + } +} diff --git a/BadMC_Launcher/Controls/Minecraft/JavaViewItem.cs b/BadMC_Launcher/Controls/Minecraft/JavaViewItem.cs index 147b268..4979bab 100644 --- a/BadMC_Launcher/Controls/Minecraft/JavaViewItem.cs +++ b/BadMC_Launcher/Controls/Minecraft/JavaViewItem.cs @@ -19,7 +19,7 @@ public JavaViewItem(JavaEntry javaEntry) { JavaPath = Entry.JavaPath; - SetIconPath(); + JavaIconPath = $"ms-appx:///Assets/Icons/JavaIcons/{Entry.JavaType.ToLower()}"; } public JavaEntry Entry { get; init; } @@ -33,10 +33,6 @@ public JavaViewItem(JavaEntry javaEntry) { [ObservableProperty] public partial string? JavaIconPath { get; private set; } - private async void SetIconPath() { - JavaIconPath = await Entry.GetJavaIconPathAsync(); - } - public static bool operator ==(JavaViewItem? left, JavaViewItem? right) { var leftDirectoryPath = Path.GetDirectoryName(left?.JavaPath); var rightDirectoryPath = Path.GetDirectoryName(right?.JavaPath); diff --git a/BadMC_Launcher/Dictionaries/Templates/ItemTemplate/JavaItemsTemplate.xaml b/BadMC_Launcher/Dictionaries/Templates/ItemTemplate/JavaItemsTemplate.xaml index c3d0f43..9573191 100644 --- a/BadMC_Launcher/Dictionaries/Templates/ItemTemplate/JavaItemsTemplate.xaml +++ b/BadMC_Launcher/Dictionaries/Templates/ItemTemplate/JavaItemsTemplate.xaml @@ -34,6 +34,7 @@ - + + + + + + + + GetJavaIconPathAsync(this JavaEntry javaEntry) { - var ImagePath = $"ms-appx:///Assets/Icons/JavaIcons/{javaEntry.JavaType.ToLower()}.png"; - - if (await StorageFile.GetFileFromApplicationUriAsync(new Uri(ImagePath)) != null) { - return ImagePath; + var imageFolder = await Package.Current.InstalledLocation.GetFolderAsync("Assets/Icons/JavaIcons"); + var image = await imageFolder.TryGetItemAsync($"{javaEntry.JavaType.ToLower()}.png"); + if (image != null) { + return $"ms-appx:///Assets/Icons/JavaIcons/{image.Name}"; } return "ms-appx:///Assets/Icons/JavaIcons/openjdk.png"; } diff --git a/BadMC_Launcher/Models/Datas/AppParameters.cs b/BadMC_Launcher/Models/Datas/AppParameters.cs index 660ae11..ecdf0ca 100644 --- a/BadMC_Launcher/Models/Datas/AppParameters.cs +++ b/BadMC_Launcher/Models/Datas/AppParameters.cs @@ -6,6 +6,7 @@ using System.Text.Encodings.Web; using System.Text.Json; using System.Threading.Tasks; +using Hardware.Info; using Microsoft.UI.Xaml.Media.Imaging; using Microsoft.Windows.ApplicationModel.Resources; using Uno.UI.RemoteControl.Host; @@ -14,8 +15,10 @@ namespace BadMC_Launcher.Models.Datas; public static class AppParameters { - public readonly static SizeInt32 windowSize = new() { + public static SizeInt32 WindowSize { get; } = new() { Width = 1024, Height = 620 }; + + public static HardwareInfo SystemInfo { get; } = new(); } diff --git a/BadMC_Launcher/Strings/en-US/Resources.resw b/BadMC_Launcher/Strings/en-US/Resources.resw index da8e604..5f20a91 100644 --- a/BadMC_Launcher/Strings/en-US/Resources.resw +++ b/BadMC_Launcher/Strings/en-US/Resources.resw @@ -187,10 +187,10 @@ If something in this setting has been changed in an ontology-specific customizat Setting the Java Runtime for Minecraft Java. - + Java Runtime Memory - + Set the memory used when running Minecraft Java. @@ -292,4 +292,31 @@ If something in this setting has been changed in an ontology-specific customizat Automatic settings + + It seems something went wrong! (This can't be happening! 😨) + + + Minecraft might struggle a lot with this...... 😟 + + + This memory size is decent for Minecraft 🙂 + + + This memory size is awesome! 😋 + + + Damn! You're rich! 😮 + + + HUH?????? Σ(っ °Д °;)っ + + + Preview of memory usage + + + Usage + + + Minecraft usage + \ No newline at end of file diff --git a/BadMC_Launcher/Strings/zh-Hans/Resources.resw b/BadMC_Launcher/Strings/zh-Hans/Resources.resw index eac548f..bf06813 100644 --- a/BadMC_Launcher/Strings/zh-Hans/Resources.resw +++ b/BadMC_Launcher/Strings/zh-Hans/Resources.resw @@ -187,10 +187,10 @@ 为 Minecraft Java 设置 Java 运行时. - + Java 运行时内存 - + 设置运行 Minecraft Java 时所使用的内存. @@ -292,4 +292,31 @@ 自动设置 + + 好像哪里出错了! (不可能会这样啊?😨) + + + 对于 Minecraft 可能非常吃力...... 😟 + + + 这个内存大小对于 Minecraft 来说不错🙂 + + + 这个内存大小很棒! 😋 + + + woc! 有钱人! 😮 + + + 啊?????? Σ(っ °Д °;)っ + + + 内存预览 + + + 已使用 + + + Minecraft 已分配 + \ No newline at end of file diff --git a/BadMC_Launcher/ViewModels/ContentDialogs/Settings/JavaContentDialogViewModel.cs b/BadMC_Launcher/ViewModels/ContentDialogs/Settings/JavaContentDialogViewModel.cs index 8804abd..f1a67aa 100644 --- a/BadMC_Launcher/ViewModels/ContentDialogs/Settings/JavaContentDialogViewModel.cs +++ b/BadMC_Launcher/ViewModels/ContentDialogs/Settings/JavaContentDialogViewModel.cs @@ -30,6 +30,7 @@ public JavaContentDialogViewModel() { minecraftConfigService.PropertyChanged += JavaList_PropertyChanged; IsAutoJavaEnabled = minecraftConfigService.IsAutoJavaEnabled; + IsJavasListLoading = false; // Initialize List JavasList = new(); @@ -88,6 +89,11 @@ private async Task AddJava() { // TODO: Show tip toast } + [RelayCommand] + private void DownloadJava(string parameter) { + + } + [RelayCommand] private async Task SearchJavas() { IAsyncEnumerable? javas = JavaUtil.EnumerableJavaAsync(); @@ -142,8 +148,13 @@ partial void OnJavasListChanged(ObservableDataList value) { } private async void SetJavaList() { + if (!minecraftConfigService.JavaPaths.Any()) { + return; + } + IsJavasListLoading = true; + var javaEntries = await Task.Run(async () => { // Get Java paths var tasks = minecraftConfigService.JavaPaths @@ -172,6 +183,7 @@ private async void SetJavaList() { private void JavaList_PropertyChanged(object? sender, PropertyChangedEventArgs e) { switch(e.PropertyName) { case nameof(MinecraftConfigService.JavaPaths): + // Update Java list SetJavaList(); break; @@ -183,4 +195,8 @@ private void JavaList_PropertyChanged(object? sender, PropertyChangedEventArgs e } IsJavasListEmpty = !JavasList.Any(); } + + partial void OnIsJavasListLoadingChanged(bool oldValue, bool newValue) { + OnPropertyChanged(nameof(IsJavasListLoading)); + } } diff --git a/BadMC_Launcher/ViewModels/Pages/MainPageViewModel.cs b/BadMC_Launcher/ViewModels/Pages/MainPageViewModel.cs index bba4611..e2ae628 100644 --- a/BadMC_Launcher/ViewModels/Pages/MainPageViewModel.cs +++ b/BadMC_Launcher/ViewModels/Pages/MainPageViewModel.cs @@ -9,22 +9,26 @@ using BadMC_Launcher.Models.Datas.ViewDatas; using BadMC_Launcher.Models.Enums; using BadMC_Launcher.Services.Settings; +using BadMC_Launcher.Views.UserControls; using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Messaging; using CommunityToolkit.Mvvm.Messaging.Messages; using CommunityToolkit.WinUI.Controls; using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Controls.Primitives; +using Microsoft.UI.Xaml.Input; using Microsoft.UI.Xaml.Media.Animation; using Uno.UI.RemoteControl; namespace BadMC_Launcher.ViewModels.Pages; public partial class MainPageViewModel : ObservableObject { + private bool isLaunchPadLightEliminationEnabled = false; public MainPageViewModel() { //Init Property WindowName = App.GetService().WindowName; + IsLaunchPadOpen = true; IsMainSideBarToolShow = false; MainSideBarItems = MainSideBarData.MainSideBarItems; @@ -46,6 +50,9 @@ public MainPageViewModel() { [ObservableProperty] public partial Brush? AppBackground { get; set; } + [ObservableProperty] + public partial bool IsLaunchPadOpen { get; set; } + //MainSideBar Items [ObservableProperty] public partial DistinctiveItemBindingList MainSideBarItems { get; set; } @@ -75,9 +82,13 @@ public MainPageViewModel() { private void ChangeToolVisibilityAndSelectedItem(object? parameter) { if (parameter == null) { IsMainSideBarToolShow = false; + isLaunchPadLightEliminationEnabled = false; + IsLaunchPadOpen = true; } else { IsMainSideBarToolShow = true; + isLaunchPadLightEliminationEnabled = true; + IsLaunchPadOpen = false; } var list = new List(); @@ -103,17 +114,24 @@ private void NavigateToPage(NavigationViewItemInvokedEventArgs args) { return; } } - SendInvokeFuncMessage(null, MainPageMessengerTokenEnum.PageCloseToken); + SendInvokeFuncMessage(MainPageMessengerTokenEnum.PageCloseToken); + } + + [RelayCommand] + private void CloseLaunchPad(PointerRoutedEventArgs e) { + if (isLaunchPadLightEliminationEnabled && e.OriginalSource.GetType() != typeof(LaunchPad)) { + IsLaunchPadOpen = false; + } } [RelayCommand] private void PageGoBack() { - SendInvokeFuncMessage(null, MainPageMessengerTokenEnum.PageGoBackToken); + SendInvokeFuncMessage(MainPageMessengerTokenEnum.PageGoBackToken); } [RelayCommand] private void ClosePage() { - SendInvokeFuncMessage(null, MainPageMessengerTokenEnum.PageCloseToken); + SendInvokeFuncMessage(MainPageMessengerTokenEnum.PageCloseToken); } [RelayCommand] @@ -162,6 +180,10 @@ private void SendInvokeFuncMessage(T value, Enum tokenEnum) { WeakReferenceMessenger.Default.Send(new ValueChangedMessage(value), tokenEnum.ToString()); } + private RequestMessage SendInvokeFuncMessage(Enum tokenEnum) { + return WeakReferenceMessenger.Default.Send(new RequestMessage(), tokenEnum.ToString()); + } + partial void OnIsMainSideBarToolShowChanged(bool value) { } diff --git a/BadMC_Launcher/ViewModels/Pages/Settings/LaunchSettingsPageViewModel.cs b/BadMC_Launcher/ViewModels/Pages/Settings/LaunchSettingsPageViewModel.cs index 49e5a22..a51ec17 100644 --- a/BadMC_Launcher/ViewModels/Pages/Settings/LaunchSettingsPageViewModel.cs +++ b/BadMC_Launcher/ViewModels/Pages/Settings/LaunchSettingsPageViewModel.cs @@ -5,6 +5,7 @@ using System.Text; using System.Threading.Tasks; using BadMC_Launcher.Controls.Minecraft; +using BadMC_Launcher.Models.Datas; using BadMC_Launcher.Models.Datas.SettingsDatas; using BadMC_Launcher.Models.Enums; using BadMC_Launcher.Services.Settings; @@ -15,19 +16,24 @@ using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Messaging; using CommunityToolkit.Mvvm.Messaging.Messages; +using CommunityToolkit.WinUI.Converters; +using Hardware.Info; using MinecraftLaunch.Base.Models.Game; using MinecraftLaunch.Utilities; +using Serilog; +using Uno.Logging; namespace BadMC_Launcher.ViewModels.Pages.Settings; public partial class LaunchSettingsPageViewModel : ObservableObject { + private readonly CancellationTokenSource cancelLoopToken = new(); private readonly XamlRoot? mainPageXamlRoot; private MinecraftConfigService minecraftService = App.GetService(); private ResourceLoader sourceService = App.GetService(); private MinecraftFolderViewItem? minecraftFolder; private JavaEntry? java; - + public LaunchSettingsPageViewModel() { mainPageXamlRoot = SendGetValueMessage(MainPageMessengerTokenEnum.XamlRootToken).Response; minecraftFolder = minecraftService.MinecraftFolders.FirstOrDefault(item => item.MinecraftFolderPath == minecraftService.ActiveMinecraftFolderPath); @@ -41,6 +47,8 @@ public LaunchSettingsPageViewModel() { JavaId = sourceService.GetString("Global_NullJavaId"); JavaPath = sourceService.GetString("Global_NullJavaPath"); + RefreshMemory(cancelLoopToken.Token); + GetJavaInfo(); } @@ -51,15 +59,40 @@ public LaunchSettingsPageViewModel() { [ObservableProperty] public partial string MinecraftFolderPath { get; set; } + // Java settings [ObservableProperty] public partial string JavaId { get; set; } [ObservableProperty] public partial string JavaPath { get; set; } + // Memory settings [ObservableProperty] public partial bool IsAutoMemorySize { get; set; } + [ObservableProperty] + public partial double MaxMemoryView { get; set; } + + [ObservableProperty] + public partial double UsedMemoryView { get; set; } + + [ObservableProperty] + public partial double GameMemoryView { get; set; } + + [ObservableProperty] + public partial uint MinMemory { get; set; } + + [ObservableProperty] + public partial uint MaxMemory { get; set; } + + [RelayCommand] + private void CancelLoop() { + if (cancelLoopToken.Token.CanBeCanceled) { + cancelLoopToken.Cancel(); + } + + } + [RelayCommand(FlowExceptionsToTaskScheduler = true)] private async Task ShowMinecraftFolderManagerDialog() { if (mainPageXamlRoot != null) { @@ -95,6 +128,24 @@ private async void GetJavaInfo() { JavaPath = java != null ? java.JavaPath : sourceService.GetString("Global_NullJavaPath"); } + private async void RefreshMemory(CancellationToken cancellationToken) { + try { + while (true) { + AppParameters.SystemInfo.RefreshMemoryStatus(); + + MaxMemoryView = AppParameters.SystemInfo.MemoryStatus.TotalPhysical.BytesToGB(); + UsedMemoryView = (AppParameters.SystemInfo.MemoryStatus.TotalPhysical - AppParameters.SystemInfo.MemoryStatus.AvailablePhysical).BytesToGB(); + GameMemoryView = ( AppParameters.SystemInfo.MemoryStatus.TotalPhysical - ( AppParameters.SystemInfo.MemoryStatus.AvailablePhysical / 2 ) ).BytesToGB(); + + // Wait 1 second + await Task.Delay(1000, cancellationToken); + } + + } + catch(TaskCanceledException ex) { + Log.Information($"RefreshMemory method is Exited: {ex.Source}"); + } + } private RequestMessage SendGetValueMessage(Enum tokenEnum) { return WeakReferenceMessenger.Default.Send(new RequestMessage(), tokenEnum.ToString()); } diff --git a/BadMC_Launcher/Views/ContentDialogs/Settings/JavaContentDialog.xaml b/BadMC_Launcher/Views/ContentDialogs/Settings/JavaContentDialog.xaml index 447aff9..0753a8d 100644 --- a/BadMC_Launcher/Views/ContentDialogs/Settings/JavaContentDialog.xaml +++ b/BadMC_Launcher/Views/ContentDialogs/Settings/JavaContentDialog.xaml @@ -80,7 +80,8 @@ Width="36" Height="36" Padding="0" - IsEnabled="False"> + IsEnabled="True" + Command="{Binding DownloadJavaCommand}"> diff --git a/BadMC_Launcher/Views/Pages/MainPage.xaml b/BadMC_Launcher/Views/Pages/MainPage.xaml index 24873cf..9a90e79 100644 --- a/BadMC_Launcher/Views/Pages/MainPage.xaml +++ b/BadMC_Launcher/Views/Pages/MainPage.xaml @@ -22,11 +22,19 @@ - + + + + + + + + + - - - @@ -251,6 +236,8 @@ + + @@ -279,10 +266,10 @@ - + + + + + - - - - - - - - - - - - + + + - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - + + + + + + + + + - - + + diff --git a/BadMC_Launcher/Views/UserControls/LaunchPad.xaml.cs b/BadMC_Launcher/Views/UserControls/LaunchPad.xaml.cs index f4458d8..0a37dd8 100644 --- a/BadMC_Launcher/Views/UserControls/LaunchPad.xaml.cs +++ b/BadMC_Launcher/Views/UserControls/LaunchPad.xaml.cs @@ -1,4 +1,10 @@ + using BadMC_Launcher.ViewModels.UserControls; +using CommunityToolkit.Mvvm.Messaging; +using CommunityToolkit.Mvvm.Messaging.Messages; +using Microsoft.UI.Xaml.Input; +using Windows.Foundation; +using Windows.System; // The User Control item template is documented at https://go.microsoft.com/fwlink/?LinkId=234236 @@ -8,4 +14,57 @@ public LaunchPad() { this.InitializeComponent(); DataContext = new LaunchPadViewModel(); } + + // Register property + public static readonly DependencyProperty IsOpenProperty = DependencyProperty.Register( + nameof(IsOpen), + typeof(bool), + typeof(LoadingAnimation), + new PropertyMetadata(true, OnIsOpenChanged) + ); + + public bool IsOpen { + get => (bool)GetValue(IsOpenProperty); + set => SetValue(IsOpenProperty, value); + } + + private static void OnIsOpenChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { + var control = (LaunchPad)d; + + if ((bool)e.NewValue == true) { + +#if WINAPPSDK_PACKAGED + control.OpenLaunchPadAnimation.Start(); +#else + control.Translation = new(0); +#endif + control.LaunchPadBorder.IsHitTestVisible = true; + } + else { +#if WINAPPSDK_PACKAGED + control.CloseLaunchPadAnimation.Start(); +#else + control.Translation = new(-100, 0, 0); +#endif + control.LaunchPadBorder.IsHitTestVisible = false; + } + } + + private void OnLaunchPadPointEntered(object sender, PointerRoutedEventArgs e) { + if (!IsOpen) { + LaunchPadPointerInAnimation.Start(); + } + } + + private void OnLaunchPadPointExited(object sender, PointerRoutedEventArgs e) { + if (!IsOpen) { + LaunchPadPointerOutAnimation.Start(); + } + } + + private void OnLaunchPadPointerPressed(object sender, PointerRoutedEventArgs e) { + if (!IsOpen) { + IsOpen = true; + } + } } diff --git a/BadMC_Launcher/Views/UserControls/LoadingAnimation.xaml.cs b/BadMC_Launcher/Views/UserControls/LoadingAnimation.xaml.cs index b9cfb83..d8e2038 100644 --- a/BadMC_Launcher/Views/UserControls/LoadingAnimation.xaml.cs +++ b/BadMC_Launcher/Views/UserControls/LoadingAnimation.xaml.cs @@ -22,27 +22,27 @@ public LoadingAnimation() { } // Register property - public static readonly DependencyProperty IsLoadingProperty = - DependencyProperty.Register( - nameof(IsLoading), - typeof(bool), - typeof(LoadingAnimation), - new PropertyMetadata(false, OnIsLoadingChanged)); + public static readonly DependencyProperty IsLoadingProperty = DependencyProperty.Register( + nameof(IsLoading), + typeof(bool), + typeof(LoadingAnimation), + new PropertyMetadata(false, OnIsLoadingChanged) + ); - public static readonly DependencyProperty LoadDescriptionProperty = - DependencyProperty.Register( - nameof(LoadDescription), - typeof(string), - typeof(LoadingAnimation), - new PropertyMetadata(false, OnLoadDescriptionChanged)); + public static readonly DependencyProperty LoadDescriptionProperty = DependencyProperty.Register( + nameof(LoadDescription), + typeof(string), + typeof(LoadingAnimation), + new PropertyMetadata(string.Empty, OnLoadDescriptionChanged) + ); public bool IsLoading { get => (bool)GetValue(IsLoadingProperty); set => SetValue(IsLoadingProperty, value); } - + public string LoadDescription { - get => (string)GetValue(IsLoadingProperty); + get => (string)GetValue(LoadDescriptionProperty); set => SetValue(LoadDescriptionProperty, value); } @@ -50,11 +50,13 @@ public string LoadDescription { private static void OnIsLoadingChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var control = (LoadingAnimation)d; - if ((bool)e.NewValue) { + if ((bool)e.NewValue == (bool)e.OldValue) { + return; + } + else if ((bool)e.NewValue) { control.IsHitTestVisible = true; - //TODO: 懂的都懂( -#if HAS_UNO_WINUI +#if WINAPPSDK_PACKAGED control.LoadBeginAnimation.Start(); #else control.Opacity = 1; @@ -62,13 +64,14 @@ private static void OnIsLoadingChanged(DependencyObject d, DependencyPropertyCha return; } - control.IsHitTestVisible = false; -#if HAS_UNO_WINUI - control.LoadEndAnimation.Start(); +#if WINAPPSDK_PACKAGED + control.LoadEndAnimation.Start(); #else control.Opacity = 0; #endif + + control.IsHitTestVisible = false; } private static void OnLoadDescriptionChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { diff --git a/Directory.Packages.props b/Directory.Packages.props index 911b3f3..89f2eb1 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -23,6 +23,7 @@ + diff --git a/global.json b/global.json index 9fa54cf..958271a 100644 --- a/global.json +++ b/global.json @@ -4,7 +4,7 @@ "Uno.Sdk": "5.6.20" }, "sdk": { - "allowPrerelease": "true", + "allowPrerelease": true, "version": "9.0.203" } } From 85667e5c4aa3bf1832d519dc8d8106088e62c077 Mon Sep 17 00:00:00 2001 From: Starcloudsea <84891987+Starcloudsea@users.noreply.github.com> Date: Thu, 8 May 2025 22:35:03 +0800 Subject: [PATCH 15/40] =?UTF-8?q?Nice!(Nice=E4=B8=AA=E6=AF=9B=E7=BA=BF(?= =?UTF-8?q?=E2=95=AC=E2=96=94=E7=9A=BF=E2=96=94)=E2=95=AF)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BadMC_Launcher.Tests/UnitTest1.cs | 4 +- BadMC_Launcher/App.xaml.cs | 25 +- BadMC_Launcher/BadMC_Launcher.csproj | 7 + .../Converters/DoubleToUIntConverter.cs | 22 ++ .../Controls/Converters/SizeConverter.cs | 22 -- .../Dictionaries/Styles/ShadowStyle.xaml | 13 + .../Extensions/ConverterExtension.cs | 11 +- .../Models/{Datas => Data}/AppDataPath.cs | 2 +- .../Models/{Datas => Data}/AppParameters.cs | 6 +- .../Models/Data/Mappings/UpdateMapping.cs | 22 ++ .../SettingsDatas/MinecraftConfig.cs | 9 +- .../SettingsDatas/SingleMinecraftConfig.cs | 12 +- .../SettingsDatas/ThemeSetting.cs | 2 +- .../ViewDatas/MainSideBarData.cs | 2 +- .../{Datas => Data}/ViewDatas/SettingsData.cs | 2 +- .../Models/Datas/Mappings/UpdateMapping.cs | 12 - .../Models/Enums/IndependencyCoreEnum.cs | 14 + .../Models/Enums/MessengerTokenEnum.cs | 2 + BadMC_Launcher/Services/AppAssetsService.cs | 2 +- BadMC_Launcher/Services/FileService.cs | 253 ++++++++++++------ .../Settings/MinecraftConfigService.cs | 203 ++++++++------ .../Settings/SingleMinecraftConfigService.cs | 140 +++++----- .../Services/Settings/ThemeSettingService.cs | 96 ++++--- .../ViewServices/MainSideBarService.cs | 2 +- .../Services/ViewServices/SettingsService.cs | 2 +- BadMC_Launcher/Strings/en-US/Resources.resw | 52 ++-- BadMC_Launcher/Strings/zh-Hans/Resources.resw | 50 ++-- .../Settings/JavaContentDialogViewModel.cs | 92 +++---- .../MinecraftFolderContentDialogViewModel.cs | 28 +- .../ViewModels/Pages/MainPageViewModel.cs | 25 +- .../Settings/LaunchSettingsPageViewModel.cs | 117 +++++--- .../SettingsDashboardPageViewModel.cs | 14 +- .../UserControls/LaunchPadViewModel.cs | 19 +- BadMC_Launcher/Views/Pages/MainPage.xaml | 16 +- BadMC_Launcher/Views/Pages/MainPage.xaml.cs | 15 +- .../Pages/Settings/LaunchSettingsPage.xaml | 183 ++++++++++--- .../Pages/Settings/LaunchSettingsPage.xaml.cs | 77 ++++-- .../Views/UserControls/LaunchPad.xaml | 50 ++-- .../Views/UserControls/LaunchPad.xaml.cs | 22 +- .../UserControls/LoadingAnimation.xaml.cs | 8 +- Directory.Packages.props | 6 +- 41 files changed, 1050 insertions(+), 611 deletions(-) create mode 100644 BadMC_Launcher/Classes/Converters/DoubleToUIntConverter.cs delete mode 100644 BadMC_Launcher/Controls/Converters/SizeConverter.cs create mode 100644 BadMC_Launcher/Dictionaries/Styles/ShadowStyle.xaml rename BadMC_Launcher/Models/{Datas => Data}/AppDataPath.cs (91%) rename BadMC_Launcher/Models/{Datas => Data}/AppParameters.cs (86%) create mode 100644 BadMC_Launcher/Models/Data/Mappings/UpdateMapping.cs rename BadMC_Launcher/Models/{Datas => Data}/SettingsDatas/MinecraftConfig.cs (84%) rename BadMC_Launcher/Models/{Datas => Data}/SettingsDatas/SingleMinecraftConfig.cs (72%) rename BadMC_Launcher/Models/{Datas => Data}/SettingsDatas/ThemeSetting.cs (92%) rename BadMC_Launcher/Models/{Datas => Data}/ViewDatas/MainSideBarData.cs (93%) rename BadMC_Launcher/Models/{Datas => Data}/ViewDatas/SettingsData.cs (90%) delete mode 100644 BadMC_Launcher/Models/Datas/Mappings/UpdateMapping.cs create mode 100644 BadMC_Launcher/Models/Enums/IndependencyCoreEnum.cs diff --git a/BadMC_Launcher.Tests/UnitTest1.cs b/BadMC_Launcher.Tests/UnitTest1.cs index b759863..c316bed 100644 --- a/BadMC_Launcher.Tests/UnitTest1.cs +++ b/BadMC_Launcher.Tests/UnitTest1.cs @@ -2,7 +2,6 @@ using System.Diagnostics; using System.Net; using BadMC_Launcher.Classes; -using BadMC_Launcher.Models.Datas; using Microsoft.Extensions.DependencyInjection; using Microsoft.UI.Xaml.Media.Imaging; using MinecraftLaunch.Base.Models.Game; @@ -26,7 +25,6 @@ public void Setup() { [Test] public void Test1() { - AppParameters.SystemInfo.RefreshMemoryStatus(); - Assert.Pass((AppParameters.SystemInfo.MemoryStatus.TotalPhysical / 8).ToString()); + } } diff --git a/BadMC_Launcher/App.xaml.cs b/BadMC_Launcher/App.xaml.cs index dd9326f..717507c 100644 --- a/BadMC_Launcher/App.xaml.cs +++ b/BadMC_Launcher/App.xaml.cs @@ -1,8 +1,7 @@ using BadMC_Launcher.Classes; using BadMC_Launcher.Controls; using BadMC_Launcher.Controls.MainSearch; -using BadMC_Launcher.Models.Datas; -using BadMC_Launcher.Services; +using BadMC_Launcher.Models.Data; using BadMC_Launcher.Services.Settings; using BadMC_Launcher.Services.ViewServices; using BadMC_Launcher.ViewModels.ContentDialogs.Settings; @@ -20,7 +19,8 @@ using Windows.Globalization; namespace BadMC_Launcher; -public partial class App : Application { +public partial class + App : Application { /// /// Initializes the singleton application object. This is the first line of authored code /// executed, and as such is the logical equivalent of main() or WinMain(). @@ -28,6 +28,7 @@ public partial class App : Application { public App() { InitializeComponent(); //ApplicationLanguages.PrimaryLanguageOverride = "zh-Hans"; + } public static new App Current => (App)Application.Current; @@ -155,18 +156,20 @@ protected override void OnLaunched(LaunchActivatedEventArgs args) { //Get Service public static T GetService() { var services = Current.Host?.Services; - if (services != null) { - var service = services.GetService(); - if (service != null) { - return service; - } + if (services == null) { + throw new InvalidOperationException("Service not found."); + } + + var service = services.GetService(); + if (service != null) { + return service; } throw new InvalidOperationException("Service not found."); } private static void GetSettings() { GetService().SyncSettingGet(); - GetService().isSyncEnabled = true; + GetService().IsSyncEnabled = true; GetService().SyncSettingGet(); GetService().isSyncEnabled = true; } @@ -190,10 +193,10 @@ private void GlobalRegister() { //Register SettingsSideBarItems GetService().SideBarRegister(new SettingsSideBarItem() { - ItemName = GetService().GetString("LaunchSettingsPage_PageName"), + ItemName = GetService().GetString("LaunchSettingsPage_SettingsPageName"), ItemIcon = new FontIcon() { Glyph = "\uE7FC" }, NavigatePage = typeof(LaunchSettingsPage), - PageHead = GetService().GetString("LaunchSettingsPage_PageName"), + PageHead = GetService().GetString("LaunchSettingsPage_SettingsPageName"), }); } } diff --git a/BadMC_Launcher/BadMC_Launcher.csproj b/BadMC_Launcher/BadMC_Launcher.csproj index a9413e6..2fb1a5e 100644 --- a/BadMC_Launcher/BadMC_Launcher.csproj +++ b/BadMC_Launcher/BadMC_Launcher.csproj @@ -66,6 +66,7 @@ + @@ -91,6 +92,12 @@ + + + MSBuild:Compile + + + MSBuild:Compile diff --git a/BadMC_Launcher/Classes/Converters/DoubleToUIntConverter.cs b/BadMC_Launcher/Classes/Converters/DoubleToUIntConverter.cs new file mode 100644 index 0000000..c481356 --- /dev/null +++ b/BadMC_Launcher/Classes/Converters/DoubleToUIntConverter.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.UI.Xaml.Data; + +namespace BadMC_Launcher.Classes.Converters; +internal class DoubleToUIntConverter: IValueConverter { + public object Convert(object value, Type targetType, object parameter, string culture) { + return value; // uint → double(正常情况) + } + + public object ConvertBack(object value, Type targetType, object parameter, string culture) { + if (value is double d && double.IsNaN(d)) + return 0u; // 如果输入 NaN,返回 0 + if (value is double d2) + return (uint)d2; // 强制转换(会截断小数) + return 0u; + } +} diff --git a/BadMC_Launcher/Controls/Converters/SizeConverter.cs b/BadMC_Launcher/Controls/Converters/SizeConverter.cs deleted file mode 100644 index 4d00346..0000000 --- a/BadMC_Launcher/Controls/Converters/SizeConverter.cs +++ /dev/null @@ -1,22 +0,0 @@ - - -using Microsoft.UI.Xaml.Data; - -namespace BadMC_Launcher.Controls.Converters; -public class SSuffixAppendConverter : IValueConverter { - - public object Convert(object value, Type targetType, object parameter, string culture) { - if (value is double number && parameter is double parameterNumber) { - return ( number / parameterNumber ) * 100.0; - } - return value; - } - - - public object ConvertBack(object value, Type targetType, object parameter, string culture) { - if (value is double number && parameter is double parameterNumber) { - return ( number / 100.0 ) * parameterNumber; - } - return value; - } -} diff --git a/BadMC_Launcher/Dictionaries/Styles/ShadowStyle.xaml b/BadMC_Launcher/Dictionaries/Styles/ShadowStyle.xaml new file mode 100644 index 0000000..f23106b --- /dev/null +++ b/BadMC_Launcher/Dictionaries/Styles/ShadowStyle.xaml @@ -0,0 +1,13 @@ + + + + diff --git a/BadMC_Launcher/Extensions/ConverterExtension.cs b/BadMC_Launcher/Extensions/ConverterExtension.cs index 583e5d3..33ab013 100644 --- a/BadMC_Launcher/Extensions/ConverterExtension.cs +++ b/BadMC_Launcher/Extensions/ConverterExtension.cs @@ -6,7 +6,16 @@ namespace BadMC_Launcher.Extensions; public static class ConverterExtension { - public static double BytesToGB(this ulong bytes) { + public static double BytesToGb(this ulong bytes) { return Math.Round(bytes / ( 1024.0 * 1024.0 * 1024.0 ), 2); } + + public static uint BytesToMb(this ulong bytes) { + return checked((uint)(bytes / ( 1024 * 1024 ))); + } + + public static uint GetAutoGameMemoryMb(this uint maxMemory, uint usedMemory) { + // TODO: 等什么时候再做( + return (maxMemory - usedMemory) / 2; + } } diff --git a/BadMC_Launcher/Models/Datas/AppDataPath.cs b/BadMC_Launcher/Models/Data/AppDataPath.cs similarity index 91% rename from BadMC_Launcher/Models/Datas/AppDataPath.cs rename to BadMC_Launcher/Models/Data/AppDataPath.cs index 8a01ff6..25bcd84 100644 --- a/BadMC_Launcher/Models/Datas/AppDataPath.cs +++ b/BadMC_Launcher/Models/Data/AppDataPath.cs @@ -1,4 +1,4 @@ -namespace BadMC_Launcher.Models.Datas; +namespace BadMC_Launcher.Models.Data; public static class AppDataPath { public static readonly string DataPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "BadMC_Launcher"); diff --git a/BadMC_Launcher/Models/Datas/AppParameters.cs b/BadMC_Launcher/Models/Data/AppParameters.cs similarity index 86% rename from BadMC_Launcher/Models/Datas/AppParameters.cs rename to BadMC_Launcher/Models/Data/AppParameters.cs index ecdf0ca..049069d 100644 --- a/BadMC_Launcher/Models/Datas/AppParameters.cs +++ b/BadMC_Launcher/Models/Data/AppParameters.cs @@ -12,12 +12,12 @@ using Uno.UI.RemoteControl.Host; using Windows.Graphics; -namespace BadMC_Launcher.Models.Datas; +namespace BadMC_Launcher.Models.Data; public static class AppParameters { public static SizeInt32 WindowSize { get; } = new() { - Width = 1024, - Height = 620 + Width = 960, + Height = 600 }; public static HardwareInfo SystemInfo { get; } = new(); diff --git a/BadMC_Launcher/Models/Data/Mappings/UpdateMapping.cs b/BadMC_Launcher/Models/Data/Mappings/UpdateMapping.cs new file mode 100644 index 0000000..149148f --- /dev/null +++ b/BadMC_Launcher/Models/Data/Mappings/UpdateMapping.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using BadMC_Launcher.Models.Enums; + +namespace BadMC_Launcher.Models.Data.Mappings; +public static class UpdateMapping { + public readonly static Dictionary minecraftConfigPropertyNameMapping = new() { + { "OwO", "MinecraftFolderId" } + }; + + public readonly static Dictionary> minecraftConfigPropertyTypeMapping = new() { + { "IndependencyCore", (oldValue) => { + if (oldValue is bool value && value) { + return IndependencyCoreEnum.ModLoader; + } + return IndependencyCoreEnum.Disabled; + } } + }; +} diff --git a/BadMC_Launcher/Models/Datas/SettingsDatas/MinecraftConfig.cs b/BadMC_Launcher/Models/Data/SettingsDatas/MinecraftConfig.cs similarity index 84% rename from BadMC_Launcher/Models/Datas/SettingsDatas/MinecraftConfig.cs rename to BadMC_Launcher/Models/Data/SettingsDatas/MinecraftConfig.cs index 71032d8..d7cc2ea 100644 --- a/BadMC_Launcher/Models/Datas/SettingsDatas/MinecraftConfig.cs +++ b/BadMC_Launcher/Models/Data/SettingsDatas/MinecraftConfig.cs @@ -11,8 +11,9 @@ using System.ComponentModel; using BadMC_Launcher.Services.Settings; using BadMC_Launcher.Classes.Comparers; +using BadMC_Launcher.Models.Enums; -namespace BadMC_Launcher.Models.Datas.SettingsDatas; +namespace BadMC_Launcher.Models.Data.SettingsData; internal static class MinecraftConfig { internal static DistinctiveItemBindingList minecraftAccounts = new() { PropertyName = nameof(MinecraftConfigService.MinecraftAccounts) }; @@ -30,13 +31,13 @@ internal static class MinecraftConfig { internal static bool isFullscreen = false; - internal static bool isEnableIndependencyCore = false; + internal static IndependencyCoreEnum independencyCore = IndependencyCoreEnum.ModLoader; internal static bool isAutoMemorySize = true; - internal static int minMemorySize = 512; + internal static uint maxGameMemory = 1024; - internal static int maxMemorySize = 1024; + internal static uint minGameMemory = 512; internal static string? launcherName = App.GetService().GetString("MinecraftConfig_MinecraftTitleNameResource"); diff --git a/BadMC_Launcher/Models/Datas/SettingsDatas/SingleMinecraftConfig.cs b/BadMC_Launcher/Models/Data/SettingsDatas/SingleMinecraftConfig.cs similarity index 72% rename from BadMC_Launcher/Models/Datas/SettingsDatas/SingleMinecraftConfig.cs rename to BadMC_Launcher/Models/Data/SettingsDatas/SingleMinecraftConfig.cs index a9b9bdd..1c4b054 100644 --- a/BadMC_Launcher/Models/Datas/SettingsDatas/SingleMinecraftConfig.cs +++ b/BadMC_Launcher/Models/Data/SettingsDatas/SingleMinecraftConfig.cs @@ -7,23 +7,23 @@ using BadMC_Launcher.Extensions; using MinecraftLaunch.Base.Models.Game; -namespace BadMC_Launcher.Models.Datas.SettingsDatas; +namespace BadMC_Launcher.Models.Data.SettingsData; internal class SingleMinecraftConfig { internal string? targetMinecraftEntryPath; - internal bool isAutoJavaEnabled = false; + internal bool? isAutoJavaEnabled; internal bool? isFullscreen; internal bool? isEnableIndependencyCore; internal bool? isAutoMemorySize; + + internal uint? maxMemorySize; - internal int? minMemorySize; + internal uint? minMemorySize; - internal int? maxMemorySize; - - internal JavaEntry? javaPath; + internal string? javaPath; internal string? launcherName; diff --git a/BadMC_Launcher/Models/Datas/SettingsDatas/ThemeSetting.cs b/BadMC_Launcher/Models/Data/SettingsDatas/ThemeSetting.cs similarity index 92% rename from BadMC_Launcher/Models/Datas/SettingsDatas/ThemeSetting.cs rename to BadMC_Launcher/Models/Data/SettingsDatas/ThemeSetting.cs index 2d0b427..0e93a14 100644 --- a/BadMC_Launcher/Models/Datas/SettingsDatas/ThemeSetting.cs +++ b/BadMC_Launcher/Models/Data/SettingsDatas/ThemeSetting.cs @@ -5,7 +5,7 @@ using System.Threading.Tasks; using BadMC_Launcher.Models.Enums; -namespace BadMC_Launcher.Models.Datas.SettingsDatas; +namespace BadMC_Launcher.Models.Data.SettingsData; internal static class ThemeSetting { internal static BackgroundTypeEnum backgroundType = BackgroundTypeEnum.StaticImage; diff --git a/BadMC_Launcher/Models/Datas/ViewDatas/MainSideBarData.cs b/BadMC_Launcher/Models/Data/ViewDatas/MainSideBarData.cs similarity index 93% rename from BadMC_Launcher/Models/Datas/ViewDatas/MainSideBarData.cs rename to BadMC_Launcher/Models/Data/ViewDatas/MainSideBarData.cs index 7b2ca1e..72c0e63 100644 --- a/BadMC_Launcher/Models/Datas/ViewDatas/MainSideBarData.cs +++ b/BadMC_Launcher/Models/Data/ViewDatas/MainSideBarData.cs @@ -9,7 +9,7 @@ using BadMC_Launcher.Extensions; using BadMC_Launcher.Interfaces; -namespace BadMC_Launcher.Models.Datas.ViewDatas; +namespace BadMC_Launcher.Models.Data.ViewData; internal static class MainSideBarData { internal static DistinctiveItemBindingList MainSideBarItems { get; set; } = new(); diff --git a/BadMC_Launcher/Models/Datas/ViewDatas/SettingsData.cs b/BadMC_Launcher/Models/Data/ViewDatas/SettingsData.cs similarity index 90% rename from BadMC_Launcher/Models/Datas/ViewDatas/SettingsData.cs rename to BadMC_Launcher/Models/Data/ViewDatas/SettingsData.cs index 9912d52..9833552 100644 --- a/BadMC_Launcher/Models/Datas/ViewDatas/SettingsData.cs +++ b/BadMC_Launcher/Models/Data/ViewDatas/SettingsData.cs @@ -7,7 +7,7 @@ using BadMC_Launcher.Controls; -namespace BadMC_Launcher.Models.Datas.ViewDatas; +namespace BadMC_Launcher.Models.Data.ViewData; internal static class SettingsData { internal static DistinctiveItemBindingList SettingsSideBarItems { get; set; } = new(); diff --git a/BadMC_Launcher/Models/Datas/Mappings/UpdateMapping.cs b/BadMC_Launcher/Models/Datas/Mappings/UpdateMapping.cs deleted file mode 100644 index 96de5bf..0000000 --- a/BadMC_Launcher/Models/Datas/Mappings/UpdateMapping.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace BadMC_Launcher.Models.Datas.Mappings; -public static class UpdateMapping { - public readonly static Dictionary MinecraftConfig = new() { - { "OwO", "MinecraftFolderId" } - }; -} diff --git a/BadMC_Launcher/Models/Enums/IndependencyCoreEnum.cs b/BadMC_Launcher/Models/Enums/IndependencyCoreEnum.cs new file mode 100644 index 0000000..32da6da --- /dev/null +++ b/BadMC_Launcher/Models/Enums/IndependencyCoreEnum.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BadMC_Launcher.Models.Enums; +public enum IndependencyCoreEnum { + All, + ModLoader, + AllLoader, + AllNotRelease, + Disabled +} diff --git a/BadMC_Launcher/Models/Enums/MessengerTokenEnum.cs b/BadMC_Launcher/Models/Enums/MessengerTokenEnum.cs index c0818c4..6a79123 100644 --- a/BadMC_Launcher/Models/Enums/MessengerTokenEnum.cs +++ b/BadMC_Launcher/Models/Enums/MessengerTokenEnum.cs @@ -20,3 +20,5 @@ public enum MinecraftFolderContentDialogMessengerTokenEnum { HideRenameFlyoutToken, ShowRenameFlyoutToken } + + diff --git a/BadMC_Launcher/Services/AppAssetsService.cs b/BadMC_Launcher/Services/AppAssetsService.cs index 4e1a542..ae3cdca 100644 --- a/BadMC_Launcher/Services/AppAssetsService.cs +++ b/BadMC_Launcher/Services/AppAssetsService.cs @@ -19,5 +19,5 @@ public AppAssetsService() { } } - public Dictionary>> MinecraftImageInstance { get; init; } = new(); + public Dictionary>> MinecraftImageInstance { get; } = new(); } diff --git a/BadMC_Launcher/Services/FileService.cs b/BadMC_Launcher/Services/FileService.cs index 60dd64a..dfd5f21 100644 --- a/BadMC_Launcher/Services/FileService.cs +++ b/BadMC_Launcher/Services/FileService.cs @@ -1,50 +1,103 @@ using System.ComponentModel; using System.Reflection; +using System.Runtime.InteropServices; using System.Security; using System.Text.Encodings.Web; using System.Text.Json; using System.Text.Json.Nodes; using System.Text.Json.Serialization; using System.Text.Json.Serialization.Metadata; -using BadMC_Launcher.Models.Datas; -using BadMC_Launcher.Models.Datas.Mappings; +using BadMC_Launcher.Models.Data; +using BadMC_Launcher.Models.Data.Mappings; using Microsoft.UI.Xaml.Controls; using MinecraftLaunch.Extensions; +using Uno.UI.Helpers; namespace BadMC_Launcher.Services; public class FileService { - public bool CheckFolderAndFile(string path, bool isCheckFile) { - if (isCheckFile ? File.Exists(path) : Path.Exists(path)) { - return true; - } - else { - try { - if (isCheckFile) { - var directory = Path.GetDirectoryName(path); - if (directory != null) { - Directory.CreateDirectory(directory); - } - using (File.Create(path)) { - return true; + private readonly bool isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); + private readonly HashSet WindowsPathReservedNames = new HashSet(StringComparer.OrdinalIgnoreCase) + { + "CON", "PRN", "AUX", "NUL", + "COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9", + "LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9" + }; + + /// + /// Check if the file path is valid. + /// + /// The path of the string to be checked. + /// If enabled, the path is additionally checked to see if it points to a valid file. + /// Returns true if the path is valid and absolute. + public bool CheckPath(string path, bool isCheckPathPointing) { + try { + // Segment path + var parts = path.Split([Path.DirectorySeparatorChar, + Path.AltDirectorySeparatorChar], + StringSplitOptions.RemoveEmptyEntries); + + if (IsPathInvalid(path)) { + return false; + } + + foreach (var part in parts) { + if (isWindows) { + // Check is has invalid chars or Name + if (part.EndsWith('.') || + part.EndsWith(' ') || + WindowsPathReservedNames.Contains(Path.GetFileNameWithoutExtension(part))) { + return false; } } else { - Directory.CreateDirectory(path); - return true; + if (part.StartsWith('-')) { + return false; + } } } - catch (Exception ex) { - if (!ShowErrorToast(ex)) { - throw; - } + if (isCheckPathPointing) { + return Path.Exists(path); } } + catch (Exception ex) { + ShowErrorToast(ex); + } return false; } - public bool ReadConfig(string filePath, JsonTypeInfo jsonTypeInfo, out T? returnValue, Dictionary? updateMapping = null) { - if (CheckFolderAndFile(filePath, true)) { + /// + /// Basic path checking (not recommended) + /// + /// The path of the string to be checked. + /// Returns true if the path is valid and absolute. + public bool IsPathInvalid(string path) { + var rootPath = Path.GetPathRoot(path); + // Check chars is ASCII. + return path.Any(char.IsControl) + // Check string is empty or path has invalid path char. + || string.IsNullOrWhiteSpace(path) + || path.IndexOfAny(Path.GetInvalidPathChars()) >= 0 + || !Path.IsPathFullyQualified(path) + //Check is not ready drive path. + || ( rootPath != null && !new DriveInfo(rootPath).IsReady ) + // Check is too long or device path. + || ( isWindows && ( path.Length > 260 + || path.StartsWith(@"\\.\") + || path.StartsWith(@"\\?\") ) ); + } + + /// + /// Tries to read a json file and deserialize it to the specified class. + /// + /// Valid json file paths + /// Contains information about the class to be deserialized. + /// If deserialization is successful, return the deserialized class, if not, return the default value of the class (never use the default value!) + /// If a property name is changed after an update, the incorrect property name can be mapped to the correct property name by mapping. + /// If an update results in a change in the type of an attribute value, the incorrect attribute value type can be mapped to the correct attribute value type through mapping. + /// Returns a boolean indicating whether the Json file was deserialized successfully. + public bool TryReadConfig(string filePath, JsonTypeInfo jsonTypeInfo, out T? returnValue, Dictionary? propertyNameMapping = null, Dictionary>? propertyValueTypeMapping = null) { + if (CheckPath(filePath, true)) { try { var fileValue = File.ReadAllText(filePath); if (!string.IsNullOrWhiteSpace(fileValue)) { @@ -55,8 +108,8 @@ public bool ReadConfig(string filePath, JsonTypeInfo jsonTypeInfo, out T? catch (Exception ex) { switch (ex) { case JsonException: - if (updateMapping != null && TryReadConfigWithMappings(filePath, jsonTypeInfo, updateMapping)) { - ReadConfig(filePath, jsonTypeInfo, out _, updateMapping); + if (TryChangeConfigWithMappings(filePath, jsonTypeInfo, propertyNameMapping, propertyValueTypeMapping)) { + TryReadConfig(filePath, jsonTypeInfo, out _, propertyNameMapping, propertyValueTypeMapping); } else { //TODO: Dialog @@ -74,8 +127,14 @@ public bool ReadConfig(string filePath, JsonTypeInfo jsonTypeInfo, out T? return false; } - public bool ReadConfigToJsonElement(string filePath, out JsonElement? returnValue) { - if (CheckFolderAndFile(filePath, true)) { + /// + /// Tries to read a Json file from a valid path and returns a JsonElement type. + /// + /// Valid json file paths + /// If the deserialization succeeds, return a usable JsonElement instance, if it doesn't, return the default value of the JsonElement (never use the default value!) + /// Returns a boolean value indicating whether the Json file was read successfully. + public bool TryReadConfigToJsonElement(string filePath, out JsonElement? returnValue) { + if (CheckPath(filePath, true)) { try { var fileValue = File.ReadAllText(filePath); if (!string.IsNullOrWhiteSpace(fileValue)) { @@ -88,17 +147,21 @@ public bool ReadConfigToJsonElement(string filePath, out JsonElement? returnValu } catch (Exception ex) { - if(!ShowErrorToast(ex)) { - throw; - } + ShowErrorToast(ex); } } returnValue = default; return false; } + /// + /// Serialize a class into a Json file. + /// + /// Valid json file paths + /// Contains information about the class to be serialized. + /// Returns a boolean value indicating whether the class has been properly serialized into the Json file. public bool WriteConfig(string filePath, JsonTypeInfo jsonTypeInfo, T value) { - if (CheckFolderAndFile(filePath, true)) { + if (CheckPath(filePath, true)) { try { var jsonValue = value.Serialize(jsonTypeInfo); File.WriteAllText(filePath, jsonValue); @@ -106,16 +169,28 @@ public bool WriteConfig(string filePath, JsonTypeInfo jsonTypeInfo, T valu } catch (Exception ex) { if (!ShowErrorToast(ex)) { - throw; + // TODO: Dialog } } } return false; } - public bool TryReadConfigWithMappings(string filePath, JsonTypeInfo jsonTypeInfo, Dictionary updateMapping) { + /// + /// Try to update the Json file using the mapping table. (You must provide the propertyNameMapping or valueTypeMapping parameter to use this). + /// + /// Valid json file paths + /// Contains information about the class to be deserialized. + /// If a property name is changed after an update, the incorrect property name can be mapped to the correct property name by mapping. + /// If an update results in a change in the type of an attribute value, the incorrect attribute value type can be mapped to the correct attribute value type through mapping. + /// This exception is thrown when both propertyNameMapping and propertyValueTypeMapping are null. + /// Returns a boolean indicating whether the wrong Json field was found and modified and serialized back into the Json file. + public bool TryChangeConfigWithMappings(string filePath, JsonTypeInfo jsonTypeInfo, Dictionary? propertyNameMapping, Dictionary>? propertyValueTypeMapping) { + if (propertyNameMapping == null && propertyValueTypeMapping == null) { + throw new ArgumentNullException($"{nameof(propertyNameMapping)}, {nameof(propertyValueTypeMapping)}", "propertyNameMapping and valueTypeMapping cannot both be null."); + } try { - if (CheckFolderAndFile(filePath, true)) { + if (CheckPath(filePath, true)) { var content = File.ReadAllText(filePath); if (string.IsNullOrWhiteSpace(content)) { @@ -126,7 +201,7 @@ public bool TryReadConfigWithMappings(string filePath, JsonTypeInfo jsonTy JsonObject? root = JsonObject.Create(doc.RootElement); if (root == null) return false; - bool modified = ProcessJsonNode(root, updateMapping); + bool modified = ProcessJsonNode(root, propertyNameMapping, propertyValueTypeMapping); if (modified) { File.WriteAllText(filePath, root.ToJsonString(new() { WriteIndented = true })); @@ -135,75 +210,92 @@ public bool TryReadConfigWithMappings(string filePath, JsonTypeInfo jsonTy } } catch(Exception ex) { - if (!ShowErrorToast(ex)) { - throw; - } + ShowErrorToast(ex); } return false; } - public bool TryOpenFolderFromPath(string path) { + /// + /// Try using your system's file manager to open the folder or file pointed to by the path. + /// + /// Valid json file paths + /// Returns a value indicating whether the folder or file has been opened. + public bool TryOpenFolderOrFileFromPath(string path) { try { - using (Process.Start(new ProcessStartInfo(path) { - UseShellExecute = true, - Verb = "open" - })) { - return true; + if (CheckPath(path, true)) { + using (Process.Start(new ProcessStartInfo(path) { + UseShellExecute = true, + Verb = "open" + })) { + return true; + } } } catch (Exception ex) { switch (ex) { case Win32Exception: - //TODO: Dialog + //TODO: Toast break; case FileNotFoundException: - //TODO: Dialog + //TODO: Toast break; default: - throw; + //TODO: Toast + break; } } return false; } - private bool ProcessJsonNode(JsonNode node, Dictionary updateMapping) { + private bool ProcessJsonNode(JsonNode node, Dictionary? updateMapping, Dictionary>? valueTypeMapping) { var DeleteItems = new Dictionary(); bool isModified = false; + try { + switch (node) { + case JsonObject obj: + // Loop to find nested objects + foreach (var prop in obj.ToList()) { + if (prop.Value != null && ProcessJsonNode(prop.Value, updateMapping, valueTypeMapping)) { + isModified = true; + } - switch (node) { - case JsonObject obj: - // Loop to find nested objects - foreach (var prop in obj.ToList()) { - if (prop.Value != null && ProcessJsonNode(prop.Value, updateMapping)) { - isModified = true; - } - - // Modify the key name to correspond to the mapping - if (prop.Value != null && updateMapping.TryGetValue(prop.Key, out var newKey)) { - if (newKey == "_Delete") { - DeleteItems.Add(prop.Key, prop.Value.ToJsonString(new() { - WriteIndented = true, - Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping - })); + // Modify the key name to correspond to the mapping + if (updateMapping != null && prop.Value != null && updateMapping.TryGetValue(prop.Key, out var newKey)) { + if (newKey == "_Delete") { + DeleteItems.Add(prop.Key, prop.Value.ToJsonString(new() { + WriteIndented = true, + Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping + })); + obj.Remove(prop.Key); + } + else { + obj.Add(newKey, prop.Value.DeepClone()); + obj.Remove(prop.Key); + isModified = true; + } } - else { - obj.Add(newKey, prop.Value.DeepClone()); - obj.Remove(prop.Key); + + // Modify the key value type to correspond to the mapping + if (valueTypeMapping != null && prop.Value != null && valueTypeMapping.TryGetValue(prop.Key, out var newMappingValue)) { + obj[prop.Key] = JsonSerializer.SerializeToNode(newMappingValue(prop.Value)); isModified = true; } } - } - break; - case JsonArray arr: - // 处理数组元素 - for (int i = 0; i < arr.Count; i++) { - if (arr[i] is JsonNode element && ProcessJsonNode(element, updateMapping)) { - // Update Modified - arr[i] = element.DeepClone(); - isModified = true; + break; + case JsonArray arr: + // If Array + for (int i = 0; i < arr.Count; i++) { + if (arr[i] is JsonNode element && ProcessJsonNode(element, updateMapping, valueTypeMapping)) { + // Update Modified + arr[i] = element.DeepClone(); + isModified = true; + } } - } - break; + break; + } + } + catch(Exception ex) { + ShowErrorToast(ex); } // Toast Tip @@ -217,6 +309,9 @@ private bool ShowErrorToast(Exception ex) { case SecurityException: //TODO break; + case ArgumentException: + //TODO + break; case UnauthorizedAccessException: //TODO break; @@ -226,7 +321,11 @@ private bool ShowErrorToast(Exception ex) { case IOException: //TODO break; + case NotSupportedException: + //TODO + break; default: + //TODO return false; } return true; diff --git a/BadMC_Launcher/Services/Settings/MinecraftConfigService.cs b/BadMC_Launcher/Services/Settings/MinecraftConfigService.cs index 58d34f3..73e4415 100644 --- a/BadMC_Launcher/Services/Settings/MinecraftConfigService.cs +++ b/BadMC_Launcher/Services/Settings/MinecraftConfigService.cs @@ -1,20 +1,16 @@ using System.ComponentModel; -using System.Linq; using System.Text.Json.Serialization; using BadMC_Launcher.Classes; using BadMC_Launcher.Controls.Minecraft; -using BadMC_Launcher.Models.Datas; -using BadMC_Launcher.Models.Datas.Mappings; -using BadMC_Launcher.Models.Datas.SettingsDatas; +using BadMC_Launcher.Models.Data; +using BadMC_Launcher.Models.Data.Mappings; +using BadMC_Launcher.Models.Data.SettingsData; +using BadMC_Launcher.Models.Enums; using MinecraftLaunch.Base.Models.Authentication; -using MinecraftLaunch.Base.Models.Game; -using Newtonsoft.Json.Linq; -using Uno.Extensions; -using Uno.Extensions.Specialized; namespace BadMC_Launcher.Services.Settings; public class MinecraftConfigService : ConfigClass { - internal bool isSyncEnabled = false; + internal bool IsSyncEnabled = false; public MinecraftConfigService() { //Triggers an event when a property is changed @@ -27,11 +23,13 @@ public MinecraftConfigService() { public DistinctiveItemBindingList MinecraftAccounts { get => MinecraftConfig.minecraftAccounts; set { - MinecraftConfig.minecraftAccounts.Clear(); - MinecraftConfig.minecraftAccounts.MargeItems(value); + if (!MinecraftConfig.minecraftAccounts.SequenceEqual(value)) { + MinecraftConfig.minecraftAccounts.Clear(); + MinecraftConfig.minecraftAccounts.MargeItems(value); - // Write to Json - SyncSettingSet(); + // Write to Json + SyncSettingSet(); + } } } public DistinctiveItemBindingList JavaPaths { @@ -47,11 +45,13 @@ public DistinctiveItemBindingList JavaPaths { return MinecraftConfig.javaPaths; } set { - MinecraftConfig.javaPaths.Clear(); - MinecraftConfig.javaPaths.MargeItems(value); + if (!MinecraftConfig.javaPaths.SequenceEqual(value)) { + MinecraftConfig.javaPaths.Clear(); + MinecraftConfig.javaPaths.MargeItems(value); - // Write to Json - SyncSettingSet(); + // Write to Json + SyncSettingSet(); + } } } public DistinctiveItemBindingList MinecraftFolders { @@ -67,18 +67,20 @@ public DistinctiveItemBindingList MinecraftFolders { return MinecraftConfig.minecraftFolders; } set { - MinecraftConfig.minecraftFolders.Clear(); - MinecraftConfig.minecraftFolders.MargeItems(value); + if (!MinecraftConfig.minecraftFolders.SequenceEqual(value)) { + MinecraftConfig.minecraftFolders.Clear(); + MinecraftConfig.minecraftFolders.MargeItems(value); - // Write to Json - SyncSettingSet(); + // Write to Json + SyncSettingSet(); + } } } public string? ActiveJavaPath { get => MinecraftConfig.activeJavaPath; set { - // CHeck folder is exists + // Check folder is existing if (!Path.Exists(value)) { MinecraftConfig.activeJavaPath = string.Empty; // TODO: Tip Toast @@ -98,7 +100,7 @@ public string? ActiveJavaPath { public string? ActiveMinecraftFolderPath { get => MinecraftConfig.activeMinecraftFolder; set { - // CHeck folder is exists + // Check folder is existing if (!Path.Exists(value)) { MinecraftConfig.activeMinecraftFolder = string.Empty; // TODO: Tip Toast @@ -118,119 +120,154 @@ public string? ActiveMinecraftFolderPath { public Account? ActiveMinecraftAccount { get => MinecraftConfig.activeMinecraftAccount; set { - MinecraftConfig.activeMinecraftAccount = value; + if (MinecraftConfig.activeMinecraftAccount != value) { + MinecraftConfig.activeMinecraftAccount = value; - // Trigger Event - OnPropertyChanged(nameof(ActiveMinecraftAccount)); + // Trigger Event + OnPropertyChanged(nameof(ActiveMinecraftAccount)); - //Write to Json - SyncSettingSet(); + // Write to Json + SyncSettingSet(); + } } } public bool IsAutoJavaEnabled { get => MinecraftConfig.isAutoJavaEnabled; set { - MinecraftConfig.isAutoJavaEnabled = value; + if (MinecraftConfig.isAutoJavaEnabled != value) { + MinecraftConfig.isAutoJavaEnabled = value; - // Trigger Event - OnPropertyChanged(nameof(IsAutoJavaEnabled)); + // Trigger Event + OnPropertyChanged(nameof(IsAutoJavaEnabled)); - //Write to Json - SyncSettingSet(); + // Write to Json + SyncSettingSet(); + } } } public bool IsFullscreen { get => MinecraftConfig.isFullscreen; set { - MinecraftConfig.isFullscreen = value; + if (MinecraftConfig.isFullscreen != value) { + MinecraftConfig.isFullscreen = value; - // Trigger Event - OnPropertyChanged(nameof(JavaPaths)); + // Trigger Event + OnPropertyChanged(nameof(IsFullscreen)); - //Write to Json - SyncSettingSet(); + // Write to Json + SyncSettingSet(); + } } } - public bool IsEnableIndependencyCore { - get => MinecraftConfig.isEnableIndependencyCore; + public IndependencyCoreEnum IndependencyCore { + get => MinecraftConfig.independencyCore; set { - MinecraftConfig.isEnableIndependencyCore = value; + if (MinecraftConfig.independencyCore != value) { + MinecraftConfig.independencyCore = value; - // Trigger Event - OnPropertyChanged(nameof(IsEnableIndependencyCore)); + // Trigger Event + OnPropertyChanged(nameof(IndependencyCore)); - //Write to Json - SyncSettingSet(); + //Write to Json + SyncSettingSet(); + } } } public bool IsAutoMemorySize { get => MinecraftConfig.isAutoMemorySize; set { - MinecraftConfig.isAutoMemorySize = value; + if (MinecraftConfig.isAutoMemorySize != value) { + MinecraftConfig.isAutoMemorySize = value; - // Trigger Event - OnPropertyChanged(nameof(IsAutoMemorySize)); + // Trigger Event + OnPropertyChanged(nameof(IsAutoMemorySize)); - //Write to Json - SyncSettingSet(); + //Write to Json + SyncSettingSet(); + } } } - public int MinMemorySize { - get => MinecraftConfig.minMemorySize; + public uint MaxGameMemory { + get => MinecraftConfig.maxGameMemory; set { - MinecraftConfig.minMemorySize = value; + if (MinecraftConfig.maxGameMemory != value) { + // Check max game memory + AppParameters.SystemInfo.RefreshMemoryStatus(); + if (value == 0 || value > AppParameters.SystemInfo.MemoryStatus.TotalPhysical.BytesToMb() || value <= MinecraftConfig.minGameMemory) { + // TODO: Toast Tips + OnPropertyChanged(nameof(MaxGameMemory)); + return; + } - // Trigger Event - OnPropertyChanged(nameof(MinMemorySize)); + MinecraftConfig.maxGameMemory = value; - //Write to Json - SyncSettingSet(); + // Trigger Event + OnPropertyChanged(nameof(MaxGameMemory)); + + //Write to Json + SyncSettingSet(); + } } } - public int MaxMemorySize { - get => MinecraftConfig.maxMemorySize; + public uint MinGameMemory { + get => MinecraftConfig.minGameMemory; set { - MinecraftConfig.maxMemorySize = value; + if (MinecraftConfig.minGameMemory != value) { + // Check min game memory + AppParameters.SystemInfo.RefreshMemoryStatus(); + if (value == 0 || value > AppParameters.SystemInfo.MemoryStatus.TotalPhysical.BytesToMb() || value >= MinecraftConfig.maxGameMemory) { + // TODO: Toast Tips + OnPropertyChanged(nameof(MinGameMemory)); + return; + } - // Trigger Event - OnPropertyChanged(nameof(MaxMemorySize)); + MinecraftConfig.minGameMemory = value; - //Write to Json - SyncSettingSet(); + // Trigger Event + OnPropertyChanged(nameof(MinGameMemory)); + + //Write to Json + SyncSettingSet(); + + } } } public string? LauncherName { get => MinecraftConfig.launcherName; set { - MinecraftConfig.launcherName = value; + if (MinecraftConfig.launcherName != value) { + MinecraftConfig.launcherName = value; - // Trigger Event - OnPropertyChanged(nameof(LauncherName)); + // Trigger Event + OnPropertyChanged(nameof(LauncherName)); - //Write to Json - SyncSettingSet(); + //Write to Json + SyncSettingSet(); + } } } public BindingList JvmArguments { get => MinecraftConfig.jvmArguments; set { - MinecraftConfig.jvmArguments.RaiseListChangedEvents = false; + if (!MinecraftConfig.jvmArguments.SequenceEqual(value)) { + MinecraftConfig.jvmArguments.RaiseListChangedEvents = false; - MinecraftConfig.jvmArguments.Clear(); - MinecraftConfig.jvmArguments.AddRange(value); + MinecraftConfig.jvmArguments.Clear(); + MinecraftConfig.jvmArguments.AddRange(value); - MinecraftConfig.jvmArguments.RaiseListChangedEvents = true; + MinecraftConfig.jvmArguments.RaiseListChangedEvents = true; - // Write to Json - SyncSettingSet(); + // Write to Json + SyncSettingSet(); + } } } @@ -238,17 +275,17 @@ private void OnListChanged(object? sender, ListChangedEventArgs e) { if (sender is DistinctiveItemBindingList senderList && !string.IsNullOrWhiteSpace(senderList.PropertyName)) { switch (senderList.PropertyName) { case nameof(MinecraftFolders): - if (!MinecraftFolders.Any(item => item.MinecraftFolderPath == ActiveMinecraftFolderPath) && !string.IsNullOrWhiteSpace(ActiveMinecraftFolderPath)) { + if (MinecraftFolders.All(item => item.MinecraftFolderPath != ActiveMinecraftFolderPath) && !string.IsNullOrWhiteSpace(ActiveMinecraftFolderPath)) { ActiveMinecraftFolderPath = string.Empty; } break; case nameof(JavaPaths): - if (!JavaPaths.Any(item => item == ActiveJavaPath) && !string.IsNullOrWhiteSpace(ActiveJavaPath)) { + if (JavaPaths.All(item => item != ActiveJavaPath) && !string.IsNullOrWhiteSpace(ActiveJavaPath)) { ActiveJavaPath = string.Empty; } break; case nameof(MinecraftAccounts): - if (!MinecraftAccounts.Any(item => item.Uuid == ActiveMinecraftAccount?.Uuid) && ActiveMinecraftAccount != null) { + if (MinecraftAccounts.All(item => item.Uuid != ActiveMinecraftAccount?.Uuid) && ActiveMinecraftAccount != null) { ActiveMinecraftAccount = null; } break; @@ -264,17 +301,17 @@ private void OnListChanged(object? sender, ListChangedEventArgs e) { } public override bool SyncSettingGet() { - if (App.GetService().ReadConfig(Path.Combine(AppDataPath.ConfigsPath, "MinecraftConfigs.json"), MinecraftConfigServiceContext.Default.MinecraftConfigService, out var jsonClass, UpdateMapping.MinecraftConfig) && jsonClass != null) { + if (App.GetService().TryReadConfig(Path.Combine(AppDataPath.ConfigsPath, "MinecraftConfigs.json"), MinecraftConfigServiceContext.Default.MinecraftConfigService, out var jsonClass, UpdateMapping.minecraftConfigPropertyNameMapping, UpdateMapping.minecraftConfigPropertyTypeMapping) && jsonClass != null) { //TODO: 解蜜 MinecraftConfig.activeJavaPath = jsonClass.ActiveJavaPath; MinecraftConfig.activeMinecraftFolder = jsonClass.ActiveMinecraftFolderPath; //MinecraftConfig.activeMinecraftAccount = jsonClass.ActiveMinecraftAccount; MinecraftConfig.isAutoJavaEnabled = jsonClass.IsAutoJavaEnabled; MinecraftConfig.isFullscreen = jsonClass.IsFullscreen; - MinecraftConfig.isEnableIndependencyCore = jsonClass.IsEnableIndependencyCore; + MinecraftConfig.independencyCore = jsonClass.IndependencyCore; MinecraftConfig.isAutoMemorySize = jsonClass.IsAutoMemorySize; - MinecraftConfig.minMemorySize = jsonClass.MinMemorySize; - MinecraftConfig.maxMemorySize = jsonClass.MaxMemorySize; + MinecraftConfig.minGameMemory = jsonClass.MinGameMemory; + MinecraftConfig.maxGameMemory = jsonClass.MaxGameMemory; MinecraftConfig.launcherName = jsonClass.LauncherName; return true; @@ -283,7 +320,7 @@ public override bool SyncSettingGet() { } public override bool SyncSettingSet() { - if (isSyncEnabled == false) { + if (IsSyncEnabled == false) { return false; } MinecraftConfigService classValue = this; diff --git a/BadMC_Launcher/Services/Settings/SingleMinecraftConfigService.cs b/BadMC_Launcher/Services/Settings/SingleMinecraftConfigService.cs index 8125a43..778c505 100644 --- a/BadMC_Launcher/Services/Settings/SingleMinecraftConfigService.cs +++ b/BadMC_Launcher/Services/Settings/SingleMinecraftConfigService.cs @@ -8,12 +8,12 @@ using System.Threading.Tasks; using BadMC_Launcher.Classes; using BadMC_Launcher.Extensions; -using BadMC_Launcher.Models.Datas.SettingsDatas; +using BadMC_Launcher.Models.Data.SettingsData; using MinecraftLaunch.Base.Models.Game; namespace BadMC_Launcher.Services.Settings; public class SingleMinecraftConfigService : ConfigClass { - private SingleMinecraftConfig singleMinecraftConfigInstance = new(); + private readonly SingleMinecraftConfig singleMinecraftConfigInstance = new(); public SingleMinecraftConfigService() { JvmArguments.ListChanged += OnListChanged; @@ -22,132 +22,152 @@ public SingleMinecraftConfigService() { public string? TargetMinecraftEntryPath { get => singleMinecraftConfigInstance.targetMinecraftEntryPath; set { - singleMinecraftConfigInstance.targetMinecraftEntryPath = value; + if (singleMinecraftConfigInstance.targetMinecraftEntryPath != value) { + singleMinecraftConfigInstance.targetMinecraftEntryPath = value; - // Trigger Event - OnPropertyChanged(nameof(TargetMinecraftEntryPath)); + // Trigger Event + OnPropertyChanged(nameof(TargetMinecraftEntryPath)); - //Write to Json or other logic - SyncSettingSet(); + // Write to Json or other logic + SyncSettingSet(); + } } } - public bool IsAutoJavaEnabled { + public bool? IsAutoJavaEnabled { get => singleMinecraftConfigInstance.isAutoJavaEnabled; set { - singleMinecraftConfigInstance.isAutoJavaEnabled = value; + if (singleMinecraftConfigInstance.isAutoJavaEnabled != value) { + singleMinecraftConfigInstance.isAutoJavaEnabled = value; - // Trigger Event - OnPropertyChanged(nameof(IsAutoJavaEnabled)); + // Trigger Event + OnPropertyChanged(nameof(IsAutoJavaEnabled)); - //Write to Json - SyncSettingSet(); + // Write to Json + SyncSettingSet(); + } } } public bool? IsFullscreen { get => singleMinecraftConfigInstance.isFullscreen; set { - singleMinecraftConfigInstance.isFullscreen = value; + if (singleMinecraftConfigInstance.isFullscreen != value) { + singleMinecraftConfigInstance.isFullscreen = value; - // Trigger Event - OnPropertyChanged(nameof(IsFullscreen)); + // Trigger Event + OnPropertyChanged(nameof(IsFullscreen)); - //Write to Json - SyncSettingSet(); + // Write to Json + SyncSettingSet(); + } } } public bool? IsEnableIndependencyCore { get => singleMinecraftConfigInstance.isEnableIndependencyCore; set { - singleMinecraftConfigInstance.isEnableIndependencyCore = value; + if (singleMinecraftConfigInstance.isEnableIndependencyCore != value) { + singleMinecraftConfigInstance.isEnableIndependencyCore = value; - // Trigger Event - OnPropertyChanged(nameof(IsEnableIndependencyCore)); + // Trigger Event + OnPropertyChanged(nameof(IsEnableIndependencyCore)); - //Write to Json - SyncSettingSet(); + // Write to Json + SyncSettingSet(); + } } } public bool? IsAutoMemorySize { get => singleMinecraftConfigInstance.isAutoMemorySize; set { - singleMinecraftConfigInstance.isAutoMemorySize = value; + if (singleMinecraftConfigInstance.isAutoMemorySize != value) { + singleMinecraftConfigInstance.isAutoMemorySize = value; - // Trigger Event - OnPropertyChanged(nameof(IsAutoMemorySize)); + // Trigger Event + OnPropertyChanged(nameof(IsAutoMemorySize)); - //Write to Json - SyncSettingSet(); + // Write to Json + SyncSettingSet(); + } } } - public int? MinMemorySize { - get => singleMinecraftConfigInstance.minMemorySize; + public uint? MaxMemorySize { + get => singleMinecraftConfigInstance.maxMemorySize; set { - singleMinecraftConfigInstance.minMemorySize = value; + if (singleMinecraftConfigInstance.maxMemorySize != value) { + singleMinecraftConfigInstance.maxMemorySize = value; - // Trigger Event - OnPropertyChanged(nameof(MinMemorySize)); + // Trigger Event + OnPropertyChanged(nameof(MaxMemorySize)); - //Write to Json - SyncSettingSet(); + // Write to Json + SyncSettingSet(); + } } } - public int? MaxMemorySize { - get => singleMinecraftConfigInstance.maxMemorySize; + public uint? MinMemorySize { + get => singleMinecraftConfigInstance.minMemorySize; set { - singleMinecraftConfigInstance.maxMemorySize = value; + if (singleMinecraftConfigInstance.minMemorySize != value) { + singleMinecraftConfigInstance.minMemorySize = value; - // Trigger Event - OnPropertyChanged(nameof(MaxMemorySize)); + // Trigger Event + OnPropertyChanged(nameof(MinMemorySize)); - //Write to Json - SyncSettingSet(); + // Write to Json + SyncSettingSet(); + } } } - public JavaEntry? JavaPath { + public string? JavaPath { get => singleMinecraftConfigInstance.javaPath; set { - singleMinecraftConfigInstance.javaPath = value; + if (singleMinecraftConfigInstance.javaPath != value) { + singleMinecraftConfigInstance.javaPath = value; - // Trigger Event - OnPropertyChanged(nameof(JavaPath)); + // Trigger Event + OnPropertyChanged(nameof(JavaPath)); - //Write to Json - SyncSettingSet(); + // Write to Json + SyncSettingSet(); + } } } public string? LauncherName { get => singleMinecraftConfigInstance.launcherName; set { - singleMinecraftConfigInstance.launcherName = value; + if (singleMinecraftConfigInstance.launcherName != value) { + singleMinecraftConfigInstance.launcherName = value; - // Trigger Event - OnPropertyChanged(nameof(LauncherName)); + // Trigger Event + OnPropertyChanged(nameof(LauncherName)); - //Write to Json - SyncSettingSet(); + // Write to Json + SyncSettingSet(); + } } } public BindingList JvmArguments { get => singleMinecraftConfigInstance.jvmArguments; set { - singleMinecraftConfigInstance.jvmArguments.RaiseListChangedEvents = false; + if (!singleMinecraftConfigInstance.jvmArguments.SequenceEqual(value)) { + singleMinecraftConfigInstance.jvmArguments.RaiseListChangedEvents = false; - singleMinecraftConfigInstance.jvmArguments.Clear(); - singleMinecraftConfigInstance.jvmArguments.AddRange(value); + singleMinecraftConfigInstance.jvmArguments.Clear(); + singleMinecraftConfigInstance.jvmArguments.AddRange(value); - singleMinecraftConfigInstance.jvmArguments.RaiseListChangedEvents = true; + singleMinecraftConfigInstance.jvmArguments.RaiseListChangedEvents = true; - // Write to Json - SyncSettingSet(); + // Write to Json + SyncSettingSet(); + } } } @@ -161,7 +181,7 @@ private void OnListChanged(object? sender, ListChangedEventArgs e) { public override bool SyncSettingGet() { if(TargetMinecraftEntryPath != null && File.Exists(Path.Combine(TargetMinecraftEntryPath, @"BadBCConfigs\MinecraftConfig.json")) - && App.GetService().ReadConfig(Path.Combine(TargetMinecraftEntryPath, @"BadBCConfigs\MinecraftConfig.json"), SingleMinecraftConfigServiceContext.Default.SingleMinecraftConfigService, out var jsonClass) && jsonClass != null) { + && App.GetService().TryReadConfig(Path.Combine(TargetMinecraftEntryPath, @"BadBCConfigs\MinecraftConfig.json"), SingleMinecraftConfigServiceContext.Default.SingleMinecraftConfigService, out var jsonClass) && jsonClass != null) { singleMinecraftConfigInstance.isFullscreen = jsonClass.IsFullscreen; singleMinecraftConfigInstance.isEnableIndependencyCore = jsonClass.IsEnableIndependencyCore; singleMinecraftConfigInstance.isAutoMemorySize = jsonClass.IsAutoMemorySize; diff --git a/BadMC_Launcher/Services/Settings/ThemeSettingService.cs b/BadMC_Launcher/Services/Settings/ThemeSettingService.cs index 891e431..65936ca 100644 --- a/BadMC_Launcher/Services/Settings/ThemeSettingService.cs +++ b/BadMC_Launcher/Services/Settings/ThemeSettingService.cs @@ -7,8 +7,8 @@ using System.Text.Json; using System.Text.Json.Serialization; using BadMC_Launcher.Classes; -using BadMC_Launcher.Models.Datas; -using BadMC_Launcher.Models.Datas.SettingsDatas; +using BadMC_Launcher.Models.Data; +using BadMC_Launcher.Models.Data.SettingsData; using BadMC_Launcher.Models.Enums; using CommunityToolkit.Mvvm.Messaging; using CommunityToolkit.Mvvm.Messaging.Messages; @@ -21,90 +21,102 @@ public class ThemeSettingService : ConfigClass { public BackgroundTypeEnum BackgroundType { get => ThemeSetting.backgroundType; set { - ThemeSetting.backgroundType = value; + if (ThemeSetting.backgroundType != value) { + ThemeSetting.backgroundType = value; - // Trigger Event - OnPropertyChanged(nameof(BackgroundType)); + // Trigger Event + OnPropertyChanged(nameof(BackgroundType)); - // Sync Setting - SyncSettingSet(); + // Sync Setting + SyncSettingSet(); - // Set Background - SetBackground(); + // Set Background + SetBackground(); + } } } public ThemeTypeEnum ThemeType { get => ThemeSetting.themeType; set { - ThemeSetting.themeType = value; + if (ThemeSetting.themeType != value) { + ThemeSetting.themeType = value; - // Trigger Event - OnPropertyChanged(nameof(ThemeType)); + // Trigger Event + OnPropertyChanged(nameof(ThemeType)); - // Sync Setting - SyncSettingSet(); + // Sync Setting + SyncSettingSet(); + } } } public string ImageBackgroundName { get => ThemeSetting.imageBackgroundName; set { - ThemeSetting.imageBackgroundName = value; + if (ThemeSetting.imageBackgroundName != value) { + ThemeSetting.imageBackgroundName = value; - // Trigger Event - OnPropertyChanged(nameof(ImageBackgroundName)); + // Trigger Event + OnPropertyChanged(nameof(ImageBackgroundName)); - // Sync Setting - SyncSettingSet(); + // Sync Setting + SyncSettingSet(); - // Set Background - SetBackground(); + // Set Background + SetBackground(); + } } } public Stretch BackgroundStretch { get => ThemeSetting.backgroundStretch; set { - ThemeSetting.backgroundStretch = value; + if (ThemeSetting.backgroundStretch != value) { + ThemeSetting.backgroundStretch = value; - // Trigger Event - OnPropertyChanged(nameof(BackgroundStretch)); + // Trigger Event + OnPropertyChanged(nameof(BackgroundStretch)); - // Sync Setting - SyncSettingSet(); + // Sync Setting + SyncSettingSet(); - // Set Background - SetBackground(); + // Set Background + SetBackground(); + } } } public string SolidColorBackgroundCode { get => ThemeSetting.solidColorBackgroundCode; set { - ThemeSetting.solidColorBackgroundCode = value; + if (ThemeSetting.solidColorBackgroundCode != value) { + ThemeSetting.solidColorBackgroundCode = value; - // Trigger Event - OnPropertyChanged(nameof(SolidColorBackgroundCode)); + // Trigger Event + OnPropertyChanged(nameof(SolidColorBackgroundCode)); - // Sync Setting - SyncSettingSet(); + // Sync Setting + SyncSettingSet(); - // Set Background - SetBackground(); + // Set Background + SetBackground(); + } } } public string WindowName { get => ThemeSetting.windowName; set { - ThemeSetting.windowName = value; + if (ThemeSetting.windowName != value) { + ThemeSetting.windowName = value; - // Trigger Event - OnPropertyChanged(nameof(WindowName)); + // Trigger Event + OnPropertyChanged(nameof(WindowName)); - // Sync Setting - SyncSettingSet(); + // Sync Setting + SyncSettingSet(); + } } } @@ -113,7 +125,7 @@ public async void SetBackground(Action? backgroundChanged = null) { //TODO: 这应该得从代码介入了,应该得Dialog( return; } - App.GetService().CheckFolderAndFile(Path.Combine(AppDataPath.AssetsPath, "Wallpapers"), false); + App.GetService().CheckPath(Path.Combine(AppDataPath.AssetsPath, "Wallpapers"), false); switch (ThemeSetting.backgroundType) { case BackgroundTypeEnum.SolidColor: var color = ColorTranslator.FromHtml(ThemeSetting.solidColorBackgroundCode); @@ -136,7 +148,7 @@ public async void SetBackground(Action? backgroundChanged = null) { } public override bool SyncSettingGet() { - if (App.GetService().ReadConfig(Path.Combine(AppDataPath.ConfigsPath, @"Settings\ThemeSettings.json"), ThemeSettingServiceContext.Default.ThemeSettingService, out var jsonClass) && jsonClass != null) { + if (App.GetService().TryReadConfig(Path.Combine(AppDataPath.ConfigsPath, @"Settings\ThemeSettings.json"), ThemeSettingServiceContext.Default.ThemeSettingService, out var jsonClass) && jsonClass != null) { ThemeSetting.backgroundType = jsonClass.BackgroundType; ThemeSetting.themeType = jsonClass.ThemeType; ThemeSetting.imageBackgroundName = jsonClass.ImageBackgroundName; diff --git a/BadMC_Launcher/Services/ViewServices/MainSideBarService.cs b/BadMC_Launcher/Services/ViewServices/MainSideBarService.cs index cdb5d97..612765e 100644 --- a/BadMC_Launcher/Services/ViewServices/MainSideBarService.cs +++ b/BadMC_Launcher/Services/ViewServices/MainSideBarService.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -using BadMC_Launcher.Models.Datas.ViewDatas; +using BadMC_Launcher.Models.Data.ViewData; using BadMC_Launcher.ViewModels.Pages; using BadMC_Launcher.Classes; using Microsoft.Windows.ApplicationModel.Resources; diff --git a/BadMC_Launcher/Services/ViewServices/SettingsService.cs b/BadMC_Launcher/Services/ViewServices/SettingsService.cs index c6d160d..429a073 100644 --- a/BadMC_Launcher/Services/ViewServices/SettingsService.cs +++ b/BadMC_Launcher/Services/ViewServices/SettingsService.cs @@ -3,7 +3,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -using BadMC_Launcher.Models.Datas.ViewDatas; +using BadMC_Launcher.Models.Data.ViewData; using BadMC_Launcher.Controls; namespace BadMC_Launcher.Services.ViewServices; diff --git a/BadMC_Launcher/Strings/en-US/Resources.resw b/BadMC_Launcher/Strings/en-US/Resources.resw index 5f20a91..08d78b6 100644 --- a/BadMC_Launcher/Strings/en-US/Resources.resw +++ b/BadMC_Launcher/Strings/en-US/Resources.resw @@ -61,7 +61,7 @@ --> - + @@ -165,7 +165,7 @@ Settings - + Minecraft settings @@ -181,16 +181,10 @@ If something in this setting has been changed in an ontology-specific customizat Management of ontologies and resource storage locations. - - Managing Java Runtime Memory - Setting the Java Runtime for Minecraft Java. - - Java Runtime Memory - - + Set the memory used when running Minecraft Java. @@ -292,31 +286,55 @@ If something in this setting has been changed in an ontology-specific customizat Automatic settings - + It seems something went wrong! (This can't be happening! 😨) - + Minecraft might struggle a lot with this...... 😟 - - This memory size is decent for Minecraft 🙂 + + This memory size is decent for Minecraft. 🙂 - + This memory size is awesome! 😋 - + Damn! You're rich! 😮 - + HUH?????? Σ(っ °Д °;)っ Preview of memory usage - Usage + Usage \ Available Minecraft usage + + Allocating more than total memory may crash Minecraft! 😨 + + + Set Java runtime + + + Wait! This memory might not even run Minecraft! 😰 + + + Minecraft memory usage + + + Set Minecraft runtime memory manually + + + Set Minecraft min & max memory manually (MB) + + + Max (MB) + + + Min (MB) + \ No newline at end of file diff --git a/BadMC_Launcher/Strings/zh-Hans/Resources.resw b/BadMC_Launcher/Strings/zh-Hans/Resources.resw index bf06813..c7d676b 100644 --- a/BadMC_Launcher/Strings/zh-Hans/Resources.resw +++ b/BadMC_Launcher/Strings/zh-Hans/Resources.resw @@ -61,7 +61,7 @@ --> - + @@ -165,7 +165,7 @@ 设置 - + Minecraft 设置 @@ -181,16 +181,16 @@ 对本体以及资源的存储位置进行管理. - - 管理 Java 运行时内存 + + 手动设置 Minecraft 运行时内存 为 Minecraft Java 设置 Java 运行时. - - Java 运行时内存 + + Minecraft 使用内存 - + 设置运行 Minecraft Java 时所使用的内存. @@ -292,31 +292,49 @@ 自动设置 - + 好像哪里出错了! (不可能会这样啊?😨) - + 对于 Minecraft 可能非常吃力...... 😟 - - 这个内存大小对于 Minecraft 来说不错🙂 + + 这个内存大小对于 Minecraft 来说不错. 🙂 - + 这个内存大小很棒! 😋 - + woc! 有钱人! 😮 - + 啊?????? Σ(っ °Д °;)っ 内存预览 - 已使用 + 已使用 \ 可用 - Minecraft 已分配 + Minecraft 最大已分配 + + + 最大已分配超出总内存可能会把 Minecraft 搞崩啊! 😨 + + + 等等! 这内存可能连 Minecraft 都运行不起来吧! 😰 + + + 设置 Java 运行时 + + + 手动设置 Minecraft 最大 & 最小内存 + + + 最大 (MB) + + + 最小 (MB) \ No newline at end of file diff --git a/BadMC_Launcher/ViewModels/ContentDialogs/Settings/JavaContentDialogViewModel.cs b/BadMC_Launcher/ViewModels/ContentDialogs/Settings/JavaContentDialogViewModel.cs index f1a67aa..1ea0088 100644 --- a/BadMC_Launcher/ViewModels/ContentDialogs/Settings/JavaContentDialogViewModel.cs +++ b/BadMC_Launcher/ViewModels/ContentDialogs/Settings/JavaContentDialogViewModel.cs @@ -1,22 +1,11 @@ -using System; -using System.Collections.Generic; using System.ComponentModel; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using BadMC_Launcher.Controls.Minecraft; using BadMC_Launcher.Services.Settings; using CommunityToolkit.Mvvm.Input; -using CommunityToolkit.WinUI; -using Microsoft.UI.Dispatching; -using Microsoft.UI.Xaml.Controls; -using Microsoft.UI.Xaml.Media.Imaging; using MinecraftLaunch.Base.Models.Game; using MinecraftLaunch.Utilities; -using Uno.Extensions; -using Windows.ApplicationModel.Core; using Windows.Storage.Pickers; -using Windows.UI.Core; +using Uno.Extensions.Specialized; using WinRT.Interop; namespace BadMC_Launcher.ViewModels.ContentDialogs.Settings; @@ -33,7 +22,7 @@ public JavaContentDialogViewModel() { IsJavasListLoading = false; // Initialize List - JavasList = new(); + JavasList = []; SetJavaList(); } @@ -58,8 +47,8 @@ private async Task AddJava() { var filePicker = new FileOpenPicker(); // Get window handle - var hwnd = WindowNative.GetWindowHandle(App.Current.MainWindow); - InitializeWithWindow.Initialize(filePicker, hwnd); + var windowHandle = WindowNative.GetWindowHandle(App.Current.MainWindow); + InitializeWithWindow.Initialize(filePicker, windowHandle); if (OperatingSystem.IsWindows()) { filePicker.FileTypeFilter.Add(".exe"); @@ -68,21 +57,24 @@ private async Task AddJava() { // Show file picker dialog var file = await filePicker.PickSingleFileAsync(); - if (file != null && file.DisplayName == "java") { - minecraftConfigService.JavaPaths.Add(file.Path); - return; - } - else if(file != null && file.DisplayName == "javaw") { - var javaFolder = Directory.GetParent(file.Path); + switch (file) { + case { DisplayName: "java" }: + minecraftConfigService.JavaPaths.Add(file.Path); + break; + case { DisplayName: "javaw" }: { + var javaFolder = Directory.GetParent(file.Path); - if (javaFolder != null) { - if (OperatingSystem.IsWindows()) { - minecraftConfigService.JavaPaths.Add(@$"{javaFolder.FullName}\java{file.FileType}"); + if (javaFolder != null) { + if (OperatingSystem.IsWindows()) { + minecraftConfigService.JavaPaths.Add(@$"{javaFolder.FullName}\java{file.FileType}"); + return; + } + + minecraftConfigService.JavaPaths.Add($"{javaFolder.FullName}/java{file.FileType}"); return; } - minecraftConfigService.JavaPaths.Add($"{javaFolder.FullName}/java{file.FileType}"); - return; + break; } } @@ -98,16 +90,13 @@ private void DownloadJava(string parameter) { private async Task SearchJavas() { IAsyncEnumerable? javas = JavaUtil.EnumerableJavaAsync(); if (javas != null) { - var javaList = await Task.Run(async () => { - var list = new List(); - await foreach (var item in javas) { - list.Add(item.JavaPath); - } - return list; - }); + var javaList = await Task.Run(async () => await javas.ToListAsync()); - minecraftConfigService.JavaPaths.MargeItems(javaList); - return; + if (!javaList.All(item => JavasList.Contains(item.JavaPath))) { + JavasList.MargeItems(javaList.Select(item => new JavaViewItem(item))); + minecraftConfigService.JavaPaths.MargeItems(javaList.Select(item => item.JavaPath)); + return; + } } //TODO: Show tip toast @@ -130,17 +119,26 @@ private void ChangeIsAutoJavaEnabled() { [RelayCommand] private void DeleteJava(string parameter) { // Check if parameter is null or empty - if (minecraftConfigService.JavaPaths.Contains(parameter)) { + if (!minecraftConfigService.JavaPaths.Contains(parameter)) { + return; + } + + + var deleteItem = JavasList.FirstOrDefault(item => item.JavaPath == parameter); + if (deleteItem != null) { // Remove Java path - minecraftConfigService.JavaPaths.Remove(parameter); + JavasList.Remove(deleteItem); + minecraftConfigService.JavaPaths.Remove(deleteItem.JavaPath); + // TODO: Toast Tips return; } + // TODO: Toast Tips } [RelayCommand] private void LocalViewJava(string parameter) { - App.GetService().TryOpenFolderFromPath(parameter); + App.GetService().TryOpenFolderOrFileFromPath(parameter); } partial void OnJavasListChanged(ObservableDataList value) { @@ -183,20 +181,18 @@ private async void SetJavaList() { private void JavaList_PropertyChanged(object? sender, PropertyChangedEventArgs e) { switch(e.PropertyName) { case nameof(MinecraftConfigService.JavaPaths): - - // Update Java list - SetJavaList(); + if (!minecraftConfigService.JavaPaths.SequenceEqual(JavasList.Select(item => item.JavaPath))) { + // Update Java list + SetJavaList(); + } break; case nameof(MinecraftConfigService.ActiveJavaPath): - // Update selected index - // TODO: Debug - JavasListSelectedIndex = JavasList.GetIndex(item => item.JavaPath == minecraftConfigService.ActiveJavaPath); + if (minecraftConfigService.ActiveJavaPath != JavasList.ElementAtOrDefault(JavasListSelectedIndex)?.JavaPath) { + // Update selected index + JavasListSelectedIndex = JavasList.GetIndex(item => item.JavaPath == minecraftConfigService.ActiveJavaPath); + } break; } IsJavasListEmpty = !JavasList.Any(); } - - partial void OnIsJavasListLoadingChanged(bool oldValue, bool newValue) { - OnPropertyChanged(nameof(IsJavasListLoading)); - } } diff --git a/BadMC_Launcher/ViewModels/ContentDialogs/Settings/MinecraftFolderContentDialogViewModel.cs b/BadMC_Launcher/ViewModels/ContentDialogs/Settings/MinecraftFolderContentDialogViewModel.cs index 81ad6e0..52ef1f0 100644 --- a/BadMC_Launcher/ViewModels/ContentDialogs/Settings/MinecraftFolderContentDialogViewModel.cs +++ b/BadMC_Launcher/ViewModels/ContentDialogs/Settings/MinecraftFolderContentDialogViewModel.cs @@ -6,16 +6,14 @@ using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Messaging; using CommunityToolkit.Mvvm.Messaging.Messages; -using GEmojiSharp; using Microsoft.UI.Xaml.Input; -using Uno.Extensions.Specialized; using Windows.Storage.Pickers; using Windows.System; using WinRT.Interop; namespace BadMC_Launcher.ViewModels.ContentDialogs.Settings; public partial class MinecraftFolderContentDialogViewModel : ObservableObject { - private MinecraftConfigService minecraftConfigService = App.GetService(); + private readonly MinecraftConfigService minecraftConfigService = App.GetService(); public MinecraftFolderContentDialogViewModel() { MinecraftFoldersList = minecraftConfigService.MinecraftFolders.ToObservableCollection(); @@ -67,7 +65,7 @@ private async Task AddMinecraftFolder() { if (folder != null) { if (minecraftConfigService.MinecraftFolders.Any(item => item.MinecraftFolderPath == folder.Path)) { - //Show tip toast + // TODO: Show tip toast return; } @@ -85,9 +83,9 @@ private async Task AddMinecraftFolder() { [RelayCommand] private void OpenMinecraftFolder() { - if (RenameMinecraftFolderPath != null) { + if (string.IsNullOrWhiteSpace(OldRenameMinecraftFolderId)) { // Open folder - App.GetService().TryOpenFolderFromPath(RenameMinecraftFolderPath); + App.GetService().TryOpenFolderOrFileFromPath(RenameMinecraftFolderPath); } } @@ -104,7 +102,6 @@ private void TryApplyRename(KeyRoutedEventArgs args) { // Hide Flyout HideRenameFlyout(); - return; } } } @@ -122,7 +119,6 @@ private void ApplyRename() { // Hide Flyout HideRenameFlyout(); - return; } } } @@ -150,8 +146,8 @@ private void SetActiveMinecraftFolder(SelectionChangedEventArgs args) { [RelayCommand] private void ViewFolderInLocal(string parameter) { - if (!App.GetService().TryOpenFolderFromPath(parameter)) { - // Toast Tip + if (!App.GetService().TryOpenFolderOrFileFromPath(parameter)) { + // TODO: Toast Tip } } @@ -188,7 +184,7 @@ private ValueChangedMessage SendInvokeFuncMessage(T value, Enum tokenEnum) private bool CanRename() { // Check if text is not empty and not equal to old folder name - if (!string.IsNullOrWhiteSpace(NewRenameMinecraftFolderId) && !minecraftConfigService.MinecraftFolders.Any(item => item.MinecraftFolderId == NewRenameMinecraftFolderId)) { + if (!string.IsNullOrWhiteSpace(NewRenameMinecraftFolderId) && minecraftConfigService.MinecraftFolders.All(item => item.MinecraftFolderId != NewRenameMinecraftFolderId)) { // Set apply button enabled IsCanRename = true; return true; @@ -203,11 +199,15 @@ private void MinecraftConfig_PropertyChanged(object? sender, PropertyChangedEven // Update Property switch (e.PropertyName) { case nameof(MinecraftConfigService.ActiveMinecraftFolderPath): - MinecraftFoldersListSelectedIndex = MinecraftFoldersList.GetIndex(item => item.MinecraftFolderPath == minecraftConfigService.ActiveMinecraftFolderPath); + if (minecraftConfigService.ActiveMinecraftFolderPath != MinecraftFoldersList.ElementAtOrDefault(MinecraftFoldersListSelectedIndex)?.MinecraftFolderPath) { + MinecraftFoldersListSelectedIndex = MinecraftFoldersList.GetIndex(item => item.MinecraftFolderPath == minecraftConfigService.ActiveMinecraftFolderPath); + } break; case nameof(MinecraftConfigService.MinecraftFolders): - MinecraftFoldersList = minecraftConfigService.MinecraftFolders.ToObservableCollection(); - MinecraftFoldersListSelectedIndex = MinecraftFoldersList.GetIndex(item => item.MinecraftFolderPath == minecraftConfigService.ActiveMinecraftFolderPath); + if (!MinecraftFoldersList.SequenceEqual(minecraftConfigService.MinecraftFolders)) { + MinecraftFoldersList = minecraftConfigService.MinecraftFolders.ToObservableCollection(); + MinecraftFoldersListSelectedIndex = MinecraftFoldersList.GetIndex(item => item.MinecraftFolderPath == minecraftConfigService.ActiveMinecraftFolderPath); + } break; } diff --git a/BadMC_Launcher/ViewModels/Pages/MainPageViewModel.cs b/BadMC_Launcher/ViewModels/Pages/MainPageViewModel.cs index e2ae628..88393c2 100644 --- a/BadMC_Launcher/ViewModels/Pages/MainPageViewModel.cs +++ b/BadMC_Launcher/ViewModels/Pages/MainPageViewModel.cs @@ -1,12 +1,7 @@ -using System.Collections.ObjectModel; -using System.ComponentModel; -using System.Reflection.Metadata; -using BadMC_Launcher.Classes; using BadMC_Launcher.Controls; using BadMC_Launcher.Controls.MainSearch; -using BadMC_Launcher.Extensions; using BadMC_Launcher.Interfaces; -using BadMC_Launcher.Models.Datas.ViewDatas; +using BadMC_Launcher.Models.Data.ViewData; using BadMC_Launcher.Models.Enums; using BadMC_Launcher.Services.Settings; using BadMC_Launcher.Views.UserControls; @@ -14,16 +9,13 @@ using CommunityToolkit.Mvvm.Messaging; using CommunityToolkit.Mvvm.Messaging.Messages; using CommunityToolkit.WinUI.Controls; -using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Controls.Primitives; using Microsoft.UI.Xaml.Input; -using Microsoft.UI.Xaml.Media.Animation; -using Uno.UI.RemoteControl; namespace BadMC_Launcher.ViewModels.Pages; public partial class MainPageViewModel : ObservableObject { - private bool isLaunchPadLightEliminationEnabled = false; + private bool isLaunchPadLightEliminationEnabled; public MainPageViewModel() { //Init Property @@ -119,7 +111,7 @@ private void NavigateToPage(NavigationViewItemInvokedEventArgs args) { [RelayCommand] private void CloseLaunchPad(PointerRoutedEventArgs e) { - if (isLaunchPadLightEliminationEnabled && e.OriginalSource.GetType() != typeof(LaunchPad)) { + if (isLaunchPadLightEliminationEnabled && !IsVisualTreeRootLaunchPad((DependencyObject)e.OriginalSource)) { IsLaunchPadOpen = false; } } @@ -184,8 +176,15 @@ private RequestMessage SendInvokeFuncMessage(Enum tokenEnum) { return WeakReferenceMessenger.Default.Send(new RequestMessage(), tokenEnum.ToString()); } - partial void OnIsMainSideBarToolShowChanged(bool value) { - + private bool IsVisualTreeRootLaunchPad(DependencyObject sourceElement) { + while (sourceElement != null) { + if (sourceElement is LaunchPad) + { + return true; + } + sourceElement = VisualTreeHelper.GetParent(sourceElement); + } + return false; } } diff --git a/BadMC_Launcher/ViewModels/Pages/Settings/LaunchSettingsPageViewModel.cs b/BadMC_Launcher/ViewModels/Pages/Settings/LaunchSettingsPageViewModel.cs index a51ec17..033d6d6 100644 --- a/BadMC_Launcher/ViewModels/Pages/Settings/LaunchSettingsPageViewModel.cs +++ b/BadMC_Launcher/ViewModels/Pages/Settings/LaunchSettingsPageViewModel.cs @@ -1,43 +1,30 @@ -using System; -using System.Collections.Generic; using System.ComponentModel; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using BadMC_Launcher.Controls.Minecraft; -using BadMC_Launcher.Models.Datas; -using BadMC_Launcher.Models.Datas.SettingsDatas; +using BadMC_Launcher.Models.Data; using BadMC_Launcher.Models.Enums; using BadMC_Launcher.Services.Settings; -using BadMC_Launcher.ViewModels.ContentDialogs.Settings; using BadMC_Launcher.Views.ContentDialogs.Settings; -using BadMC_Launcher.Views.Pages.Settings; -using BadMC_Launcher.Views.UserControls; using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Messaging; using CommunityToolkit.Mvvm.Messaging.Messages; -using CommunityToolkit.WinUI.Converters; -using Hardware.Info; using MinecraftLaunch.Base.Models.Game; using MinecraftLaunch.Utilities; using Serilog; -using Uno.Logging; - namespace BadMC_Launcher.ViewModels.Pages.Settings; public partial class LaunchSettingsPageViewModel : ObservableObject { private readonly CancellationTokenSource cancelLoopToken = new(); private readonly XamlRoot? mainPageXamlRoot; - private MinecraftConfigService minecraftService = App.GetService(); - private ResourceLoader sourceService = App.GetService(); + private readonly MinecraftConfigService minecraftService = App.GetService(); + private readonly ResourceLoader sourceService = App.GetService(); + private bool isRangeSelectorDragStarted = false; private MinecraftFolderViewItem? minecraftFolder; private JavaEntry? java; public LaunchSettingsPageViewModel() { mainPageXamlRoot = SendGetValueMessage(MainPageMessengerTokenEnum.XamlRootToken).Response; minecraftFolder = minecraftService.MinecraftFolders.FirstOrDefault(item => item.MinecraftFolderPath == minecraftService.ActiveMinecraftFolderPath); - IsAutoMemorySize = minecraftService.IsAutoMemorySize; minecraftService.PropertyChanged += MinecraftConfig_PropertyChanged; @@ -47,6 +34,10 @@ public LaunchSettingsPageViewModel() { JavaId = sourceService.GetString("Global_NullJavaId"); JavaPath = sourceService.GetString("Global_NullJavaPath"); + IsAutoGameMemorySize = minecraftService.IsAutoMemorySize; + MinGameMemory = minecraftService.MinGameMemory; + MaxGameMemory = minecraftService.MaxGameMemory; + RefreshMemory(cancelLoopToken.Token); GetJavaInfo(); @@ -68,22 +59,22 @@ public LaunchSettingsPageViewModel() { // Memory settings [ObservableProperty] - public partial bool IsAutoMemorySize { get; set; } + public partial bool IsAutoGameMemorySize { get; set; } [ObservableProperty] - public partial double MaxMemoryView { get; set; } + public partial uint MaxMemoryView { get; set; } [ObservableProperty] - public partial double UsedMemoryView { get; set; } + public partial uint UsedMemoryView { get; set; } [ObservableProperty] - public partial double GameMemoryView { get; set; } + public partial uint GameMemoryView { get; set; } [ObservableProperty] - public partial uint MinMemory { get; set; } + public partial uint MinGameMemory { get; set; } [ObservableProperty] - public partial uint MaxMemory { get; set; } + public partial uint MaxGameMemory { get; set; } [RelayCommand] private void CancelLoop() { @@ -114,8 +105,36 @@ private async Task ShowJavaManagerDialog() { } [RelayCommand] - private void SetIsAutoMemorySize() { - minecraftService.IsAutoMemorySize = IsAutoMemorySize; + private void DisableNumberBoxEvent() { + isRangeSelectorDragStarted = true; + } + + [RelayCommand] + private void EnableNumberBoxEvent() { + isRangeSelectorDragStarted = false; + } + + [RelayCommand] + private void SetGameMemory() { + if (isRangeSelectorDragStarted) { + return; + } + // Set min memory + minecraftService.MinGameMemory = MinGameMemory; + + // Set max memory + minecraftService.MaxGameMemory = MaxGameMemory; + } + + partial void OnIsAutoGameMemorySizeChanged(bool value) { + minecraftService.IsAutoMemorySize = IsAutoGameMemorySize; + + if (value) { + GameMemoryView = MaxMemoryView.GetAutoGameMemoryMb(UsedMemoryView); + } + else { + GameMemoryView = MaxGameMemory; + } } private async void GetJavaInfo() { @@ -124,7 +143,7 @@ private async void GetJavaInfo() { // Set Java information JavaId = minecraftService.IsAutoJavaEnabled ? $"{sourceService.GetString("Global_AutoJavaPath")}" : - ( java != null ? $"{java.JavaType} {java.JavaVersion}" : sourceService.GetString("Global_NullJavaId") ); + java != null ? $"{java.JavaType} {java.JavaVersion}" : sourceService.GetString("Global_NullJavaId"); JavaPath = java != null ? java.JavaPath : sourceService.GetString("Global_NullJavaPath"); } @@ -133,14 +152,19 @@ private async void RefreshMemory(CancellationToken cancellationToken) { while (true) { AppParameters.SystemInfo.RefreshMemoryStatus(); - MaxMemoryView = AppParameters.SystemInfo.MemoryStatus.TotalPhysical.BytesToGB(); - UsedMemoryView = (AppParameters.SystemInfo.MemoryStatus.TotalPhysical - AppParameters.SystemInfo.MemoryStatus.AvailablePhysical).BytesToGB(); - GameMemoryView = ( AppParameters.SystemInfo.MemoryStatus.TotalPhysical - ( AppParameters.SystemInfo.MemoryStatus.AvailablePhysical / 2 ) ).BytesToGB(); + MaxMemoryView = AppParameters.SystemInfo.MemoryStatus.TotalPhysical.BytesToMb(); + UsedMemoryView = (AppParameters.SystemInfo.MemoryStatus.TotalPhysical - AppParameters.SystemInfo.MemoryStatus.AvailablePhysical).BytesToMb(); + + if (IsAutoGameMemorySize) { + GameMemoryView = MaxMemoryView.GetAutoGameMemoryMb(UsedMemoryView); + } + else { + GameMemoryView = MaxGameMemory; + } // Wait 1 second await Task.Delay(1000, cancellationToken); } - } catch(TaskCanceledException ex) { Log.Information($"RefreshMemory method is Exited: {ex.Source}"); @@ -153,17 +177,34 @@ private RequestMessage SendGetValueMessage(Enum tokenEnum) { private void MinecraftConfig_PropertyChanged(object? sender, PropertyChangedEventArgs e) { switch (e.PropertyName) { - case nameof(minecraftService.ActiveJavaPath): - case nameof(minecraftService.IsAutoJavaEnabled): - GetJavaInfo(); + case nameof(MinecraftConfigService.ActiveJavaPath): + case nameof(MinecraftConfigService.IsAutoJavaEnabled): + if (minecraftService.ActiveJavaPath != JavaId || JavaId != sourceService.GetString("Global_NullJavaId")) { + GetJavaInfo(); + } break; - case nameof(minecraftService.MinecraftFolders): - case nameof(minecraftService.ActiveMinecraftFolderPath): - minecraftFolder = minecraftService.MinecraftFolders.FirstOrDefault(item => item.MinecraftFolderPath == minecraftService.ActiveMinecraftFolderPath); + case nameof(MinecraftConfigService.ActiveMinecraftFolderPath): + if (minecraftService.ActiveMinecraftFolderPath != MinecraftFolderPath) { + minecraftFolder = minecraftService.MinecraftFolders.FirstOrDefault(item => item.MinecraftFolderPath == minecraftService.ActiveMinecraftFolderPath); - MinecraftFolderId = minecraftFolder != null ? minecraftFolder.MinecraftFolderId : sourceService.GetString("Global_NullMinecraftFolderId"); - MinecraftFolderPath = minecraftFolder != null ? minecraftFolder.MinecraftFolderPath : sourceService.GetString("Global_NullMinecraftFolderPath"); + MinecraftFolderId = minecraftFolder != null ? minecraftFolder.MinecraftFolderId : sourceService.GetString("Global_NullMinecraftFolderId"); + MinecraftFolderPath = minecraftFolder != null ? minecraftFolder.MinecraftFolderPath : sourceService.GetString("Global_NullMinecraftFolderPath"); + } + break; + case nameof(MinecraftConfigService.MinGameMemory): + if (minecraftService.MinGameMemory != MinGameMemory) { + MinGameMemory = minecraftService.MinGameMemory; + } + break; + case nameof(MinecraftConfigService.MaxGameMemory): + if (minecraftService.MaxGameMemory != MaxGameMemory) { + MaxGameMemory = minecraftService.MaxGameMemory; + } break; } } + + partial void OnMaxGameMemoryChanged(uint value) { + + } } diff --git a/BadMC_Launcher/ViewModels/Pages/Settings/SettingsDashboardPageViewModel.cs b/BadMC_Launcher/ViewModels/Pages/Settings/SettingsDashboardPageViewModel.cs index 3d83f86..bfe260e 100644 --- a/BadMC_Launcher/ViewModels/Pages/Settings/SettingsDashboardPageViewModel.cs +++ b/BadMC_Launcher/ViewModels/Pages/Settings/SettingsDashboardPageViewModel.cs @@ -1,18 +1,6 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Threading.Tasks; -using BadMC_Launcher.Models.Datas.ViewDatas; -using BadMC_Launcher.Services.ViewServices; +using BadMC_Launcher.Models.Data.ViewData; using BadMC_Launcher.Controls; using CommunityToolkit.Mvvm.Input; -using CommunityToolkit.Mvvm.Messaging; -using CommunityToolkit.Mvvm.Messaging.Messages; -using Microsoft.UI.Xaml.Media.Animation; -using BadMC_Launcher.Extensions; namespace BadMC_Launcher.ViewModels.Pages.Settings; diff --git a/BadMC_Launcher/ViewModels/UserControls/LaunchPadViewModel.cs b/BadMC_Launcher/ViewModels/UserControls/LaunchPadViewModel.cs index 8818f6c..54780a5 100644 --- a/BadMC_Launcher/ViewModels/UserControls/LaunchPadViewModel.cs +++ b/BadMC_Launcher/ViewModels/UserControls/LaunchPadViewModel.cs @@ -112,7 +112,7 @@ private async Task OpenMinecraftFoldersManager() { [RelayCommand(CanExecute = nameof(SetIsNotActiveMinecraftEntryEmpty))] private void ViewLoaclMinecraftFolder() { if (MinecraftFolderEntryList.TryElementAt(MinecraftFolderEntryListSelectedIndex, out var selectedItem) && selectedItem != null) { - App.GetService().TryOpenFolderFromPath(selectedItem.MinecraftFolderPath); + App.GetService().TryOpenFolderOrFileFromPath(selectedItem.MinecraftFolderPath); } } @@ -155,16 +155,21 @@ private void MinecraftConfig_PropertyChanged(object? sender, PropertyChangedEven // Update Property switch (args.PropertyName) { case nameof(MinecraftConfigService.ActiveMinecraftFolderPath): - // Set MinecraftFolderEntries SelectedIndex - MinecraftFolderEntryListSelectedIndex = MinecraftFolderEntryList.GetIndex(item => item.MinecraftFolderPath == minecraftService.ActiveMinecraftFolderPath); + if (MinecraftFolderEntryList.ElementAtOrDefault(MinecraftFolderEntryListSelectedIndex) + ?.MinecraftFolderPath != minecraftService.ActiveMinecraftFolderPath) { + // Set MinecraftFolderEntries SelectedIndex + MinecraftFolderEntryListSelectedIndex = MinecraftFolderEntryList.GetIndex(item => item.MinecraftFolderPath == minecraftService.ActiveMinecraftFolderPath); - // Update MinecraftEntryList - MinecraftEntryList.Clear(); - MinecraftEntryList.AddRange(selectedItem?.GetMinecraftItems()); + // Update MinecraftEntryList + MinecraftEntryList.Clear(); + MinecraftEntryList.AddRange(selectedItem?.GetMinecraftItems()); - MinecraftEntryListSelectedIndex = MinecraftEntryList.GetIndex(item => item.MinecraftId == selectedItem?.ActiveMinecraftEntryId); + MinecraftEntryListSelectedIndex = MinecraftEntryList.GetIndex(item => item.MinecraftId == selectedItem?.ActiveMinecraftEntryId); + } + break; case nameof(MinecraftConfigService.MinecraftFolders): + if (MinecraftFolderEntryList.SequenceEqual(minecraftService.MinecraftFolders)) // Update MinecraftFolderEntryList MinecraftFolderEntryList = minecraftService.MinecraftFolders.ToObservableCollection(); diff --git a/BadMC_Launcher/Views/Pages/MainPage.xaml b/BadMC_Launcher/Views/Pages/MainPage.xaml index 9a90e79..037943d 100644 --- a/BadMC_Launcher/Views/Pages/MainPage.xaml +++ b/BadMC_Launcher/Views/Pages/MainPage.xaml @@ -20,16 +20,18 @@ EmptyValue="False" NotEmptyValue="True" /> + + - + - + @@ -192,8 +194,8 @@ @@ -288,13 +290,13 @@ Grid.Column="1" Width="336" HorizontalAlignment="Right" - IsOpen="True" /> + IsOpen="{x:Bind viewModel.IsLaunchPadOpen, Mode=TwoWay}" /> - - - + + - + - - + + @@ -96,9 +100,9 @@ - + - + - + @@ -141,7 +146,9 @@ VerticalAlignment="Center" Foreground="{ThemeResource TextOnAccentFillColorPrimaryBrush}" Style="{ThemeResource BodyStrongTextBlockStyle}"> - + + + @@ -161,14 +168,14 @@ VerticalAlignment="Center" Foreground="{ThemeResource TextOnAccentFillColorPrimaryBrush}" Style="{ThemeResource BodyStrongTextBlockStyle}"> - + - + + Value="{x:Bind GetProgressRingMemoryView(viewModel.UsedMemoryView, viewModel.MaxMemoryView, viewModel.GameMemoryView), Mode=OneWay}" /> - + - - - + + - - - + + - - - - - - - + + + diff --git a/BadMC_Launcher/Views/Pages/Settings/LaunchSettingsPage.xaml.cs b/BadMC_Launcher/Views/Pages/Settings/LaunchSettingsPage.xaml.cs index 90e2697..9bdcee4 100644 --- a/BadMC_Launcher/Views/Pages/Settings/LaunchSettingsPage.xaml.cs +++ b/BadMC_Launcher/Views/Pages/Settings/LaunchSettingsPage.xaml.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Reflection.Metadata; using System.Runtime.InteropServices.WindowsRuntime; -using BadMC_Launcher.Models.Datas; +using BadMC_Launcher.Models.Data; using BadMC_Launcher.ViewModels.Pages.Settings; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; @@ -15,6 +15,7 @@ using Microsoft.UI.Xaml.Navigation; using Windows.Foundation; using Windows.Foundation.Collections; +using Windows.Globalization.NumberFormatting; // The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=234238 @@ -28,47 +29,83 @@ public sealed partial class LaunchSettingsPage : Page { public LaunchSettingsPage() { InitializeComponent(); DataContext = new LaunchSettingsPageViewModel(); + + DecimalFormatter formatter = new DecimalFormatter(); + formatter.FractionDigits = 0; + + MinGameMemoryNumberBox.NumberFormatter = formatter; + MaxGameMemoryNumberBox.NumberFormatter = formatter; } - private string GetStringGameMemory(object gameMemory, object usedMemory) { - if (gameMemory is double gameNumber && usedMemory is double usedNumber) { - return Math.Round(gameNumber - usedNumber, 2).ToString(); + private string MbToGbString(object Memory) { + if (Memory is uint number) { + return Math.Round(number / 1024.0, 2).ToString(); } return string.Empty; } + + private string GetAvailableMemoryView(object usedMemory, object maxMemory) { + if (maxMemory is uint maxNumber && usedMemory is uint usedNumber) { + return Math.Round((maxNumber - usedNumber) / 1024.0, 2).ToString(); + } + return string.Empty; + } + private double GetProgressRingMemoryView(object memory, object maxMemory) { - if (memory is double number && maxMemory is double maxNumber) { - return ( number / maxNumber ) * 100.0; + if (memory is uint number && maxMemory is uint maxNumber) { + return Math.Round(( (double)number / maxNumber ) * 100.0, 2); + } + return 0.0; + } + + private double GetProgressRingMemoryView(object memory, object maxMemory, object rootMemory) { + if (memory is uint number && maxMemory is uint maxNumber && rootMemory is uint rootNumber) { + return Math.Round(( (double)(number + rootNumber) / maxNumber ) * 100.0, 2); } return 0.0; } - private string GetGameMemoryScore(object gameMemory, object usedMemory) { - if (gameMemory is double numberGameMemory && usedMemory is double numberUsedMemory) { + private string GetGameMemoryScore(object gameMemory, object usedMemory, object maxMemory) { + if (gameMemory is uint numberGameMemory && usedMemory is uint numberUsedMemory && maxMemory is uint numberMaxMemory) { + var gameMemoryGb = Math.Round(numberGameMemory / 1024.0, 2); + var usedMemoryGb = Math.Round(numberUsedMemory / 1024.0, 2); + var maxMemoryGb = Math.Round(numberMaxMemory / 1024.0, 2); + var loader = App.GetService(); - var memory = numberGameMemory - numberUsedMemory; - if (memory <= 0.0) { - return loader.GetString("LaunchSettingsPage_MemoryScore0"); + + if (gameMemoryGb <= 0.0) { + return loader.GetString("LaunchSettingsPage_GameMemoryScore0"); } - else if (memory < 1.0) { - return loader.GetString("LaunchSettingsPage_MemoryScore1"); + else if (gameMemoryGb > maxMemoryGb) { + return loader.GetString("LaunchSettingsPage_GameMemoryScore1"); } - else if (memory < 4.0) { - return loader.GetString("LaunchSettingsPage_MemoryScore2"); + else if (gameMemoryGb <= 0.512) { + return loader.GetString("LaunchSettingsPage_GameMemoryScore2"); + } + else if (gameMemoryGb < 2.048) { + return loader.GetString("LaunchSettingsPage_GameMemoryScore3"); } - else if (memory < 16.0) { - return loader.GetString("LaunchSettingsPage_MemoryScore3"); + else if (gameMemoryGb < 4.096) { + return loader.GetString("LaunchSettingsPage_GameMemoryScore4"); } - else if (memory < 32.0) { - return loader.GetString("LaunchSettingsPage_MemoryScore4"); + else if (gameMemoryGb < 16.384) { + return loader.GetString("LaunchSettingsPage_GameMemoryScore5"); } - return loader.GetString("LaunchSettingsPage_MemoryScore5"); + else if (gameMemoryGb < 32.768) { + return loader.GetString("LaunchSettingsPage_GameMemoryScore6"); + + } + return loader.GetString("LaunchSettingsPage_GameMemoryScore7"); } return string.Empty; } + + private void OnMemoryFlyoutOpened(object sender, object args) { + GameMemoryRangeSelector.Focus(FocusState.Programmatic); + } } diff --git a/BadMC_Launcher/Views/UserControls/LaunchPad.xaml b/BadMC_Launcher/Views/UserControls/LaunchPad.xaml index d8bf0a1..65265f3 100644 --- a/BadMC_Launcher/Views/UserControls/LaunchPad.xaml +++ b/BadMC_Launcher/Views/UserControls/LaunchPad.xaml @@ -6,10 +6,12 @@ xmlns:animations="using:CommunityToolkit.WinUI.Animations" xmlns:converters="using:CommunityToolkit.WinUI.Converters" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" - xmlns:local="using:BadMC_Launcher.Views.UserControls" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - xmlns:ui="using:CommunityToolkit.WinUI" mc:Ignorable="d"> + + + + - + - + - + - + - + @@ -44,16 +46,16 @@ PointerEntered="OnLaunchPadPointEntered" PointerExited="OnLaunchPadPointExited" PointerPressed="OnLaunchPadPointerPressed"> - + - + - + - + @@ -77,7 +79,7 @@ - + - + @@ -107,7 +109,7 @@ - + - + @@ -218,7 +220,7 @@ SelectedIndex="{Binding MinecraftEntryListSelectedIndex, Mode=TwoWay}" /> - + - + diff --git a/BadMC_Launcher/Views/UserControls/LaunchPad.xaml.cs b/BadMC_Launcher/Views/UserControls/LaunchPad.xaml.cs index 0a37dd8..d0e796f 100644 --- a/BadMC_Launcher/Views/UserControls/LaunchPad.xaml.cs +++ b/BadMC_Launcher/Views/UserControls/LaunchPad.xaml.cs @@ -10,19 +10,19 @@ namespace BadMC_Launcher.Views.UserControls; public sealed partial class LaunchPad : UserControl { - public LaunchPad() { - this.InitializeComponent(); - DataContext = new LaunchPadViewModel(); - } - // Register property public static readonly DependencyProperty IsOpenProperty = DependencyProperty.Register( nameof(IsOpen), typeof(bool), - typeof(LoadingAnimation), + typeof(LaunchPad), new PropertyMetadata(true, OnIsOpenChanged) ); + public LaunchPad() { + DataContext = new LaunchPadViewModel(); + this.InitializeComponent(); + } + public bool IsOpen { get => (bool)GetValue(IsOpenProperty); set => SetValue(IsOpenProperty, value); @@ -44,7 +44,7 @@ private static void OnIsOpenChanged(DependencyObject d, DependencyPropertyChange #if WINAPPSDK_PACKAGED control.CloseLaunchPadAnimation.Start(); #else - control.Translation = new(-100, 0, 0); + control.Translation = new(320, 0, 0); #endif control.LaunchPadBorder.IsHitTestVisible = false; } @@ -52,13 +52,21 @@ private static void OnIsOpenChanged(DependencyObject d, DependencyPropertyChange private void OnLaunchPadPointEntered(object sender, PointerRoutedEventArgs e) { if (!IsOpen) { +#if WINAPPSDK_PACKAGED LaunchPadPointerInAnimation.Start(); +#else + LaunchPadBorder.Translation = new(280, 0, 0); +#endif } } private void OnLaunchPadPointExited(object sender, PointerRoutedEventArgs e) { if (!IsOpen) { +#if WINAPPSDK_PACKAGED LaunchPadPointerOutAnimation.Start(); +#else + LaunchPadBorder.Translation = new(320, 0, 0); +#endif } } diff --git a/BadMC_Launcher/Views/UserControls/LoadingAnimation.xaml.cs b/BadMC_Launcher/Views/UserControls/LoadingAnimation.xaml.cs index d8e2038..47a2487 100644 --- a/BadMC_Launcher/Views/UserControls/LoadingAnimation.xaml.cs +++ b/BadMC_Launcher/Views/UserControls/LoadingAnimation.xaml.cs @@ -17,10 +17,6 @@ namespace BadMC_Launcher.Views.UserControls; public sealed partial class LoadingAnimation : UserControl { - public LoadingAnimation() { - InitializeComponent(); - } - // Register property public static readonly DependencyProperty IsLoadingProperty = DependencyProperty.Register( nameof(IsLoading), @@ -36,6 +32,10 @@ public LoadingAnimation() { new PropertyMetadata(string.Empty, OnLoadDescriptionChanged) ); + public LoadingAnimation() { + InitializeComponent(); + } + public bool IsLoading { get => (bool)GetValue(IsLoadingProperty); set => SetValue(IsLoadingProperty, value); diff --git a/Directory.Packages.props b/Directory.Packages.props index 89f2eb1..c689a81 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -12,6 +12,7 @@ + @@ -19,6 +20,7 @@ + @@ -29,10 +31,10 @@ - + - + \ No newline at end of file From b4bac32213b068a70a5e4780f248653d555b86a8 Mon Sep 17 00:00:00 2001 From: Starcloudsea <84891987+Starcloudsea@users.noreply.github.com> Date: Sun, 11 May 2025 14:54:29 +0800 Subject: [PATCH 16/40] =?UTF-8?q?=E5=8D=87=E7=BA=A7=E5=88=B0Uno=20Platform?= =?UTF-8?q?=206.0=20Microsoft.Xaml.UI=E5=92=8CWindowsAppSDK:=20=E6=88=91?= =?UTF-8?q?=E5=90=83=E6=9F=A0=E6=AA=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/ISSUE_TEMPLATE/bug_report.yml | 2 - .gitignore | 4 +- .idea/.idea.BadMC_Launcher/.idea/.gitignore | 13 - .../.idea/indexLayout.xml | 8 - .idea/.idea.BadMC_Launcher/.idea/vcs.xml | 6 - .vscode/launch.json | 7 - .vsconfig | 2 - BadMC_Launcher.Benchmarks/AssemblyInfo.cs | 32 -- .../BadMC_Launcher.Benchmarks.csproj | 20 - BadMC_Launcher.Benchmarks/UnitTest1.cs | 14 - .../BadMC_Launcher.Tests.csproj | 17 +- BadMC_Launcher.Tests/UnitTest1.cs | 31 +- BadMC_Launcher.sln | 93 +---- BadMC_Launcher/App.xaml | 3 + BadMC_Launcher/App.xaml.cs | 85 ++-- BadMC_Launcher/Assets/SharedAssets.md | 2 +- BadMC_Launcher/BadMC_Launcher.csproj | 79 ++-- .../Converters/DoubleToUIntConverter.cs | 22 -- .../DisabledVersionFilter.cs | 19 + .../EnabledVersionFilter.cs | 19 + .../ModLoaderVersionFilter.cs | 21 + .../ModifiedVersionFilter.cs | 21 + .../NotReleaseVersionFilter.cs | 21 + .../MainMenuSearchMinecraftEntryFilter.cs | 4 +- .../Minecraft/MinecraftEntryViewItem.cs | 3 +- .../Extensions/ConverterExtension.cs | 2 +- .../Extensions/MinecraftEntryExtension.cs | 3 +- .../Interfaces/IVersionIsolationFilter.cs | 22 ++ BadMC_Launcher/Models/Data/AppDataPath.cs | 2 + .../Models/Data/Mappings/UpdateMapping.cs | 6 +- ...MinecraftConfig.cs => MinecraftConfigs.cs} | 11 +- ...aftConfig.cs => SingleMinecraftConfigs.cs} | 4 +- .../{ThemeSetting.cs => ThemeConfigs.cs} | 2 +- .../Models/Enums/IndependencyCoreEnum.cs | 2 +- BadMC_Launcher/Package.appxmanifest | 18 +- BadMC_Launcher/Platforms/Desktop/Program.cs | 25 +- .../Platforms/MacCatalyst/Entitlements.plist | 6 - .../Platforms/MacCatalyst/Info.plist | 26 -- .../Platforms/MacCatalyst/Main.maccatalyst.cs | 13 - .../LaunchImages.launchimage/Contents.json | 58 --- .../win-arm64-clickonce.pubxml | 39 -- .../PublishProfiles/win-arm64.pubxml | 4 +- .../PublishProfiles/win-x64-clickonce.pubxml | 39 -- .../Properties/PublishProfiles/win-x64.pubxml | 27 +- .../Properties/PublishProfiles/win-x86.pubxml | 23 ++ BadMC_Launcher/ReadMe.md | 7 + .../MinecraftConfigsService.cs} | 154 ++++---- .../SingleMinecraftConfigsService.cs} | 29 +- .../ThemeConfigsService.cs} | 116 +++--- .../Services/Endpoints/DebugHandler.cs | 44 +++ .../Settings/LaunchSettingsService.cs | 12 + BadMC_Launcher/Strings/en-US/Resources.resw | 42 +- BadMC_Launcher/Strings/zh-Hans/Resources.resw | 42 +- .../Settings/JavaContentDialogViewModel.cs | 9 +- .../MinecraftFolderContentDialogViewModel.cs | 7 +- .../ViewModels/Pages/MainPageViewModel.cs | 13 +- .../Settings/LaunchSettingsPageViewModel.cs | 13 +- .../SettingsDashboardPageViewModel.cs | 1 + .../UserControls/LaunchPadViewModel.cs | 7 +- .../Pages/Settings/LaunchSettingsPage.xaml | 18 +- Directory.Packages.props | 30 +- LICENSE | 373 ------------------ README.md | 289 -------------- .../vs/.vstemplates.global.etag | 1 - TemplateEngineHost/vs/.vstemplates.local | 18 - TemplateEngineHost/vs/.vstemplates.local.etag | 1 - TemplateEngineHost/vs/templatecache.json | 1 - docs/README_enUS.md | 0 docs/Release.md | 0 docs/assets/BadMC_Launcher_MainPage.png | Bin 703737 -> 0 bytes global.json | 7 +- publish.sh | 0 72 files changed, 600 insertions(+), 1514 deletions(-) delete mode 100644 .idea/.idea.BadMC_Launcher/.idea/.gitignore delete mode 100644 .idea/.idea.BadMC_Launcher/.idea/indexLayout.xml delete mode 100644 .idea/.idea.BadMC_Launcher/.idea/vcs.xml delete mode 100644 BadMC_Launcher.Benchmarks/AssemblyInfo.cs delete mode 100644 BadMC_Launcher.Benchmarks/BadMC_Launcher.Benchmarks.csproj delete mode 100644 BadMC_Launcher.Benchmarks/UnitTest1.cs delete mode 100644 BadMC_Launcher/Classes/Converters/DoubleToUIntConverter.cs create mode 100644 BadMC_Launcher/Classes/DataClasses/VersionIsolationFilters/DisabledVersionFilter.cs create mode 100644 BadMC_Launcher/Classes/DataClasses/VersionIsolationFilters/EnabledVersionFilter.cs create mode 100644 BadMC_Launcher/Classes/DataClasses/VersionIsolationFilters/ModLoaderVersionFilter.cs create mode 100644 BadMC_Launcher/Classes/DataClasses/VersionIsolationFilters/ModifiedVersionFilter.cs create mode 100644 BadMC_Launcher/Classes/DataClasses/VersionIsolationFilters/NotReleaseVersionFilter.cs create mode 100644 BadMC_Launcher/Interfaces/IVersionIsolationFilter.cs rename BadMC_Launcher/Models/Data/SettingsDatas/{MinecraftConfig.cs => MinecraftConfigs.cs} (81%) rename BadMC_Launcher/Models/Data/SettingsDatas/{SingleMinecraftConfig.cs => SingleMinecraftConfigs.cs} (88%) rename BadMC_Launcher/Models/Data/SettingsDatas/{ThemeSetting.cs => ThemeConfigs.cs} (94%) delete mode 100644 BadMC_Launcher/Platforms/MacCatalyst/Entitlements.plist delete mode 100644 BadMC_Launcher/Platforms/MacCatalyst/Info.plist delete mode 100644 BadMC_Launcher/Platforms/MacCatalyst/Main.maccatalyst.cs delete mode 100644 BadMC_Launcher/Platforms/MacCatalyst/Media.xcassets/LaunchImages.launchimage/Contents.json delete mode 100644 BadMC_Launcher/Properties/PublishProfiles/win-arm64-clickonce.pubxml delete mode 100644 BadMC_Launcher/Properties/PublishProfiles/win-x64-clickonce.pubxml create mode 100644 BadMC_Launcher/Properties/PublishProfiles/win-x86.pubxml create mode 100644 BadMC_Launcher/ReadMe.md rename BadMC_Launcher/Services/{Settings/MinecraftConfigService.cs => Configs/MinecraftConfigsService.cs} (58%) rename BadMC_Launcher/Services/{Settings/SingleMinecraftConfigService.cs => Configs/SingleMinecraftConfigsService.cs} (83%) rename BadMC_Launcher/Services/{Settings/ThemeSettingService.cs => Configs/ThemeConfigsService.cs} (55%) create mode 100644 BadMC_Launcher/Services/Endpoints/DebugHandler.cs create mode 100644 BadMC_Launcher/Services/Settings/LaunchSettingsService.cs delete mode 100644 LICENSE delete mode 100644 README.md delete mode 100644 TemplateEngineHost/vs/.vstemplates.global.etag delete mode 100644 TemplateEngineHost/vs/.vstemplates.local delete mode 100644 TemplateEngineHost/vs/.vstemplates.local.etag delete mode 100644 TemplateEngineHost/vs/templatecache.json delete mode 100644 docs/README_enUS.md delete mode 100644 docs/Release.md delete mode 100644 docs/assets/BadMC_Launcher_MainPage.png delete mode 100644 publish.sh diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index f077444..f758aa3 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -39,7 +39,6 @@ body: - Core - Android - iOS - - MacCatalyst - Windows - Skia - WebAssembly @@ -57,7 +56,6 @@ body: - Android - iOS - MacOS - - MacCatalyst - Windows - GTK - Linux Framebuffer diff --git a/.gitignore b/.gitignore index f29719c..cab6593 100644 --- a/.gitignore +++ b/.gitignore @@ -34,7 +34,6 @@ bld/ # Visual Studio 2015/2017 cache/options directory .vs/ -.vs/* # Uncomment if you have tasks that create the project's static files in wwwroot #wwwroot/ @@ -156,6 +155,7 @@ coverage*.info # NCrunch _NCrunch_* +.NCrunch_* .*crunch*.local.xml nCrunchTemp_* @@ -403,4 +403,4 @@ FodyWeavers.xsd # Single Target Config solution-config.props # Publish Profiles -!**/Properties/PublishProfiles/*.pubxml +!**/Properties/PublishProfiles/*.pubxml \ No newline at end of file diff --git a/.idea/.idea.BadMC_Launcher/.idea/.gitignore b/.idea/.idea.BadMC_Launcher/.idea/.gitignore deleted file mode 100644 index 92cd002..0000000 --- a/.idea/.idea.BadMC_Launcher/.idea/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -# 默认忽略的文件 -/shelf/ -/workspace.xml -# Rider 忽略的文件 -/contentModel.xml -/modules.xml -/projectSettingsUpdater.xml -/.idea.BadMC_Launcher.iml -# 基于编辑器的 HTTP 客户端请求 -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/.idea.BadMC_Launcher/.idea/indexLayout.xml b/.idea/.idea.BadMC_Launcher/.idea/indexLayout.xml deleted file mode 100644 index 7b08163..0000000 --- a/.idea/.idea.BadMC_Launcher/.idea/indexLayout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/.idea.BadMC_Launcher/.idea/vcs.xml b/.idea/.idea.BadMC_Launcher/.idea/vcs.xml deleted file mode 100644 index 35eb1dd..0000000 --- a/.idea/.idea.BadMC_Launcher/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json index 830318d..d496a82 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -4,13 +4,6 @@ // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md "version": "0.2.0", "configurations": [ - { - "name": "Uno Platform Mobile Debug", - "type": "Uno", - "request": "launch", - // any Uno* task will do, this is simply to satisfy vscode requirement when a launch.json is present - "preLaunchTask": "Uno: android | Debug | android-x64" - }, { // Use IntelliSense to find out which attributes exist for C# debugging // Use hover for the description of the existing attributes diff --git a/.vsconfig b/.vsconfig index 8e1dd5e..7399702 100644 --- a/.vsconfig +++ b/.vsconfig @@ -11,8 +11,6 @@ "Microsoft.VisualStudio.Component.ManagedDesktop.Prerequisites", "Microsoft.VisualStudio.Component.Debugger.JustInTime", "Microsoft.VisualStudio.Workload.ManagedDesktop", - "Microsoft.VisualStudio.Component.MonoDebugger", - "Microsoft.VisualStudio.ComponentGroup.Maui.All", "Microsoft.VisualStudio.Workload.NetCrossPlat", "Microsoft.VisualStudio.Workload.NetCoreTools" ] diff --git a/BadMC_Launcher.Benchmarks/AssemblyInfo.cs b/BadMC_Launcher.Benchmarks/AssemblyInfo.cs deleted file mode 100644 index 77fb4a4..0000000 --- a/BadMC_Launcher.Benchmarks/AssemblyInfo.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using BadMC_Launcher.Benchmarks; -using BenchmarkDotNet.Attributes; -using BenchmarkDotNet.Configs; -using BenchmarkDotNet.Jobs; -using BenchmarkDotNet.Loggers; -using BenchmarkDotNet.Running; -using BenchmarkDotNet.Validators; -using Microsoft.VisualStudio.TestPlatform.TestHost; - -[assembly: Config(typeof(AssemblyInfo))] - -namespace BadMC_Launcher.Benchmarks; - -internal class AssemblyInfo : ManualConfig { - public AssemblyInfo() { - AddJob(Job.Dry); - AddLogger(ConsoleLogger.Default); - AddValidator(JitOptimizationsValidator.DontFailOnError); - } - - public static void Main(string[] args) { - var summary = BenchmarkRunner.Run(typeof(UnitTest1).Assembly); - Console.WriteLine(summary); - Console.Write("Test complete, press any key to continue ......"); - Console.ReadKey(); - } -} diff --git a/BadMC_Launcher.Benchmarks/BadMC_Launcher.Benchmarks.csproj b/BadMC_Launcher.Benchmarks/BadMC_Launcher.Benchmarks.csproj deleted file mode 100644 index 6ffe01f..0000000 --- a/BadMC_Launcher.Benchmarks/BadMC_Launcher.Benchmarks.csproj +++ /dev/null @@ -1,20 +0,0 @@ - - - net9.0 - enable - enable - false - false - true - AnyCPU;ARM64;x64;x86 - - - - - - - - - - - diff --git a/BadMC_Launcher.Benchmarks/UnitTest1.cs b/BadMC_Launcher.Benchmarks/UnitTest1.cs deleted file mode 100644 index 6bb37b7..0000000 --- a/BadMC_Launcher.Benchmarks/UnitTest1.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Collections.ObjectModel; -using BadMC_Launcher.Classes; -using BadMC_Launcher.Services.Settings; -using BenchmarkDotNet.Attributes; - -namespace BadMC_Launcher.Benchmarks; - -public class UnitTest1 { - - [Benchmark] - public void Test1() { - - } -} diff --git a/BadMC_Launcher.Tests/BadMC_Launcher.Tests.csproj b/BadMC_Launcher.Tests/BadMC_Launcher.Tests.csproj index 3746251..3dc6afe 100644 --- a/BadMC_Launcher.Tests/BadMC_Launcher.Tests.csproj +++ b/BadMC_Launcher.Tests/BadMC_Launcher.Tests.csproj @@ -1,34 +1,21 @@ - + net9.0 false true - AnyCPU;ARM64;x64;x86 - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive - diff --git a/BadMC_Launcher.Tests/UnitTest1.cs b/BadMC_Launcher.Tests/UnitTest1.cs index c316bed..d0b5b92 100644 --- a/BadMC_Launcher.Tests/UnitTest1.cs +++ b/BadMC_Launcher.Tests/UnitTest1.cs @@ -1,30 +1,15 @@ -using System; -using System.Diagnostics; -using System.Net; -using BadMC_Launcher.Classes; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.UI.Xaml.Media.Imaging; -using MinecraftLaunch.Base.Models.Game; -using MinecraftLaunch.Components.Installer; -using MinecraftLaunch.Components.Parser; -using MinecraftLaunch.Extensions; -using MinecraftLaunch.Utilities; -using Windows.Gaming.UI; - namespace BadMC_Launcher.Tests; -public class UnitTest1 { - class C1 { - public string indowName { get; set; } = "哼哼啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊!!!!!!!!!!!!!!"; - - public int indowName2 { get; set; } = 13333444; - } - [SetUp] - public void Setup() { +public class UnitTest1 +{ + [SetUp] + public void Setup() + { } [Test] - public void Test1() { - + public void Test1() + { + Assert.Pass(); } } diff --git a/BadMC_Launcher.sln b/BadMC_Launcher.sln index a51d739..a31db1d 100644 --- a/BadMC_Launcher.sln +++ b/BadMC_Launcher.sln @@ -1,104 +1,49 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 -VisualStudioVersion = 17.12.35707.178 +VisualStudioVersion = 17.14.36105.17 d17.14 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BadMC_Launcher", "BadMC_Launcher\BadMC_Launcher.csproj", "{34CC7E35-3490-48B5-808A-8F20B6A0EA27}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BadMC_Launcher", "BadMC_Launcher\BadMC_Launcher.csproj", "{FB41FFC8-CFBD-4596-AEEF-6EAFE339AEBA}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{407D5340-E3BE-4D53-A84A-AF99FE35BB2E}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{02EA681E-C7D8-13C7-8484-4AC65E1B71E8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BadMC_Launcher.Tests", "BadMC_Launcher.Tests\BadMC_Launcher.Tests.csproj", "{37934AC8-0922-44DC-A250-022CB8486987}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BadMC_Launcher.Tests", "BadMC_Launcher.Tests\BadMC_Launcher.Tests.csproj", "{5DDF52C5-900B-9D9B-8D63-7F70EBA69900}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{87850BF2-A358-46A9-B1BC-09850A437820}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{474979DA-AC27-4A3C-B61F-39FD5C3B8C96}" ProjectSection(SolutionItems) = preProject .gitignore = .gitignore Directory.Build.props = Directory.Build.props Directory.Build.targets = Directory.Build.targets Directory.Packages.props = Directory.Packages.props global.json = global.json - Resources.Designer.t4 = Resources.Designer.t4 - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BadMC_Launcher.Benchmarks", "BadMC_Launcher.Benchmarks\BadMC_Launcher.Benchmarks.csproj", "{C4CC53B8-E8A1-4402-B95F-5991F38C47CC}" - ProjectSection(ProjectDependencies) = postProject - {34CC7E35-3490-48B5-808A-8F20B6A0EA27} = {34CC7E35-3490-48B5-808A-8F20B6A0EA27} EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU - Debug|ARM64 = Debug|ARM64 - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU - Release|ARM64 = Release|ARM64 - Release|x64 = Release|x64 - Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {34CC7E35-3490-48B5-808A-8F20B6A0EA27}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {34CC7E35-3490-48B5-808A-8F20B6A0EA27}.Debug|Any CPU.Build.0 = Debug|Any CPU - {34CC7E35-3490-48B5-808A-8F20B6A0EA27}.Debug|Any CPU.Deploy.0 = Debug|Any CPU - {34CC7E35-3490-48B5-808A-8F20B6A0EA27}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {34CC7E35-3490-48B5-808A-8F20B6A0EA27}.Debug|ARM64.Build.0 = Debug|ARM64 - {34CC7E35-3490-48B5-808A-8F20B6A0EA27}.Debug|x64.ActiveCfg = Debug|x64 - {34CC7E35-3490-48B5-808A-8F20B6A0EA27}.Debug|x64.Build.0 = Debug|x64 - {34CC7E35-3490-48B5-808A-8F20B6A0EA27}.Debug|x86.ActiveCfg = Debug|x86 - {34CC7E35-3490-48B5-808A-8F20B6A0EA27}.Debug|x86.Build.0 = Debug|x86 - {34CC7E35-3490-48B5-808A-8F20B6A0EA27}.Release|Any CPU.ActiveCfg = Release|Any CPU - {34CC7E35-3490-48B5-808A-8F20B6A0EA27}.Release|Any CPU.Build.0 = Release|Any CPU - {34CC7E35-3490-48B5-808A-8F20B6A0EA27}.Release|Any CPU.Deploy.0 = Release|Any CPU - {34CC7E35-3490-48B5-808A-8F20B6A0EA27}.Release|ARM64.ActiveCfg = Release|ARM64 - {34CC7E35-3490-48B5-808A-8F20B6A0EA27}.Release|ARM64.Build.0 = Release|ARM64 - {34CC7E35-3490-48B5-808A-8F20B6A0EA27}.Release|x64.ActiveCfg = Release|x64 - {34CC7E35-3490-48B5-808A-8F20B6A0EA27}.Release|x64.Build.0 = Release|x64 - {34CC7E35-3490-48B5-808A-8F20B6A0EA27}.Release|x86.ActiveCfg = Release|x86 - {34CC7E35-3490-48B5-808A-8F20B6A0EA27}.Release|x86.Build.0 = Release|x86 - {37934AC8-0922-44DC-A250-022CB8486987}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {37934AC8-0922-44DC-A250-022CB8486987}.Debug|Any CPU.Build.0 = Debug|Any CPU - {37934AC8-0922-44DC-A250-022CB8486987}.Debug|Any CPU.Deploy.0 = Debug|Any CPU - {37934AC8-0922-44DC-A250-022CB8486987}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {37934AC8-0922-44DC-A250-022CB8486987}.Debug|ARM64.Build.0 = Debug|ARM64 - {37934AC8-0922-44DC-A250-022CB8486987}.Debug|x64.ActiveCfg = Debug|x64 - {37934AC8-0922-44DC-A250-022CB8486987}.Debug|x64.Build.0 = Debug|x64 - {37934AC8-0922-44DC-A250-022CB8486987}.Debug|x86.ActiveCfg = Debug|x86 - {37934AC8-0922-44DC-A250-022CB8486987}.Debug|x86.Build.0 = Debug|x86 - {37934AC8-0922-44DC-A250-022CB8486987}.Release|Any CPU.ActiveCfg = Release|Any CPU - {37934AC8-0922-44DC-A250-022CB8486987}.Release|Any CPU.Build.0 = Release|Any CPU - {37934AC8-0922-44DC-A250-022CB8486987}.Release|Any CPU.Deploy.0 = Release|Any CPU - {37934AC8-0922-44DC-A250-022CB8486987}.Release|ARM64.ActiveCfg = Release|ARM64 - {37934AC8-0922-44DC-A250-022CB8486987}.Release|ARM64.Build.0 = Release|ARM64 - {37934AC8-0922-44DC-A250-022CB8486987}.Release|x64.ActiveCfg = Release|x64 - {37934AC8-0922-44DC-A250-022CB8486987}.Release|x64.Build.0 = Release|x64 - {37934AC8-0922-44DC-A250-022CB8486987}.Release|x86.ActiveCfg = Release|x86 - {37934AC8-0922-44DC-A250-022CB8486987}.Release|x86.Build.0 = Release|x86 - {C4CC53B8-E8A1-4402-B95F-5991F38C47CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C4CC53B8-E8A1-4402-B95F-5991F38C47CC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C4CC53B8-E8A1-4402-B95F-5991F38C47CC}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {C4CC53B8-E8A1-4402-B95F-5991F38C47CC}.Debug|ARM64.Build.0 = Debug|ARM64 - {C4CC53B8-E8A1-4402-B95F-5991F38C47CC}.Debug|x64.ActiveCfg = Debug|x64 - {C4CC53B8-E8A1-4402-B95F-5991F38C47CC}.Debug|x64.Build.0 = Debug|x64 - {C4CC53B8-E8A1-4402-B95F-5991F38C47CC}.Debug|x86.ActiveCfg = Debug|x86 - {C4CC53B8-E8A1-4402-B95F-5991F38C47CC}.Debug|x86.Build.0 = Debug|x86 - {C4CC53B8-E8A1-4402-B95F-5991F38C47CC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C4CC53B8-E8A1-4402-B95F-5991F38C47CC}.Release|Any CPU.Build.0 = Release|Any CPU - {C4CC53B8-E8A1-4402-B95F-5991F38C47CC}.Release|ARM64.ActiveCfg = Release|ARM64 - {C4CC53B8-E8A1-4402-B95F-5991F38C47CC}.Release|ARM64.Build.0 = Release|ARM64 - {C4CC53B8-E8A1-4402-B95F-5991F38C47CC}.Release|x64.ActiveCfg = Release|x64 - {C4CC53B8-E8A1-4402-B95F-5991F38C47CC}.Release|x64.Build.0 = Release|x64 - {C4CC53B8-E8A1-4402-B95F-5991F38C47CC}.Release|x86.ActiveCfg = Release|x86 - {C4CC53B8-E8A1-4402-B95F-5991F38C47CC}.Release|x86.Build.0 = Release|x86 + {FB41FFC8-CFBD-4596-AEEF-6EAFE339AEBA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FB41FFC8-CFBD-4596-AEEF-6EAFE339AEBA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FB41FFC8-CFBD-4596-AEEF-6EAFE339AEBA}.Debug|Any CPU.Deploy.0 = Debug|Any CPU + {FB41FFC8-CFBD-4596-AEEF-6EAFE339AEBA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FB41FFC8-CFBD-4596-AEEF-6EAFE339AEBA}.Release|Any CPU.Build.0 = Release|Any CPU + {FB41FFC8-CFBD-4596-AEEF-6EAFE339AEBA}.Release|Any CPU.Deploy.0 = Release|Any CPU + {5DDF52C5-900B-9D9B-8D63-7F70EBA69900}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5DDF52C5-900B-9D9B-8D63-7F70EBA69900}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5DDF52C5-900B-9D9B-8D63-7F70EBA69900}.Debug|Any CPU.Deploy.0 = Debug|Any CPU + {5DDF52C5-900B-9D9B-8D63-7F70EBA69900}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5DDF52C5-900B-9D9B-8D63-7F70EBA69900}.Release|Any CPU.Build.0 = Release|Any CPU + {5DDF52C5-900B-9D9B-8D63-7F70EBA69900}.Release|Any CPU.Deploy.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {37934AC8-0922-44DC-A250-022CB8486987} = {407D5340-E3BE-4D53-A84A-AF99FE35BB2E} - {C4CC53B8-E8A1-4402-B95F-5991F38C47CC} = {407D5340-E3BE-4D53-A84A-AF99FE35BB2E} + {5DDF52C5-900B-9D9B-8D63-7F70EBA69900} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution - RESX_ExcelExportMode = MultipleSheets - SolutionGuid = {9BB97DAE-986F-449E-8D4B-1E61C2D6974E} - RESX_NeutralResourcesLanguage = zh-Hans + SolutionGuid = {D48ABA40-866E-4A92-B9F1-24BE0CC05649} EndGlobalSection EndGlobal diff --git a/BadMC_Launcher/App.xaml b/BadMC_Launcher/App.xaml index 0dd7db5..1a243b6 100644 --- a/BadMC_Launcher/App.xaml +++ b/BadMC_Launcher/App.xaml @@ -20,7 +20,10 @@ + + + diff --git a/BadMC_Launcher/App.xaml.cs b/BadMC_Launcher/App.xaml.cs index 717507c..c0e87c3 100644 --- a/BadMC_Launcher/App.xaml.cs +++ b/BadMC_Launcher/App.xaml.cs @@ -1,50 +1,43 @@ -using BadMC_Launcher.Classes; using BadMC_Launcher.Controls; using BadMC_Launcher.Controls.MainSearch; using BadMC_Launcher.Models.Data; -using BadMC_Launcher.Services.Settings; +using BadMC_Launcher.Services.Configs; using BadMC_Launcher.Services.ViewServices; -using BadMC_Launcher.ViewModels.ContentDialogs.Settings; -using BadMC_Launcher.ViewModels.Pages; using BadMC_Launcher.Views.ContentDialogs.Settings; -using BadMC_Launcher.Views.Pages; using BadMC_Launcher.Views.Pages.Settings; -using Microsoft.Extensions.DependencyInjection.Extensions; +using BadMC_Launcher.Views.Pages; using Microsoft.UI; using Microsoft.UI.Xaml.Controls.AnimatedVisuals; -using Microsoft.UI.Xaml.Media.Imaging; -using Microsoft.Windows.ApplicationModel.Resources; using Serilog; using Uno.Resizetizer; -using Windows.Globalization; namespace BadMC_Launcher; -public partial class - App : Application { +public partial class App : Application +{ /// /// Initializes the singleton application object. This is the first line of authored code /// executed, and as such is the logical equivalent of main() or WinMain(). /// - public App() { - InitializeComponent(); - //ApplicationLanguages.PrimaryLanguageOverride = "zh-Hans"; - + public App() + { + this.InitializeComponent(); } public static new App Current => (App)Application.Current; - public Window? MainWindow { get; private set; } + internal Window? MainWindow { get; private set; } + internal IHost? Host { get; private set; } - public IHost? Host { get; private set; } - - protected override void OnLaunched(LaunchActivatedEventArgs args) { + protected override void OnLaunched(LaunchActivatedEventArgs args) + { var builder = this.CreateBuilder(args) .Configure(host => host #if DEBUG // Switch to Development environment when running in DEBUG .UseEnvironment(Environments.Development) #endif - .UseLogging(configure: (context, logBuilder) => { + .UseLogging(configure: (context, logBuilder) => + { // Configure log levels for different categories of logging logBuilder .SetMinimumLevel( @@ -53,7 +46,7 @@ protected override void OnLaunched(LaunchActivatedEventArgs args) { LogLevel.Warning) // Default filters for core Uno Platform namespaces - .CoreLogLevel(LogLevel.Information); + .CoreLogLevel(LogLevel.Warning); // Uno Platform namespace filter groups // Uncomment individual methods to see more detailed logging @@ -68,7 +61,7 @@ protected override void OnLaunched(LaunchActivatedEventArgs args) { //// Binder memory references tracking //logBuilder.BinderMemoryReferenceLogLevel(LogLevel.Debug); //// DevServer and HotReload related - //logBuilder.HotReloadCoreLogLevel(LogLevel.Debug); + //logBuilder.HotReloadCoreLogLevel(LogLevel.Information); //// Debug JS interop //logBuilder.WebAssemblyLogLevel(LogLevel.Debug); @@ -78,12 +71,13 @@ protected override void OnLaunched(LaunchActivatedEventArgs args) { .MinimumLevel.Error() .WriteTo.Console() .WriteTo.File( - path: Path.Combine(AppDataPath.LogsPath, "AppLog.log"), // 更改日志文件的存储位置 + path: Path.Combine(AppDataPath.LogsPath, "AppLog.log"), rollingInterval: RollingInterval.Day, retainedFileCountLimit: 10 ); }) - .ConfigureServices((context, services) => { + .ConfigureServices((context, services) => + { // TODO: Register your services //Register third-party class services.AddSingleton(); @@ -91,51 +85,51 @@ protected override void OnLaunched(LaunchActivatedEventArgs args) { services.AddTransient(); - //Regist class + //Register class services.AddSingleton(); services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); - services.AddTransient(); + services.AddTransient(); //Register ContentDialogs services.AddTransient(); services.AddTransient(); - }) ); MainWindow = builder.Window; + +#if DEBUG + MainWindow.UseStudio(); +#endif + MainWindow.SetWindowIcon(); + Host = builder.Build(); - //Get Configs + // Get Configs GetSettings(); - //Regist Pages + // Register Pages GlobalRegister(); //Set MainWindow Configs - MainWindow.AppWindow.Title = GetService().WindowName; + MainWindow.AppWindow.Title = GetService().WindowName; MainWindow.AppWindow.Resize(AppParameters.WindowSize); MainWindow.AppWindow.TitleBar.ExtendsContentIntoTitleBar = true; - //TODO: 要是Uno Platform 3月还没回信,那自定义拖拽区域估计只能自己写啦(悲)不过Desktop的三大金刚键肯定得自己写啦(大悲) + // TODO: 不等了拖拽三大金刚自己写(恼) #if WINDOWS MainWindow.AppWindow.TitleBar.ButtonBackgroundColor = Colors.Transparent; MainWindow.AppWindow.TitleBar.ButtonInactiveBackgroundColor = Colors.Transparent; - -#endif - -#if DEBUG - MainWindow.UseStudio(); #endif - MainWindow.SetWindowIcon(); // Do not repeat app initialization when the Window already has content, // just ensure that the window is active - if (MainWindow.Content is not Frame rootFrame) { + if (MainWindow.Content is not Frame rootFrame) + { // Create a Frame to act as the navigation context and navigate to the first page rootFrame = new Frame(); @@ -143,7 +137,8 @@ protected override void OnLaunched(LaunchActivatedEventArgs args) { MainWindow.Content = rootFrame; } - if (rootFrame.Content == null) { + if (rootFrame.Content == null) + { // When the navigation stack isn't restored navigate to the first page, // configuring the new page by passing required information as a navigation // parameter @@ -168,10 +163,10 @@ public static T GetService() { } private static void GetSettings() { - GetService().SyncSettingGet(); - GetService().IsSyncEnabled = true; - GetService().SyncSettingGet(); - GetService().isSyncEnabled = true; + GetService().SyncSettingGet(); + GetService().IsSyncEnabled = true; + GetService().SyncSettingGet(); + GetService().isSyncEnabled = true; } private void GlobalRegister() { diff --git a/BadMC_Launcher/Assets/SharedAssets.md b/BadMC_Launcher/Assets/SharedAssets.md index 1b84a74..b1cc4e7 100644 --- a/BadMC_Launcher/Assets/SharedAssets.md +++ b/BadMC_Launcher/Assets/SharedAssets.md @@ -22,7 +22,7 @@ See documentation about assets here: https://github.com/unoplatform/uno/blob/mas ### Table of scales -| Scale | WinUI | iOS/MacCatalyst | Android | +| Scale | WinUI | iOS | Android | |-------|:-----------:|:---------------:|:-------:| | `100` | scale-100 | @1x | mdpi | | `125` | scale-125 | N/A | N/A | diff --git a/BadMC_Launcher/BadMC_Launcher.csproj b/BadMC_Launcher/BadMC_Launcher.csproj index 2fb1a5e..c45aa2b 100644 --- a/BadMC_Launcher/BadMC_Launcher.csproj +++ b/BadMC_Launcher/BadMC_Launcher.csproj @@ -1,39 +1,38 @@  - net9.0-windows10.0.26100;net9.0-desktop;net9.0-maccatalyst;net9.0 - preview + net9.0-windows10.0.26100;net9.0-desktop;net9.0 Exe true - false + preview BadMC_Launcher - + Assets\Icons\appicon_foreground.png Assets\Icons\appicon_background.png 0.6 - org.BadBC.BadMC_Launcher + org.BadBC.BadMCLauncher 1.0 1 - Starcloudsea + BadBC BadMC_Launcher powered by Uno Platform. - - diff --git a/BadMC_Launcher/Platforms/MacCatalyst/Main.maccatalyst.cs b/BadMC_Launcher/Platforms/MacCatalyst/Main.maccatalyst.cs deleted file mode 100644 index 62fa522..0000000 --- a/BadMC_Launcher/Platforms/MacCatalyst/Main.maccatalyst.cs +++ /dev/null @@ -1,13 +0,0 @@ -using UIKit; - -namespace BadMC_Launcher.MacCatalyst; -public class EntryPoint -{ - // This is the main entry point of the application. - public static void Main(string[] args) - { - // if you want to use a different Application Delegate class from "AppDelegate" - // you can specify it here. - UIApplication.Main(args, null, typeof(App)); - } -} diff --git a/BadMC_Launcher/Platforms/MacCatalyst/Media.xcassets/LaunchImages.launchimage/Contents.json b/BadMC_Launcher/Platforms/MacCatalyst/Media.xcassets/LaunchImages.launchimage/Contents.json deleted file mode 100644 index 69555e4..0000000 --- a/BadMC_Launcher/Platforms/MacCatalyst/Media.xcassets/LaunchImages.launchimage/Contents.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "images": [ - { - "orientation": "portrait", - "extent": "full-screen", - "minimum-system-version": "7.0", - "scale": "2x", - "size": "640x960", - "idiom": "iphone" - }, - { - "orientation": "portrait", - "extent": "full-screen", - "minimum-system-version": "7.0", - "subtype": "retina4", - "scale": "2x", - "size": "640x1136", - "idiom": "iphone" - }, - { - "orientation": "portrait", - "extent": "full-screen", - "minimum-system-version": "7.0", - "scale": "1x", - "size": "768x1024", - "idiom": "ipad" - }, - { - "orientation": "landscape", - "extent": "full-screen", - "minimum-system-version": "7.0", - "scale": "1x", - "size": "1024x768", - "idiom": "ipad" - }, - { - "orientation": "portrait", - "extent": "full-screen", - "minimum-system-version": "7.0", - "scale": "2x", - "size": "1536x2048", - "idiom": "ipad" - }, - { - "orientation": "landscape", - "extent": "full-screen", - "minimum-system-version": "7.0", - "scale": "2x", - "size": "2048x1536", - "idiom": "ipad" - } - ], - "properties": {}, - "info": { - "version": 1, - "author": "" - } -} \ No newline at end of file diff --git a/BadMC_Launcher/Properties/PublishProfiles/win-arm64-clickonce.pubxml b/BadMC_Launcher/Properties/PublishProfiles/win-arm64-clickonce.pubxml deleted file mode 100644 index fb4490d..0000000 --- a/BadMC_Launcher/Properties/PublishProfiles/win-arm64-clickonce.pubxml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - 0 - 0.0.1.* - True - Release - False - true - True - Disk - True - False - True - False - arm64 - ClickOnce - True - False - win-arm64 - True - (none) - False - False - net9.0-desktop - True - Background - False - Publish.html - - - - - True - .NET Desktop Runtime 9.0.201 (arm64) - - - diff --git a/BadMC_Launcher/Properties/PublishProfiles/win-arm64.pubxml b/BadMC_Launcher/Properties/PublishProfiles/win-arm64.pubxml index 45aafd5..5d5632a 100644 --- a/BadMC_Launcher/Properties/PublishProfiles/win-arm64.pubxml +++ b/BadMC_Launcher/Properties/PublishProfiles/win-arm64.pubxml @@ -1,4 +1,4 @@ - + @@ -8,7 +8,7 @@ https://go.microsoft.com/fwlink/?LinkID=208121. arm64 win-arm64 bin\$(Configuration)\$(TargetFramework)\$(RuntimeIdentifier)\publish\ - True + true False False True diff --git a/BadMC_Launcher/Properties/PublishProfiles/win-x64-clickonce.pubxml b/BadMC_Launcher/Properties/PublishProfiles/win-x64-clickonce.pubxml deleted file mode 100644 index 454ec9b..0000000 --- a/BadMC_Launcher/Properties/PublishProfiles/win-x64-clickonce.pubxml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - 0 - 0.0.1.* - True - Release - False - True - True - Disk - True - False - True - False - x64 - ClickOnce - True - False - win-x64 - True - (none) - False - False - net9.0-desktop - True - Background - False - Publish.html - - - - - True - .NET Desktop Runtime 9.0.201 (x64) - - - diff --git a/BadMC_Launcher/Properties/PublishProfiles/win-x64.pubxml b/BadMC_Launcher/Properties/PublishProfiles/win-x64.pubxml index 2b62d55..12b8344 100644 --- a/BadMC_Launcher/Properties/PublishProfiles/win-x64.pubxml +++ b/BadMC_Launcher/Properties/PublishProfiles/win-x64.pubxml @@ -1,19 +1,18 @@ - + - - FileSystem - x64 - win-x64 - True - False - False - False - Release - net9.0-desktop - false - true - + + FileSystem + x64 + win-x64 + bin\$(Configuration)\$(TargetFramework)\$(RuntimeIdentifier)\publish\ + true + False + False + True + False + True + diff --git a/BadMC_Launcher/Properties/PublishProfiles/win-x86.pubxml b/BadMC_Launcher/Properties/PublishProfiles/win-x86.pubxml new file mode 100644 index 0000000..65b8f1d --- /dev/null +++ b/BadMC_Launcher/Properties/PublishProfiles/win-x86.pubxml @@ -0,0 +1,23 @@ + + + + + FileSystem + x86 + win-x86 + bin\$(Configuration)\$(TargetFramework)\$(RuntimeIdentifier)\publish\ + true + False + False + True + False + True + + + diff --git a/BadMC_Launcher/ReadMe.md b/BadMC_Launcher/ReadMe.md new file mode 100644 index 0000000..93482da --- /dev/null +++ b/BadMC_Launcher/ReadMe.md @@ -0,0 +1,7 @@ +# Getting Started + +Welcome to the Uno Platform! + +To discover how to get started with your new app: https://aka.platform.uno/get-started + +For more information on how to use the Uno.Sdk or upgrade Uno Platform packages in your solution: https://aka.platform.uno/using-uno-sdk \ No newline at end of file diff --git a/BadMC_Launcher/Services/Settings/MinecraftConfigService.cs b/BadMC_Launcher/Services/Configs/MinecraftConfigsService.cs similarity index 58% rename from BadMC_Launcher/Services/Settings/MinecraftConfigService.cs rename to BadMC_Launcher/Services/Configs/MinecraftConfigsService.cs index 73e4415..2a42795 100644 --- a/BadMC_Launcher/Services/Settings/MinecraftConfigService.cs +++ b/BadMC_Launcher/Services/Configs/MinecraftConfigsService.cs @@ -8,24 +8,24 @@ using BadMC_Launcher.Models.Enums; using MinecraftLaunch.Base.Models.Authentication; -namespace BadMC_Launcher.Services.Settings; -public class MinecraftConfigService : ConfigClass { +namespace BadMC_Launcher.Services.Configs; +public class MinecraftConfigsService : ConfigClass { internal bool IsSyncEnabled = false; - public MinecraftConfigService() { + public MinecraftConfigsService() { //Triggers an event when a property is changed - MinecraftConfig.minecraftAccounts.ListChanged += OnListChanged; - MinecraftConfig.javaPaths.ListChanged += OnListChanged; - MinecraftConfig.minecraftFolders.ListChanged += OnListChanged; - MinecraftConfig.jvmArguments.ListChanged += OnListChanged; + MinecraftConfigs.minecraftAccounts.ListChanged += OnListChanged; + MinecraftConfigs.javaPaths.ListChanged += OnListChanged; + MinecraftConfigs.minecraftFolders.ListChanged += OnListChanged; + MinecraftConfigs.jvmArguments.ListChanged += OnListChanged; } public DistinctiveItemBindingList MinecraftAccounts { - get => MinecraftConfig.minecraftAccounts; + get => MinecraftConfigs.minecraftAccounts; set { - if (!MinecraftConfig.minecraftAccounts.SequenceEqual(value)) { - MinecraftConfig.minecraftAccounts.Clear(); - MinecraftConfig.minecraftAccounts.MargeItems(value); + if (!MinecraftConfigs.minecraftAccounts.SequenceEqual(value)) { + MinecraftConfigs.minecraftAccounts.Clear(); + MinecraftConfigs.minecraftAccounts.MargeItems(value); // Write to Json SyncSettingSet(); @@ -35,19 +35,19 @@ public DistinctiveItemBindingList MinecraftAccounts { public DistinctiveItemBindingList JavaPaths { get { // Check if the Java folder exists - foreach (var item in MinecraftConfig.javaPaths.ToList()) { + foreach (var item in MinecraftConfigs.javaPaths.ToList()) { if (!Path.Exists(item)) { - MinecraftConfig.javaPaths.Remove(item); + MinecraftConfigs.javaPaths.Remove(item); // TODO: Tip Toast } } - return MinecraftConfig.javaPaths; + return MinecraftConfigs.javaPaths; } set { - if (!MinecraftConfig.javaPaths.SequenceEqual(value)) { - MinecraftConfig.javaPaths.Clear(); - MinecraftConfig.javaPaths.MargeItems(value); + if (!MinecraftConfigs.javaPaths.SequenceEqual(value)) { + MinecraftConfigs.javaPaths.Clear(); + MinecraftConfigs.javaPaths.MargeItems(value); // Write to Json SyncSettingSet(); @@ -57,19 +57,19 @@ public DistinctiveItemBindingList JavaPaths { public DistinctiveItemBindingList MinecraftFolders { get { // Check if the Minecraft folder exists - foreach (var item in MinecraftConfig.minecraftFolders.ToList()) { + foreach (var item in MinecraftConfigs.minecraftFolders.ToList()) { if (!Path.Exists(item.MinecraftFolderPath)) { - MinecraftConfig.minecraftFolders.Remove(item); + MinecraftConfigs.minecraftFolders.Remove(item); // TODO: Tip Toast } } - return MinecraftConfig.minecraftFolders; + return MinecraftConfigs.minecraftFolders; } set { - if (!MinecraftConfig.minecraftFolders.SequenceEqual(value)) { - MinecraftConfig.minecraftFolders.Clear(); - MinecraftConfig.minecraftFolders.MargeItems(value); + if (!MinecraftConfigs.minecraftFolders.SequenceEqual(value)) { + MinecraftConfigs.minecraftFolders.Clear(); + MinecraftConfigs.minecraftFolders.MargeItems(value); // Write to Json SyncSettingSet(); @@ -78,15 +78,15 @@ public DistinctiveItemBindingList MinecraftFolders { } public string? ActiveJavaPath { - get => MinecraftConfig.activeJavaPath; + get => MinecraftConfigs.activeJavaPath; set { // Check folder is existing if (!Path.Exists(value)) { - MinecraftConfig.activeJavaPath = string.Empty; + MinecraftConfigs.activeJavaPath = string.Empty; // TODO: Tip Toast } else { - MinecraftConfig.activeJavaPath = value; + MinecraftConfigs.activeJavaPath = value; } // Trigger Event @@ -98,15 +98,15 @@ public string? ActiveJavaPath { } public string? ActiveMinecraftFolderPath { - get => MinecraftConfig.activeMinecraftFolder; + get => MinecraftConfigs.activeMinecraftFolder; set { // Check folder is existing if (!Path.Exists(value)) { - MinecraftConfig.activeMinecraftFolder = string.Empty; + MinecraftConfigs.activeMinecraftFolder = string.Empty; // TODO: Tip Toast } else { - MinecraftConfig.activeMinecraftFolder = value; + MinecraftConfigs.activeMinecraftFolder = value; } // Trigger Event @@ -118,10 +118,10 @@ public string? ActiveMinecraftFolderPath { } public Account? ActiveMinecraftAccount { - get => MinecraftConfig.activeMinecraftAccount; + get => MinecraftConfigs.activeMinecraftAccount; set { - if (MinecraftConfig.activeMinecraftAccount != value) { - MinecraftConfig.activeMinecraftAccount = value; + if (MinecraftConfigs.activeMinecraftAccount != value) { + MinecraftConfigs.activeMinecraftAccount = value; // Trigger Event OnPropertyChanged(nameof(ActiveMinecraftAccount)); @@ -133,10 +133,10 @@ public Account? ActiveMinecraftAccount { } public bool IsAutoJavaEnabled { - get => MinecraftConfig.isAutoJavaEnabled; + get => MinecraftConfigs.isAutoJavaEnabled; set { - if (MinecraftConfig.isAutoJavaEnabled != value) { - MinecraftConfig.isAutoJavaEnabled = value; + if (MinecraftConfigs.isAutoJavaEnabled != value) { + MinecraftConfigs.isAutoJavaEnabled = value; // Trigger Event OnPropertyChanged(nameof(IsAutoJavaEnabled)); @@ -148,10 +148,10 @@ public bool IsAutoJavaEnabled { } public bool IsFullscreen { - get => MinecraftConfig.isFullscreen; + get => MinecraftConfigs.isFullscreen; set { - if (MinecraftConfig.isFullscreen != value) { - MinecraftConfig.isFullscreen = value; + if (MinecraftConfigs.isFullscreen != value) { + MinecraftConfigs.isFullscreen = value; // Trigger Event OnPropertyChanged(nameof(IsFullscreen)); @@ -162,14 +162,14 @@ public bool IsFullscreen { } } - public IndependencyCoreEnum IndependencyCore { - get => MinecraftConfig.independencyCore; + public VersionIsolationEnum VersionIsolation { + get => MinecraftConfigs.VersionIsolation; set { - if (MinecraftConfig.independencyCore != value) { - MinecraftConfig.independencyCore = value; + if (MinecraftConfigs.VersionIsolation != value) { + MinecraftConfigs.VersionIsolation = value; // Trigger Event - OnPropertyChanged(nameof(IndependencyCore)); + OnPropertyChanged(nameof(VersionIsolation)); //Write to Json SyncSettingSet(); @@ -178,10 +178,10 @@ public IndependencyCoreEnum IndependencyCore { } public bool IsAutoMemorySize { - get => MinecraftConfig.isAutoMemorySize; + get => MinecraftConfigs.isAutoMemorySize; set { - if (MinecraftConfig.isAutoMemorySize != value) { - MinecraftConfig.isAutoMemorySize = value; + if (MinecraftConfigs.isAutoMemorySize != value) { + MinecraftConfigs.isAutoMemorySize = value; // Trigger Event OnPropertyChanged(nameof(IsAutoMemorySize)); @@ -193,18 +193,18 @@ public bool IsAutoMemorySize { } public uint MaxGameMemory { - get => MinecraftConfig.maxGameMemory; + get => MinecraftConfigs.maxGameMemory; set { - if (MinecraftConfig.maxGameMemory != value) { + if (MinecraftConfigs.maxGameMemory != value) { // Check max game memory AppParameters.SystemInfo.RefreshMemoryStatus(); - if (value == 0 || value > AppParameters.SystemInfo.MemoryStatus.TotalPhysical.BytesToMb() || value <= MinecraftConfig.minGameMemory) { + if (value == 0 || value > AppParameters.SystemInfo.MemoryStatus.TotalPhysical.BytesToMb() || value <= MinecraftConfigs.minGameMemory) { // TODO: Toast Tips OnPropertyChanged(nameof(MaxGameMemory)); return; } - MinecraftConfig.maxGameMemory = value; + MinecraftConfigs.maxGameMemory = value; // Trigger Event OnPropertyChanged(nameof(MaxGameMemory)); @@ -216,18 +216,18 @@ public uint MaxGameMemory { } public uint MinGameMemory { - get => MinecraftConfig.minGameMemory; + get => MinecraftConfigs.minGameMemory; set { - if (MinecraftConfig.minGameMemory != value) { + if (MinecraftConfigs.minGameMemory != value) { // Check min game memory AppParameters.SystemInfo.RefreshMemoryStatus(); - if (value == 0 || value > AppParameters.SystemInfo.MemoryStatus.TotalPhysical.BytesToMb() || value >= MinecraftConfig.maxGameMemory) { + if (value == 0 || value > AppParameters.SystemInfo.MemoryStatus.TotalPhysical.BytesToMb() || value >= MinecraftConfigs.maxGameMemory) { // TODO: Toast Tips OnPropertyChanged(nameof(MinGameMemory)); return; } - MinecraftConfig.minGameMemory = value; + MinecraftConfigs.minGameMemory = value; // Trigger Event OnPropertyChanged(nameof(MinGameMemory)); @@ -240,10 +240,10 @@ public uint MinGameMemory { } public string? LauncherName { - get => MinecraftConfig.launcherName; + get => MinecraftConfigs.launcherName; set { - if (MinecraftConfig.launcherName != value) { - MinecraftConfig.launcherName = value; + if (MinecraftConfigs.launcherName != value) { + MinecraftConfigs.launcherName = value; // Trigger Event OnPropertyChanged(nameof(LauncherName)); @@ -255,15 +255,15 @@ public string? LauncherName { } public BindingList JvmArguments { - get => MinecraftConfig.jvmArguments; + get => MinecraftConfigs.jvmArguments; set { - if (!MinecraftConfig.jvmArguments.SequenceEqual(value)) { - MinecraftConfig.jvmArguments.RaiseListChangedEvents = false; + if (!MinecraftConfigs.jvmArguments.SequenceEqual(value)) { + MinecraftConfigs.jvmArguments.RaiseListChangedEvents = false; - MinecraftConfig.jvmArguments.Clear(); - MinecraftConfig.jvmArguments.AddRange(value); + MinecraftConfigs.jvmArguments.Clear(); + MinecraftConfigs.jvmArguments.AddRange(value); - MinecraftConfig.jvmArguments.RaiseListChangedEvents = true; + MinecraftConfigs.jvmArguments.RaiseListChangedEvents = true; // Write to Json SyncSettingSet(); @@ -301,18 +301,18 @@ private void OnListChanged(object? sender, ListChangedEventArgs e) { } public override bool SyncSettingGet() { - if (App.GetService().TryReadConfig(Path.Combine(AppDataPath.ConfigsPath, "MinecraftConfigs.json"), MinecraftConfigServiceContext.Default.MinecraftConfigService, out var jsonClass, UpdateMapping.minecraftConfigPropertyNameMapping, UpdateMapping.minecraftConfigPropertyTypeMapping) && jsonClass != null) { + if (App.GetService().TryReadConfig(Path.Combine(AppDataPath.ConfigsPath, "MinecraftConfigs.json"), MinecraftConfigsServiceContext.Default.MinecraftConfigsService, out var jsonClass, UpdateMapping.minecraftConfigPropertyNameMapping, UpdateMapping.minecraftConfigPropertyTypeMapping) && jsonClass != null) { //TODO: 解蜜 - MinecraftConfig.activeJavaPath = jsonClass.ActiveJavaPath; - MinecraftConfig.activeMinecraftFolder = jsonClass.ActiveMinecraftFolderPath; + MinecraftConfigs.activeJavaPath = jsonClass.ActiveJavaPath; + MinecraftConfigs.activeMinecraftFolder = jsonClass.ActiveMinecraftFolderPath; //MinecraftConfig.activeMinecraftAccount = jsonClass.ActiveMinecraftAccount; - MinecraftConfig.isAutoJavaEnabled = jsonClass.IsAutoJavaEnabled; - MinecraftConfig.isFullscreen = jsonClass.IsFullscreen; - MinecraftConfig.independencyCore = jsonClass.IndependencyCore; - MinecraftConfig.isAutoMemorySize = jsonClass.IsAutoMemorySize; - MinecraftConfig.minGameMemory = jsonClass.MinGameMemory; - MinecraftConfig.maxGameMemory = jsonClass.MaxGameMemory; - MinecraftConfig.launcherName = jsonClass.LauncherName; + MinecraftConfigs.isAutoJavaEnabled = jsonClass.IsAutoJavaEnabled; + MinecraftConfigs.isFullscreen = jsonClass.IsFullscreen; + MinecraftConfigs.VersionIsolation = jsonClass.VersionIsolation; + MinecraftConfigs.isAutoMemorySize = jsonClass.IsAutoMemorySize; + MinecraftConfigs.minGameMemory = jsonClass.MinGameMemory; + MinecraftConfigs.maxGameMemory = jsonClass.MaxGameMemory; + MinecraftConfigs.launcherName = jsonClass.LauncherName; return true; } @@ -323,12 +323,12 @@ public override bool SyncSettingSet() { if (IsSyncEnabled == false) { return false; } - MinecraftConfigService classValue = this; + MinecraftConfigsService classValue = this; //TODO: 加蜜 - return App.GetService().WriteConfig(Path.Combine(AppDataPath.ConfigsPath, "MinecraftConfigs.json"), MinecraftConfigServiceContext.Default.MinecraftConfigService, classValue); + return App.GetService().WriteConfig(Path.Combine(AppDataPath.ConfigsPath, "MinecraftConfigs.json"), MinecraftConfigsServiceContext.Default.MinecraftConfigsService, classValue); } } [JsonSourceGenerationOptions(WriteIndented = true)] -[JsonSerializable(typeof(MinecraftConfigService))] -internal partial class MinecraftConfigServiceContext : JsonSerializerContext; +[JsonSerializable(typeof(MinecraftConfigsService))] +internal partial class MinecraftConfigsServiceContext : JsonSerializerContext; diff --git a/BadMC_Launcher/Services/Settings/SingleMinecraftConfigService.cs b/BadMC_Launcher/Services/Configs/SingleMinecraftConfigsService.cs similarity index 83% rename from BadMC_Launcher/Services/Settings/SingleMinecraftConfigService.cs rename to BadMC_Launcher/Services/Configs/SingleMinecraftConfigsService.cs index 778c505..593bb8e 100644 --- a/BadMC_Launcher/Services/Settings/SingleMinecraftConfigService.cs +++ b/BadMC_Launcher/Services/Configs/SingleMinecraftConfigsService.cs @@ -8,14 +8,15 @@ using System.Threading.Tasks; using BadMC_Launcher.Classes; using BadMC_Launcher.Extensions; +using BadMC_Launcher.Models.Data; using BadMC_Launcher.Models.Data.SettingsData; using MinecraftLaunch.Base.Models.Game; -namespace BadMC_Launcher.Services.Settings; -public class SingleMinecraftConfigService : ConfigClass { - private readonly SingleMinecraftConfig singleMinecraftConfigInstance = new(); +namespace BadMC_Launcher.Services.Configs; +public class SingleMinecraftConfigsService : ConfigClass { + private readonly SingleMinecraftConfigs singleMinecraftConfigInstance = new(); - public SingleMinecraftConfigService() { + public SingleMinecraftConfigsService() { JvmArguments.ListChanged += OnListChanged; } @@ -64,14 +65,14 @@ public bool? IsFullscreen { } } - public bool? IsEnableIndependencyCore { - get => singleMinecraftConfigInstance.isEnableIndependencyCore; + public bool? IsEnableVersionIsolation { + get => singleMinecraftConfigInstance.isEnableVersionIsolation; set { - if (singleMinecraftConfigInstance.isEnableIndependencyCore != value) { - singleMinecraftConfigInstance.isEnableIndependencyCore = value; + if (singleMinecraftConfigInstance.isEnableVersionIsolation != value) { + singleMinecraftConfigInstance.isEnableVersionIsolation = value; // Trigger Event - OnPropertyChanged(nameof(IsEnableIndependencyCore)); + OnPropertyChanged(nameof(IsEnableVersionIsolation)); // Write to Json SyncSettingSet(); @@ -181,9 +182,9 @@ private void OnListChanged(object? sender, ListChangedEventArgs e) { public override bool SyncSettingGet() { if(TargetMinecraftEntryPath != null && File.Exists(Path.Combine(TargetMinecraftEntryPath, @"BadBCConfigs\MinecraftConfig.json")) - && App.GetService().TryReadConfig(Path.Combine(TargetMinecraftEntryPath, @"BadBCConfigs\MinecraftConfig.json"), SingleMinecraftConfigServiceContext.Default.SingleMinecraftConfigService, out var jsonClass) && jsonClass != null) { + && App.GetService().TryReadConfig(Path.Combine(TargetMinecraftEntryPath, @$"{AppDataPath.VersionPath}\MinecraftConfigs.json"), SingleMinecraftConfigsServiceContext.Default.SingleMinecraftConfigsService, out var jsonClass) && jsonClass != null) { singleMinecraftConfigInstance.isFullscreen = jsonClass.IsFullscreen; - singleMinecraftConfigInstance.isEnableIndependencyCore = jsonClass.IsEnableIndependencyCore; + singleMinecraftConfigInstance.isEnableVersionIsolation = jsonClass.IsEnableVersionIsolation; singleMinecraftConfigInstance.isAutoMemorySize = jsonClass.IsAutoMemorySize; singleMinecraftConfigInstance.minMemorySize = jsonClass.MinMemorySize; singleMinecraftConfigInstance.maxMemorySize = jsonClass.MaxMemorySize; @@ -198,7 +199,7 @@ public override bool SyncSettingGet() { public override bool SyncSettingSet() { if (TargetMinecraftEntryPath != null) { - return App.GetService().WriteConfig(Path.Combine(TargetMinecraftEntryPath, @"BadBCConfigs\MinecraftConfig.json"), SingleMinecraftConfigServiceContext.Default.SingleMinecraftConfigService, this); + return App.GetService().WriteConfig(Path.Combine(TargetMinecraftEntryPath, @$"{AppDataPath.VersionPath}\MinecraftConfigs.json"), SingleMinecraftConfigsServiceContext.Default.SingleMinecraftConfigsService, this); } //TODO: Toast return false; @@ -206,5 +207,5 @@ public override bool SyncSettingSet() { } [JsonSourceGenerationOptions(WriteIndented = true)] -[JsonSerializable(typeof(SingleMinecraftConfigService))] -internal partial class SingleMinecraftConfigServiceContext : JsonSerializerContext; +[JsonSerializable(typeof(SingleMinecraftConfigsService))] +internal partial class SingleMinecraftConfigsServiceContext : JsonSerializerContext; diff --git a/BadMC_Launcher/Services/Settings/ThemeSettingService.cs b/BadMC_Launcher/Services/Configs/ThemeConfigsService.cs similarity index 55% rename from BadMC_Launcher/Services/Settings/ThemeSettingService.cs rename to BadMC_Launcher/Services/Configs/ThemeConfigsService.cs index 65936ca..3a53189 100644 --- a/BadMC_Launcher/Services/Settings/ThemeSettingService.cs +++ b/BadMC_Launcher/Services/Configs/ThemeConfigsService.cs @@ -14,33 +14,30 @@ using CommunityToolkit.Mvvm.Messaging.Messages; using Microsoft.UI.Xaml.Media.Imaging; -namespace BadMC_Launcher.Services.Settings; -public class ThemeSettingService : ConfigClass { +namespace BadMC_Launcher.Services.Configs; +public class ThemeConfigsService : ConfigClass { internal bool isSyncEnabled = false; public BackgroundTypeEnum BackgroundType { - get => ThemeSetting.backgroundType; + get => ThemeConfigs.backgroundType; set { - if (ThemeSetting.backgroundType != value) { - ThemeSetting.backgroundType = value; + if (ThemeConfigs.backgroundType != value) { + ThemeConfigs.backgroundType = value; // Trigger Event OnPropertyChanged(nameof(BackgroundType)); // Sync Setting SyncSettingSet(); - - // Set Background - SetBackground(); } } } public ThemeTypeEnum ThemeType { - get => ThemeSetting.themeType; + get => ThemeConfigs.themeType; set { - if (ThemeSetting.themeType != value) { - ThemeSetting.themeType = value; + if (ThemeConfigs.themeType != value) { + ThemeConfigs.themeType = value; // Trigger Event OnPropertyChanged(nameof(ThemeType)); @@ -52,132 +49,111 @@ public ThemeTypeEnum ThemeType { } public string ImageBackgroundName { - get => ThemeSetting.imageBackgroundName; + get => ThemeConfigs.imageBackgroundName; set { - if (ThemeSetting.imageBackgroundName != value) { - ThemeSetting.imageBackgroundName = value; + if (ThemeConfigs.imageBackgroundName != value) { + ThemeConfigs.imageBackgroundName = value; // Trigger Event OnPropertyChanged(nameof(ImageBackgroundName)); // Sync Setting SyncSettingSet(); - - // Set Background - SetBackground(); } } } public Stretch BackgroundStretch { - get => ThemeSetting.backgroundStretch; + get => ThemeConfigs.backgroundStretch; set { - if (ThemeSetting.backgroundStretch != value) { - ThemeSetting.backgroundStretch = value; + if (ThemeConfigs.backgroundStretch != value) { + ThemeConfigs.backgroundStretch = value; // Trigger Event OnPropertyChanged(nameof(BackgroundStretch)); // Sync Setting SyncSettingSet(); - - // Set Background - SetBackground(); } } } public string SolidColorBackgroundCode { - get => ThemeSetting.solidColorBackgroundCode; + get => ThemeConfigs.solidColorBackgroundCode; set { - if (ThemeSetting.solidColorBackgroundCode != value) { - ThemeSetting.solidColorBackgroundCode = value; + if (ThemeConfigs.solidColorBackgroundCode != value) { + ThemeConfigs.solidColorBackgroundCode = value; // Trigger Event OnPropertyChanged(nameof(SolidColorBackgroundCode)); // Sync Setting SyncSettingSet(); - - // Set Background - SetBackground(); } } } public string WindowName { - get => ThemeSetting.windowName; + get => ThemeConfigs.windowName; set { - if (ThemeSetting.windowName != value) { - ThemeSetting.windowName = value; + if (ThemeConfigs.windowName != value) { + ThemeConfigs.windowName = value; // Trigger Event OnPropertyChanged(nameof(WindowName)); - - // Sync Setting - SyncSettingSet(); } } } - public async void SetBackground(Action? backgroundChanged = null) { - if (backgroundChanged == null) { - //TODO: 这应该得从代码介入了,应该得Dialog( - return; - } + public async Task SetBackground(BackgroundTypeEnum backgroundType) { App.GetService().CheckPath(Path.Combine(AppDataPath.AssetsPath, "Wallpapers"), false); - switch (ThemeSetting.backgroundType) { - case BackgroundTypeEnum.SolidColor: - var color = ColorTranslator.FromHtml(ThemeSetting.solidColorBackgroundCode); - SetBrush(Windows.UI.Color.FromArgb(color.A, color.R, color.G, color.B), backgroundChanged); - break; + switch (backgroundType) { case BackgroundTypeEnum.StaticImage: - if (string.IsNullOrWhiteSpace(ThemeSetting.imageBackgroundName)) { + if (string.IsNullOrWhiteSpace(ThemeConfigs.imageBackgroundName)) { //TODO :Dialog EXCEPTION - return; + return SetBrush(Windows.UI.Color.FromArgb(0, 119, 255, 1)); ; } - SetBrush(new BitmapImage(new Uri(Path.Combine(AppDataPath.AssetsPath, "Wallpapers", ThemeSetting.imageBackgroundName))), backgroundChanged); - break; + return SetBrush(new BitmapImage(new Uri(Path.Combine(AppDataPath.AssetsPath, "Wallpapers", ThemeConfigs.imageBackgroundName)))); case BackgroundTypeEnum.BingWallpaper: - SetBrush(new BitmapImage(new Uri(await GetBingWallpaperUrl())), backgroundChanged); - break; + return SetBrush(new BitmapImage(new Uri(await GetBingWallpaperUrl()))); case BackgroundTypeEnum.Acrylic: //TODO: Only MacOS - break; + return SetBrush(Windows.UI.Color.FromArgb(0, 119, 255, 1)); + default: + var color = ColorTranslator.FromHtml(ThemeConfigs.solidColorBackgroundCode); + return SetBrush(Windows.UI.Color.FromArgb(color.A, color.R, color.G, color.B)); } } public override bool SyncSettingGet() { - if (App.GetService().TryReadConfig(Path.Combine(AppDataPath.ConfigsPath, @"Settings\ThemeSettings.json"), ThemeSettingServiceContext.Default.ThemeSettingService, out var jsonClass) && jsonClass != null) { - ThemeSetting.backgroundType = jsonClass.BackgroundType; - ThemeSetting.themeType = jsonClass.ThemeType; - ThemeSetting.imageBackgroundName = jsonClass.ImageBackgroundName; - ThemeSetting.backgroundStretch = jsonClass.BackgroundStretch; - ThemeSetting.solidColorBackgroundCode = jsonClass.SolidColorBackgroundCode; - ThemeSetting.windowName = jsonClass.WindowName; + if (App.GetService().TryReadConfig(Path.Combine(AppDataPath.ConfigsPath, @"ThemeConfigs.json"), ThemeConfigsServiceContext.Default.ThemeConfigsService, out var jsonClass) && jsonClass != null) { + ThemeConfigs.backgroundType = jsonClass.BackgroundType; + ThemeConfigs.themeType = jsonClass.ThemeType; + ThemeConfigs.imageBackgroundName = jsonClass.ImageBackgroundName; + ThemeConfigs.backgroundStretch = jsonClass.BackgroundStretch; + ThemeConfigs.solidColorBackgroundCode = jsonClass.SolidColorBackgroundCode; + ThemeConfigs.windowName = jsonClass.WindowName; return true; } return false; } public override bool SyncSettingSet() { - if (App.GetService().WriteConfig(Path.Combine(AppDataPath.ConfigsPath, @"Settings\ThemeSettings.json"), ThemeSettingServiceContext.Default.ThemeSettingService, this)) { - WeakReferenceMessenger.Default.Send(new ValueChangedMessage(this), "MinecraftConfigChanged"); + if (App.GetService().WriteConfig(Path.Combine(AppDataPath.ConfigsPath, @"ThemeConfigs.json"), ThemeConfigsServiceContext.Default.ThemeConfigsService, this)) { + WeakReferenceMessenger.Default.Send(new ValueChangedMessage(this), "MinecraftConfigChanged"); return true; } return false; } - public void SetBrush(T color, Action backgroundChanged) { + public Brush SetBrush(T color) { if (typeof(T) == typeof(Windows.UI.Color) && color != null) { - backgroundChanged(new SolidColorBrush((Windows.UI.Color)(object)color)); - return; + return new SolidColorBrush((Windows.UI.Color)(object)color); } if (typeof(T) == typeof(BitmapImage) && color != null) { - backgroundChanged(new ImageBrush() { + return new ImageBrush() { ImageSource = (BitmapImage)(object)color, - Stretch = ThemeSetting.backgroundStretch - }); - return; + Stretch = ThemeConfigs.backgroundStretch + }; } throw new InvalidOperationException("Unsupported type for SetBrushAsync"); } @@ -212,5 +188,5 @@ public static async Task GetBingWallpaperUrl() { } [JsonSourceGenerationOptions(WriteIndented = true)] -[JsonSerializable(typeof(ThemeSettingService))] -internal partial class ThemeSettingServiceContext : JsonSerializerContext; +[JsonSerializable(typeof(ThemeConfigsService))] +internal partial class ThemeConfigsServiceContext : JsonSerializerContext; diff --git a/BadMC_Launcher/Services/Endpoints/DebugHandler.cs b/BadMC_Launcher/Services/Endpoints/DebugHandler.cs new file mode 100644 index 0000000..2a175cf --- /dev/null +++ b/BadMC_Launcher/Services/Endpoints/DebugHandler.cs @@ -0,0 +1,44 @@ +namespace BadMC_Launcher.Services.Endpoints; + +internal class DebugHttpHandler : DelegatingHandler +{ + private readonly ILogger _logger; + + public DebugHttpHandler(ILogger logger, HttpMessageHandler? innerHandler = null) + : base(innerHandler ?? new HttpClientHandler()) + { + _logger = logger; + } + + protected async override Task SendAsync( + HttpRequestMessage request, + CancellationToken cancellationToken) + { + var response = await base.SendAsync(request, cancellationToken); +#if DEBUG + if (!response.IsSuccessStatusCode) + { + _logger.LogDebugMessage("Unsuccessful API Call"); + if (request.RequestUri is not null) + { + _logger.LogDebugMessage($"{request.RequestUri} ({request.Method})"); + } + + foreach ((var key, var values) in request.Headers.ToDictionary(x => x.Key, x => string.Join(", ", x.Value))) + { + _logger.LogDebugMessage($"{key}: {values}"); + } + + var content = request.Content is not null ? await request.Content.ReadAsStringAsync() : null; + if (!string.IsNullOrEmpty(content)) + { + _logger.LogDebugMessage(content); + } + + // Uncomment to automatically break when an API call fails while debugging + // System.Diagnostics.Debugger.Break(); + } +#endif + return response; + } +} diff --git a/BadMC_Launcher/Services/Settings/LaunchSettingsService.cs b/BadMC_Launcher/Services/Settings/LaunchSettingsService.cs new file mode 100644 index 0000000..f05198d --- /dev/null +++ b/BadMC_Launcher/Services/Settings/LaunchSettingsService.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using BadMC_Launcher.Interfaces; + +namespace BadMC_Launcher.Services.Settings; + +class LaunchSettingsService { + public HashSet VersionIsolationFilter { get; set; } = new HashSet(); +} diff --git a/BadMC_Launcher/Strings/en-US/Resources.resw b/BadMC_Launcher/Strings/en-US/Resources.resw index 08d78b6..018e605 100644 --- a/BadMC_Launcher/Strings/en-US/Resources.resw +++ b/BadMC_Launcher/Strings/en-US/Resources.resw @@ -124,7 +124,7 @@ Launch with BadMCL (NOT BMCL!!!) - No item selected _( ゚Д゚)ノ + No version selected _( ゚Д゚)ノ Launch Minecraft! @@ -133,16 +133,16 @@ Refresh - Manage Minecraft ontologies folders + Manage Minecraft versions folders - Browse Minecraft ontologies folder + Browse Minecraft version folder - Can't find any Minecraft ontologies :( + Can't find any Minecraft versions :( - Go to the Ontology page to manage Minecraft ontologies folders. + Go to the versions page to manage Minecraft ontologies folders. Try searching for what? ψ(`∇´)ψ @@ -151,7 +151,7 @@ 设置 - Minecraft Ontologies + Minecraft versions Filter search results @@ -169,17 +169,17 @@ Minecraft settings - Manage Minecraft ontologies folders + Manage Minecraft versions folders Lower priority - This setting will have a lower priority than ontology-specific customizations. -If something in this setting has been changed in an ontology-specific customization, that item will not take effect for this ontology. + This setting will have a lower priority than version-specific customizations. +If something in this setting has been changed in an version-specific customization, that item will not take effect for this version. - Management of ontologies and resource storage locations. + Management of versions and resource storage locations. Setting the Java Runtime for Minecraft Java. @@ -194,16 +194,16 @@ If something in this setting has been changed in an ontology-specific customizat Manual settings - Manage Minecraft ontologies folders + Manage Minecraft versions folders OK - Adding a new Minecraft ontologies folder + Adding a new Minecraft versions folder - Rename item (Does not affect local folder) + Rename (Does not affect local folder) Apply @@ -215,7 +215,7 @@ If something in this setting has been changed in an ontology-specific customizat Path - Minecraft ontologies folder not selected (´-ω-`) + Minecraft versions folder not selected (´-ω-`) View in File Manager @@ -230,10 +230,10 @@ If something in this setting has been changed in an ontology-specific customizat The name must not be empty or duplicated. - Can't find the active Minecraft ontologies folder Σ(°ロ°) + Can't find the active Minecraft versions folder Σ(°ロ°) - Here you can display the active MInecraft body folder path, but only if you have an active Minecraft body folder path set 😏 + Here you can display the active MInecraft versions folder path, but only if you have an active Minecraft versions folder path set 😏 Unable to find an active Java Runtime ( `ε´ ) @@ -242,10 +242,10 @@ If something in this setting has been changed in an ontology-specific customizat Set an active Java runtime first to display available Java runtimes 😰 - Can't find any Minecraft ontologies folder :( + Can't find any Minecraft versions folder :( - Add a Minecraft ontologies folder from local + Add a Minecraft versions folder from local etc! Renaming will be turned off when clicked! (Flyout is too hard so I can't fix it QAQ) @@ -337,4 +337,10 @@ If something in this setting has been changed in an ontology-specific customizat Min (MB) + + Version Isolation + + + Isolates Mods, Lights and Shadows of eligible Minecraft versions from other versions. + \ No newline at end of file diff --git a/BadMC_Launcher/Strings/zh-Hans/Resources.resw b/BadMC_Launcher/Strings/zh-Hans/Resources.resw index c7d676b..3f27f93 100644 --- a/BadMC_Launcher/Strings/zh-Hans/Resources.resw +++ b/BadMC_Launcher/Strings/zh-Hans/Resources.resw @@ -124,7 +124,7 @@ 启动 Minecraft! - 未选择本体 _( ゚Д゚)ノ + 未选择版本 _( ゚Д゚)ノ 使用 BadMCL(不是 BMCL!!!)启动 @@ -133,16 +133,16 @@ 刷新 - 管理 Minecraft 本体文件夹 + 管理 Minecraft 版本文件夹 - 浏览 Minecraft 本体文件夹 + 浏览 Minecraft 版本文件夹 - 找不到任何 Minecraft 本体 :( + 找不到任何 Minecraft 版本 :( - 转到本体页面以管理Minecraft本体文件夹. + 转到本体页面以管理 Minecraft 版本文件夹. 搜点什么?ψ(`∇´)ψ @@ -151,7 +151,7 @@ 设置 - Minecraft 本体 + Minecraft 版本 筛选搜索结果 @@ -169,17 +169,17 @@ Minecraft 设置 - 管理 Minecraft 本体文件夹 + 管理 Minecraft 版本文件夹 更低的优先级 - 该设置的优先级将比特定于本体的自定义设置更低. -如果这个设置的某些项已在特定于本体的自定义设置中更改,该项将不会对这个本体生效. + 该设置的优先级将比特定于版本的自定义设置更低. +如果这个设置的某些项已在特定于版本的自定义设置中更改,该项将不会对这个版本生效. - 对本体以及资源的存储位置进行管理. + 对版本以及资源的存储位置进行管理. 手动设置 Minecraft 运行时内存 @@ -200,16 +200,16 @@ 手动设置 - 管理 Minecraft 本体文件夹 + 管理 Minecraft 版本文件夹 确定 - 添加新的 Minecraft 本体文件夹 + 添加新的 Minecraft 版本文件夹 - 重命名项 (不影响本地文件夹) + 重命名 (不影响本地文件夹) 应用 @@ -221,7 +221,7 @@ 路径 - 未选择 Minecraft 本体文件夹 (´-ω-`) + 未选择 Minecraft 版本文件夹 (´-ω-`) 在文件管理器中显示 @@ -236,10 +236,10 @@ 名称不可为空或与其它项重名. - 找不到活动的 Minecraft 本体文件夹 Σ(°ロ°) + 找不到活动的 Minecraft 版本文件夹 Σ(°ロ°) - 这里可以显示活动的 MInecraft 本体文件夹路径,但前提是你有设置一个活动的 Minecraft 本体文件夹路径 😏 + 这里可以显示活动的 MInecraft 版本文件夹路径,但前提是你有设置一个活动的 Minecraft 版本文件夹路径 😏 找不到活动的 Java 运行时 ( `ε´ ) @@ -248,10 +248,10 @@ 在显示 Java 运行时之前请设置活动的 Java 运行时 😰 - 找不到任何 Minecraft 本体文件夹 :( + 找不到任何 Minecraft 版本文件夹 :( - 从本地添加 Minecraft 本体文件夹 + 从本地添加 Minecraft 版本文件夹 等等!点击时将会关闭重命名!(Flyout太难了所以修不了 QAQ) @@ -337,4 +337,10 @@ 最小 (MB) + + 版本隔离 + + + 将符合条件的 Minecraft 版本的 Mod, 光影等资源包与其它本体隔离. + \ No newline at end of file diff --git a/BadMC_Launcher/ViewModels/ContentDialogs/Settings/JavaContentDialogViewModel.cs b/BadMC_Launcher/ViewModels/ContentDialogs/Settings/JavaContentDialogViewModel.cs index 1ea0088..68e91ee 100644 --- a/BadMC_Launcher/ViewModels/ContentDialogs/Settings/JavaContentDialogViewModel.cs +++ b/BadMC_Launcher/ViewModels/ContentDialogs/Settings/JavaContentDialogViewModel.cs @@ -7,14 +7,15 @@ using Windows.Storage.Pickers; using Uno.Extensions.Specialized; using WinRT.Interop; +using BadMC_Launcher.Services.Configs; namespace BadMC_Launcher.ViewModels.ContentDialogs.Settings; public partial class JavaContentDialogViewModel : ObservableObject { - private readonly MinecraftConfigService minecraftConfigService; + private readonly MinecraftConfigsService minecraftConfigService; public JavaContentDialogViewModel() { - minecraftConfigService = App.GetService(); + minecraftConfigService = App.GetService(); minecraftConfigService.PropertyChanged += JavaList_PropertyChanged; @@ -180,13 +181,13 @@ private async void SetJavaList() { private void JavaList_PropertyChanged(object? sender, PropertyChangedEventArgs e) { switch(e.PropertyName) { - case nameof(MinecraftConfigService.JavaPaths): + case nameof(MinecraftConfigsService.JavaPaths): if (!minecraftConfigService.JavaPaths.SequenceEqual(JavasList.Select(item => item.JavaPath))) { // Update Java list SetJavaList(); } break; - case nameof(MinecraftConfigService.ActiveJavaPath): + case nameof(MinecraftConfigsService.ActiveJavaPath): if (minecraftConfigService.ActiveJavaPath != JavasList.ElementAtOrDefault(JavasListSelectedIndex)?.JavaPath) { // Update selected index JavasListSelectedIndex = JavasList.GetIndex(item => item.JavaPath == minecraftConfigService.ActiveJavaPath); diff --git a/BadMC_Launcher/ViewModels/ContentDialogs/Settings/MinecraftFolderContentDialogViewModel.cs b/BadMC_Launcher/ViewModels/ContentDialogs/Settings/MinecraftFolderContentDialogViewModel.cs index 52ef1f0..9cab194 100644 --- a/BadMC_Launcher/ViewModels/ContentDialogs/Settings/MinecraftFolderContentDialogViewModel.cs +++ b/BadMC_Launcher/ViewModels/ContentDialogs/Settings/MinecraftFolderContentDialogViewModel.cs @@ -2,6 +2,7 @@ using System.ComponentModel; using BadMC_Launcher.Controls.Minecraft; using BadMC_Launcher.Models.Enums; +using BadMC_Launcher.Services.Configs; using BadMC_Launcher.Services.Settings; using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Messaging; @@ -13,7 +14,7 @@ namespace BadMC_Launcher.ViewModels.ContentDialogs.Settings; public partial class MinecraftFolderContentDialogViewModel : ObservableObject { - private readonly MinecraftConfigService minecraftConfigService = App.GetService(); + private readonly MinecraftConfigsService minecraftConfigService = App.GetService(); public MinecraftFolderContentDialogViewModel() { MinecraftFoldersList = minecraftConfigService.MinecraftFolders.ToObservableCollection(); @@ -198,12 +199,12 @@ private bool CanRename() { private void MinecraftConfig_PropertyChanged(object? sender, PropertyChangedEventArgs e) { // Update Property switch (e.PropertyName) { - case nameof(MinecraftConfigService.ActiveMinecraftFolderPath): + case nameof(MinecraftConfigsService.ActiveMinecraftFolderPath): if (minecraftConfigService.ActiveMinecraftFolderPath != MinecraftFoldersList.ElementAtOrDefault(MinecraftFoldersListSelectedIndex)?.MinecraftFolderPath) { MinecraftFoldersListSelectedIndex = MinecraftFoldersList.GetIndex(item => item.MinecraftFolderPath == minecraftConfigService.ActiveMinecraftFolderPath); } break; - case nameof(MinecraftConfigService.MinecraftFolders): + case nameof(MinecraftConfigsService.MinecraftFolders): if (!MinecraftFoldersList.SequenceEqual(minecraftConfigService.MinecraftFolders)) { MinecraftFoldersList = minecraftConfigService.MinecraftFolders.ToObservableCollection(); MinecraftFoldersListSelectedIndex = MinecraftFoldersList.GetIndex(item => item.MinecraftFolderPath == minecraftConfigService.ActiveMinecraftFolderPath); diff --git a/BadMC_Launcher/ViewModels/Pages/MainPageViewModel.cs b/BadMC_Launcher/ViewModels/Pages/MainPageViewModel.cs index 88393c2..5bbc9c5 100644 --- a/BadMC_Launcher/ViewModels/Pages/MainPageViewModel.cs +++ b/BadMC_Launcher/ViewModels/Pages/MainPageViewModel.cs @@ -3,6 +3,7 @@ using BadMC_Launcher.Interfaces; using BadMC_Launcher.Models.Data.ViewData; using BadMC_Launcher.Models.Enums; +using BadMC_Launcher.Services.Configs; using BadMC_Launcher.Services.Settings; using BadMC_Launcher.Views.UserControls; using CommunityToolkit.Mvvm.Input; @@ -11,6 +12,7 @@ using CommunityToolkit.WinUI.Controls; using Microsoft.UI.Xaml.Controls.Primitives; using Microsoft.UI.Xaml.Input; +using Uno.Extensions; namespace BadMC_Launcher.ViewModels.Pages; @@ -19,7 +21,7 @@ public partial class MainPageViewModel : ObservableObject { public MainPageViewModel() { //Init Property - WindowName = App.GetService().WindowName; + WindowName = App.GetService().WindowName; IsLaunchPadOpen = true; IsMainSideBarToolShow = false; @@ -31,9 +33,7 @@ public MainPageViewModel() { SearchFilterSelectedItems = new(); SearchText = string.Empty; - App.GetService().SetBackground((brush) => { - AppBackground = brush; - }); + SetBackground(); } [ObservableProperty] @@ -172,6 +172,11 @@ private void SendInvokeFuncMessage(T value, Enum tokenEnum) { WeakReferenceMessenger.Default.Send(new ValueChangedMessage(value), tokenEnum.ToString()); } + private async void SetBackground() { + var themeConfigsService = App.GetService(); + AppBackground = await themeConfigsService.SetBackground(themeConfigsService.BackgroundType); + } + private RequestMessage SendInvokeFuncMessage(Enum tokenEnum) { return WeakReferenceMessenger.Default.Send(new RequestMessage(), tokenEnum.ToString()); } diff --git a/BadMC_Launcher/ViewModels/Pages/Settings/LaunchSettingsPageViewModel.cs b/BadMC_Launcher/ViewModels/Pages/Settings/LaunchSettingsPageViewModel.cs index 033d6d6..352fa3f 100644 --- a/BadMC_Launcher/ViewModels/Pages/Settings/LaunchSettingsPageViewModel.cs +++ b/BadMC_Launcher/ViewModels/Pages/Settings/LaunchSettingsPageViewModel.cs @@ -2,6 +2,7 @@ using BadMC_Launcher.Controls.Minecraft; using BadMC_Launcher.Models.Data; using BadMC_Launcher.Models.Enums; +using BadMC_Launcher.Services.Configs; using BadMC_Launcher.Services.Settings; using BadMC_Launcher.Views.ContentDialogs.Settings; using CommunityToolkit.Mvvm.Input; @@ -16,7 +17,7 @@ namespace BadMC_Launcher.ViewModels.Pages.Settings; public partial class LaunchSettingsPageViewModel : ObservableObject { private readonly CancellationTokenSource cancelLoopToken = new(); private readonly XamlRoot? mainPageXamlRoot; - private readonly MinecraftConfigService minecraftService = App.GetService(); + private readonly MinecraftConfigsService minecraftService = App.GetService(); private readonly ResourceLoader sourceService = App.GetService(); private bool isRangeSelectorDragStarted = false; private MinecraftFolderViewItem? minecraftFolder; @@ -177,13 +178,13 @@ private RequestMessage SendGetValueMessage(Enum tokenEnum) { private void MinecraftConfig_PropertyChanged(object? sender, PropertyChangedEventArgs e) { switch (e.PropertyName) { - case nameof(MinecraftConfigService.ActiveJavaPath): - case nameof(MinecraftConfigService.IsAutoJavaEnabled): + case nameof(MinecraftConfigsService.ActiveJavaPath): + case nameof(MinecraftConfigsService.IsAutoJavaEnabled): if (minecraftService.ActiveJavaPath != JavaId || JavaId != sourceService.GetString("Global_NullJavaId")) { GetJavaInfo(); } break; - case nameof(MinecraftConfigService.ActiveMinecraftFolderPath): + case nameof(MinecraftConfigsService.ActiveMinecraftFolderPath): if (minecraftService.ActiveMinecraftFolderPath != MinecraftFolderPath) { minecraftFolder = minecraftService.MinecraftFolders.FirstOrDefault(item => item.MinecraftFolderPath == minecraftService.ActiveMinecraftFolderPath); @@ -191,12 +192,12 @@ private void MinecraftConfig_PropertyChanged(object? sender, PropertyChangedEven MinecraftFolderPath = minecraftFolder != null ? minecraftFolder.MinecraftFolderPath : sourceService.GetString("Global_NullMinecraftFolderPath"); } break; - case nameof(MinecraftConfigService.MinGameMemory): + case nameof(MinecraftConfigsService.MinGameMemory): if (minecraftService.MinGameMemory != MinGameMemory) { MinGameMemory = minecraftService.MinGameMemory; } break; - case nameof(MinecraftConfigService.MaxGameMemory): + case nameof(MinecraftConfigsService.MaxGameMemory): if (minecraftService.MaxGameMemory != MaxGameMemory) { MaxGameMemory = minecraftService.MaxGameMemory; } diff --git a/BadMC_Launcher/ViewModels/Pages/Settings/SettingsDashboardPageViewModel.cs b/BadMC_Launcher/ViewModels/Pages/Settings/SettingsDashboardPageViewModel.cs index bfe260e..e06ebf8 100644 --- a/BadMC_Launcher/ViewModels/Pages/Settings/SettingsDashboardPageViewModel.cs +++ b/BadMC_Launcher/ViewModels/Pages/Settings/SettingsDashboardPageViewModel.cs @@ -1,6 +1,7 @@ using BadMC_Launcher.Models.Data.ViewData; using BadMC_Launcher.Controls; using CommunityToolkit.Mvvm.Input; +using BadMC_Launcher.Extensions; namespace BadMC_Launcher.ViewModels.Pages.Settings; diff --git a/BadMC_Launcher/ViewModels/UserControls/LaunchPadViewModel.cs b/BadMC_Launcher/ViewModels/UserControls/LaunchPadViewModel.cs index 54780a5..f1757f3 100644 --- a/BadMC_Launcher/ViewModels/UserControls/LaunchPadViewModel.cs +++ b/BadMC_Launcher/ViewModels/UserControls/LaunchPadViewModel.cs @@ -20,10 +20,11 @@ using Newtonsoft.Json.Linq; using Uno.Extensions.Specialized; using BadMC_Launcher.Models.Enums; +using BadMC_Launcher.Services.Configs; namespace BadMC_Launcher.ViewModels.UserControls; public partial class LaunchPadViewModel : ObservableObject { - MinecraftConfigService minecraftService = App.GetService(); + MinecraftConfigsService minecraftService = App.GetService(); public LaunchPadViewModel() { MinecraftFolderEntryList = minecraftService.MinecraftFolders.ToObservableCollection(); @@ -154,7 +155,7 @@ private void MinecraftConfig_PropertyChanged(object? sender, PropertyChangedEven // Update Property switch (args.PropertyName) { - case nameof(MinecraftConfigService.ActiveMinecraftFolderPath): + case nameof(MinecraftConfigsService.ActiveMinecraftFolderPath): if (MinecraftFolderEntryList.ElementAtOrDefault(MinecraftFolderEntryListSelectedIndex) ?.MinecraftFolderPath != minecraftService.ActiveMinecraftFolderPath) { // Set MinecraftFolderEntries SelectedIndex @@ -168,7 +169,7 @@ private void MinecraftConfig_PropertyChanged(object? sender, PropertyChangedEven } break; - case nameof(MinecraftConfigService.MinecraftFolders): + case nameof(MinecraftConfigsService.MinecraftFolders): if (MinecraftFolderEntryList.SequenceEqual(minecraftService.MinecraftFolders)) // Update MinecraftFolderEntryList MinecraftFolderEntryList = minecraftService.MinecraftFolders.ToObservableCollection(); diff --git a/BadMC_Launcher/Views/Pages/Settings/LaunchSettingsPage.xaml b/BadMC_Launcher/Views/Pages/Settings/LaunchSettingsPage.xaml index d485392..2d674c4 100644 --- a/BadMC_Launcher/Views/Pages/Settings/LaunchSettingsPage.xaml +++ b/BadMC_Launcher/Views/Pages/Settings/LaunchSettingsPage.xaml @@ -21,14 +21,14 @@ - + - + @@ -56,7 +56,7 @@ - + @@ -82,14 +82,14 @@ - + - + @@ -329,6 +329,14 @@ + + + + + + + + diff --git a/Directory.Packages.props b/Directory.Packages.props index c689a81..953b8c3 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -6,35 +6,21 @@ See https://aka.platform.uno/using-uno-sdk#implicit-packages for more information regarding the Implicit Packages. --> - - - + - - - - - - - - - + + - - - - - - - - - - + + + + + \ No newline at end of file diff --git a/LICENSE b/LICENSE deleted file mode 100644 index a612ad9..0000000 --- a/LICENSE +++ /dev/null @@ -1,373 +0,0 @@ -Mozilla Public License Version 2.0 -================================== - -1. Definitions --------------- - -1.1. "Contributor" - means each individual or legal entity that creates, contributes to - the creation of, or owns Covered Software. - -1.2. "Contributor Version" - means the combination of the Contributions of others (if any) used - by a Contributor and that particular Contributor's Contribution. - -1.3. "Contribution" - means Covered Software of a particular Contributor. - -1.4. "Covered Software" - means Source Code Form to which the initial Contributor has attached - the notice in Exhibit A, the Executable Form of such Source Code - Form, and Modifications of such Source Code Form, in each case - including portions thereof. - -1.5. "Incompatible With Secondary Licenses" - means - - (a) that the initial Contributor has attached the notice described - in Exhibit B to the Covered Software; or - - (b) that the Covered Software was made available under the terms of - version 1.1 or earlier of the License, but not also under the - terms of a Secondary License. - -1.6. "Executable Form" - means any form of the work other than Source Code Form. - -1.7. "Larger Work" - means a work that combines Covered Software with other material, in - a separate file or files, that is not Covered Software. - -1.8. "License" - means this document. - -1.9. "Licensable" - means having the right to grant, to the maximum extent possible, - whether at the time of the initial grant or subsequently, any and - all of the rights conveyed by this License. - -1.10. "Modifications" - means any of the following: - - (a) any file in Source Code Form that results from an addition to, - deletion from, or modification of the contents of Covered - Software; or - - (b) any new file in Source Code Form that contains any Covered - Software. - -1.11. "Patent Claims" of a Contributor - means any patent claim(s), including without limitation, method, - process, and apparatus claims, in any patent Licensable by such - Contributor that would be infringed, but for the grant of the - License, by the making, using, selling, offering for sale, having - made, import, or transfer of either its Contributions or its - Contributor Version. - -1.12. "Secondary License" - means either the GNU General Public License, Version 2.0, the GNU - Lesser General Public License, Version 2.1, the GNU Affero General - Public License, Version 3.0, or any later versions of those - licenses. - -1.13. "Source Code Form" - means the form of the work preferred for making modifications. - -1.14. "You" (or "Your") - means an individual or a legal entity exercising rights under this - License. For legal entities, "You" includes any entity that - controls, is controlled by, or is under common control with You. For - purposes of this definition, "control" means (a) the power, direct - or indirect, to cause the direction or management of such entity, - whether by contract or otherwise, or (b) ownership of more than - fifty percent (50%) of the outstanding shares or beneficial - ownership of such entity. - -2. License Grants and Conditions --------------------------------- - -2.1. Grants - -Each Contributor hereby grants You a world-wide, royalty-free, -non-exclusive license: - -(a) under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or - as part of a Larger Work; and - -(b) under Patent Claims of such Contributor to make, use, sell, offer - for sale, have made, import, and otherwise transfer either its - Contributions or its Contributor Version. - -2.2. Effective Date - -The licenses granted in Section 2.1 with respect to any Contribution -become effective for each Contribution on the date the Contributor first -distributes such Contribution. - -2.3. Limitations on Grant Scope - -The licenses granted in this Section 2 are the only rights granted under -this License. No additional rights or licenses will be implied from the -distribution or licensing of Covered Software under this License. -Notwithstanding Section 2.1(b) above, no patent license is granted by a -Contributor: - -(a) for any code that a Contributor has removed from Covered Software; - or - -(b) for infringements caused by: (i) Your and any other third party's - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or - -(c) under Patent Claims infringed by Covered Software in the absence of - its Contributions. - -This License does not grant any rights in the trademarks, service marks, -or logos of any Contributor (except as may be necessary to comply with -the notice requirements in Section 3.4). - -2.4. Subsequent Licenses - -No Contributor makes additional grants as a result of Your choice to -distribute the Covered Software under a subsequent version of this -License (see Section 10.2) or under the terms of a Secondary License (if -permitted under the terms of Section 3.3). - -2.5. Representation - -Each Contributor represents that the Contributor believes its -Contributions are its original creation(s) or it has sufficient rights -to grant the rights to its Contributions conveyed by this License. - -2.6. Fair Use - -This License is not intended to limit any rights You have under -applicable copyright doctrines of fair use, fair dealing, or other -equivalents. - -2.7. Conditions - -Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted -in Section 2.1. - -3. Responsibilities -------------------- - -3.1. Distribution of Source Form - -All distribution of Covered Software in Source Code Form, including any -Modifications that You create or to which You contribute, must be under -the terms of this License. You must inform recipients that the Source -Code Form of the Covered Software is governed by the terms of this -License, and how they can obtain a copy of this License. You may not -attempt to alter or restrict the recipients' rights in the Source Code -Form. - -3.2. Distribution of Executable Form - -If You distribute Covered Software in Executable Form then: - -(a) such Covered Software must also be made available in Source Code - Form, as described in Section 3.1, and You must inform recipients of - the Executable Form how they can obtain a copy of such Source Code - Form by reasonable means in a timely manner, at a charge no more - than the cost of distribution to the recipient; and - -(b) You may distribute such Executable Form under the terms of this - License, or sublicense it under different terms, provided that the - license for the Executable Form does not attempt to limit or alter - the recipients' rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work - -You may create and distribute a Larger Work under terms of Your choice, -provided that You also comply with the requirements of this License for -the Covered Software. If the Larger Work is a combination of Covered -Software with a work governed by one or more Secondary Licenses, and the -Covered Software is not Incompatible With Secondary Licenses, this -License permits You to additionally distribute such Covered Software -under the terms of such Secondary License(s), so that the recipient of -the Larger Work may, at their option, further distribute the Covered -Software under the terms of either this License or such Secondary -License(s). - -3.4. Notices - -You may not remove or alter the substance of any license notices -(including copyright notices, patent notices, disclaimers of warranty, -or limitations of liability) contained within the Source Code Form of -the Covered Software, except that You may alter any license notices to -the extent required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms - -You may choose to offer, and to charge a fee for, warranty, support, -indemnity or liability obligations to one or more recipients of Covered -Software. However, You may do so only on Your own behalf, and not on -behalf of any Contributor. You must make it absolutely clear that any -such warranty, support, indemnity, or liability obligation is offered by -You alone, and You hereby agree to indemnify every Contributor for any -liability incurred by such Contributor as a result of warranty, support, -indemnity or liability terms You offer. You may include additional -disclaimers of warranty and limitations of liability specific to any -jurisdiction. - -4. Inability to Comply Due to Statute or Regulation ---------------------------------------------------- - -If it is impossible for You to comply with any of the terms of this -License with respect to some or all of the Covered Software due to -statute, judicial order, or regulation then You must: (a) comply with -the terms of this License to the maximum extent possible; and (b) -describe the limitations and the code they affect. Such description must -be placed in a text file included with all distributions of the Covered -Software under this License. Except to the extent prohibited by statute -or regulation, such description must be sufficiently detailed for a -recipient of ordinary skill to be able to understand it. - -5. Termination --------------- - -5.1. The rights granted under this License will terminate automatically -if You fail to comply with any of its terms. However, if You become -compliant, then the rights granted under this License from a particular -Contributor are reinstated (a) provisionally, unless and until such -Contributor explicitly and finally terminates Your grants, and (b) on an -ongoing basis, if such Contributor fails to notify You of the -non-compliance by some reasonable means prior to 60 days after You have -come back into compliance. Moreover, Your grants from a particular -Contributor are reinstated on an ongoing basis if such Contributor -notifies You of the non-compliance by some reasonable means, this is the -first time You have received notice of non-compliance with this License -from such Contributor, and You become compliant prior to 30 days after -Your receipt of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent -infringement claim (excluding declaratory judgment actions, -counter-claims, and cross-claims) alleging that a Contributor Version -directly or indirectly infringes any patent, then the rights granted to -You by any and all Contributors for the Covered Software under Section -2.1 of this License shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all -end user license agreements (excluding distributors and resellers) which -have been validly granted by You or Your distributors under this License -prior to termination shall survive termination. - -************************************************************************ -* * -* 6. Disclaimer of Warranty * -* ------------------------- * -* * -* Covered Software is provided under this License on an "as is" * -* basis, without warranty of any kind, either expressed, implied, or * -* statutory, including, without limitation, warranties that the * -* Covered Software is free of defects, merchantable, fit for a * -* particular purpose or non-infringing. The entire risk as to the * -* quality and performance of the Covered Software is with You. * -* Should any Covered Software prove defective in any respect, You * -* (not any Contributor) assume the cost of any necessary servicing, * -* repair, or correction. This disclaimer of warranty constitutes an * -* essential part of this License. No use of any Covered Software is * -* authorized under this License except under this disclaimer. * -* * -************************************************************************ - -************************************************************************ -* * -* 7. Limitation of Liability * -* -------------------------- * -* * -* Under no circumstances and under no legal theory, whether tort * -* (including negligence), contract, or otherwise, shall any * -* Contributor, or anyone who distributes Covered Software as * -* permitted above, be liable to You for any direct, indirect, * -* special, incidental, or consequential damages of any character * -* including, without limitation, damages for lost profits, loss of * -* goodwill, work stoppage, computer failure or malfunction, or any * -* and all other commercial damages or losses, even if such party * -* shall have been informed of the possibility of such damages. This * -* limitation of liability shall not apply to liability for death or * -* personal injury resulting from such party's negligence to the * -* extent applicable law prohibits such limitation. Some * -* jurisdictions do not allow the exclusion or limitation of * -* incidental or consequential damages, so this exclusion and * -* limitation may not apply to You. * -* * -************************************************************************ - -8. Litigation -------------- - -Any litigation relating to this License may be brought only in the -courts of a jurisdiction where the defendant maintains its principal -place of business and such litigation shall be governed by laws of that -jurisdiction, without reference to its conflict-of-law provisions. -Nothing in this Section shall prevent a party's ability to bring -cross-claims or counter-claims. - -9. Miscellaneous ----------------- - -This License represents the complete agreement concerning the subject -matter hereof. If any provision of this License is held to be -unenforceable, such provision shall be reformed only to the extent -necessary to make it enforceable. Any law or regulation which provides -that the language of a contract shall be construed against the drafter -shall not be used to construe this License against a Contributor. - -10. Versions of the License ---------------------------- - -10.1. New Versions - -Mozilla Foundation is the license steward. Except as provided in Section -10.3, no one other than the license steward has the right to modify or -publish new versions of this License. Each version will be given a -distinguishing version number. - -10.2. Effect of New Versions - -You may distribute the Covered Software under the terms of the version -of the License under which You originally received the Covered Software, -or under the terms of any subsequent version published by the license -steward. - -10.3. Modified Versions - -If you create software not governed by this License, and you want to -create a new license for such software, you may create and use a -modified version of this License if you rename the license and remove -any references to the name of the license steward (except to note that -such modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary -Licenses - -If You choose to distribute Source Code Form that is Incompatible With -Secondary Licenses under the terms of this version of the License, the -notice described in Exhibit B of this License must be attached. - -Exhibit A - Source Code Form License Notice -------------------------------------------- - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - -If it is not possible or desirable to put the notice in a particular -file, then You may include the notice in a location (such as a LICENSE -file in a relevant directory) where a recipient would be likely to look -for such a notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - "Incompatible With Secondary Licenses" Notice ---------------------------------------------------------- - - This Source Code Form is "Incompatible With Secondary Licenses", as - defined by the Mozilla Public License, v. 2.0. diff --git a/README.md b/README.md deleted file mode 100644 index a647e82..0000000 --- a/README.md +++ /dev/null @@ -1,289 +0,0 @@ -
- - - -# BadMC Launcher - -某不正经小怪物搞出来的启动器🤪 - -**[Starcloudsea](https://github.com/Starcloudsea) 的作品(要累死我QAQ)** - -**特别鸣谢: -[Drowned.Get](https://github.com/DrownedGet) | -[YangSpring 429](https://github.com/YangSpring429) | -[Gen123](https://github.com/geenh) | -[FlowerSacrifice](https://github.com/FlowerSacrifice)** - -![GitHub Repo stars](https://img.shields.io/github/stars/BadBC-Studio/BadMC_Launcher?style=for-the-badge&logo=github&logoColor=0077FF&labelColor=F3F3F3&color=0077ff) -![GitHub forks](https://img.shields.io/github/forks/BadBC-Studio/BadMC_Launcher?style=for-the-badge&logo=github&logoColor=0077FF&labelColor=F3F3F3&color=0077FF) -![GitHub Release](https://img.shields.io/github/v/release/BadBC-Studio/BadMC_Launcher?include_prereleases&sort=date&display_name=release&style=for-the-badge&logo=github&logoColor=0077FF&labelColor=f3f3f3&color=0077ff) -![GitHub Downloads (all assets, all releases)](https://img.shields.io/github/downloads/BadBC-Studio/BadMC_Launcher/total?style=for-the-badge&logo=github&logoColor=0077FF&labelColor=F3F3F3&color=0077FF) -![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/BadBC-Studio/BadMC-Launcher/ci.yml?branch=Release&style=for-the-badge&logo=github&logoColor=0077FF&labelColor=F3F3F3&color=0077FF) -![GitHub repo size](https://img.shields.io/github/repo-size/BadBC-Studio/BadMC_Launcher?style=for-the-badge&logo=github&logoColor=0077FF&labelColor=F3F3F3&color=0077FF) - -[![Discord](https://img.shields.io/discord/1025379148304240690?style=for-the-badge&logo=discord&logoColor=FF0000&label=Discord&labelColor=F3F3F3&color=FF0000&link=https%3A%2F%2Fdiscord.gg%2FjfZPPpC3Av)](https://discord.gg/jfZPPpC3Av) -[![Website](https://img.shields.io/website?url=https%3A%2F%2FBadBC-Studio.github.io%2FBadMC_Launcher&style=for-the-badge&logo=Vite&logoColor=FF0000&label=Pages&labelColor=F3F3F3&color=FF0000&link=https%3A%2F%2FBadBC-Studio.github.io%2FBadMC_Launcher)](https://badbc-studio.github.io/BadMC_Launcher) -[![Starcloudsea Bilibili](https://img.shields.io/badge/Bilibili-Starcloudsea-FF0000?style=for-the-badge&logo=bilibili&logoColor=FF0000&labelColor=F3F3F3&link=https%3A%2F%2Fspace.bilibili.com%2F2123349162)](https://space.bilibili.com/2123349162) -[![Drowned.Get Bilibili](https://img.shields.io/badge/Bilibili-Drowned.Get-FF0000?style=for-the-badge&logo=bilibili&logoColor=FF0000&labelColor=F3F3F3&link=https%3A%2F%2Fspace.bilibili.com%2F527675045)](https://space.bilibili.com/527675045) - -![Alt](https://repobeats.axiom.co/api/embed/0b7fadbd7ecc0d0650374fded18845b77630e3a1.svg "Repobeats analytics image") -
- -
- View README in other languages -
- -[**English**](https://github.com/BadBC-Studio/BadMC_Launcher/blob/Release/docs/README_enUS.md) - -> Want to contribute more languages? Please try opening a new pull request. -
-
- -
- 各个分支的解释 -
- -### Release 分支 - -这个分支的内容用于正式版本,它接收的更新最稳定,也最晚收到更新。 - -但是根据Starcloudsea的更新速度来看你可能需要等待一个世纪才能等到一个更新(。・・。)(不是) - -### Preview 分支 - -更新较快的分支. - -Drowned 分支的测试员(指每个更新分支在Drowned分支的启动器和 Drowned.Get(~~我被绑#……@&*!)~~)共同努力后发现这玩意也看不出什么 Bug 了之后直接通过 pr(不是那个 Pr!)直接变基到 Preview 分支的更新 - -由于更新较慢,所以在分支有更新时将编译一个新版本并发布到Release。 - -这个分支较为稳定,所以如果你想体验一下新功能,你可以试试这个( - -### Drowned 分支 - -更新最快的分支. - -为啥啥更新这么快? - -因为溺尸不睡觉于是Starcloudsea就把Drowned.Get绑架过来当免费劳动力了(Drowned.et: w@!#@&(*/#……*&......) - -在有一个新功能后Backup会打开一个拉取请求,这个拉取请求将把这个新功能变基到Drowne分支,GitHub将每周三检查提交,在发现新提交后将编译一个版本到Release. - -### Backup 分支 - -讲个笑话,Starcloudsea 曾经用 Git 成功删除了它的整个解决方案...... - -所以这是它长的记性o(TヘTo) Backup分支的内容不会在Release出现,因为这个分支是为防止解决方案丢失而做的备份,可能能用,可能不能用( - -没错,这个才是最最最新的分支! - -但是你千万别把它在正式环境用啊Σ(っ °Д °;)っ 不过你可以在这个分支的提交记录中看见一堆 Starcloudsea 发癫发的东西( - -
-
-
- -> [!CAUTION] -> 不要明确向主要贡献者询问关于这个项目的问题,因为他们不希望参与这个项目太多. - -## 简介 - -带有 Fluent 的 UI 风格的跨平台的 Minecraft 启动器, -旨在简化你的Minecraft体验。 - -## 应用截图 -> [!TIP] -> 只是还没写完的界面,请别乱想QAQ - -![MainPage](https://github.com/BadBC-Studio/BadMC_Launcher/blob/Release/docs/assets/BadMC_Launcher_MainPage.png) - -## 功能 -- Minecraft - - [ ] 启动 Minecraft Java - -### 为新功能投票! - -现在转到 GitHub Discussions,你可以提出一个新功能或为新功能投票,在审查通过后就等下世纪出现在你的启动器上吧!(喜) - -## 安装 - -> [!IMPORTANT] -> 首先,你需要确保你的电脑已安装 .NET 9 的附带 .NET 9 Runtime 的任意版本. -> [如果没有,在此处下载.](https://dotnet.microsoft.com/zh-cn/download/dotnet/9.0) - -> [!NOTE] -> 我们还没钱买各个商店的开发者账号QAQ - -在 Release 下载对应你的系统和架构的应用程序,对于安装包,直接安装即可,对于压缩包,解压后直接运行BadMC_Launcher.exe或主程序的可执行文件。 - -### 各个配置的区别 - -| 配置 | 支持的系统 | 注解 | -|--------------|--------------------------------|-----------------------| -| WinUI | Windows 10/11+ | 包含完整的 WinUI 支持 | -| Desktop | Windows 8/10/11+, MacOS, Linux | 包含类 WinUI 支持 | -| Mac Catalyst | MacOS | 未知(没编译过QAQ) | - -
- 在此查看详细教程 -
- -### Windows - -> 适用范围 -> -> WinUI: Windows 10/11+ -> -> Desktop: Windows 8/10/11+ -> -> Arm64, x64, x86 - -安装包: `BadMC_Launcher.\<你的系统架构\>-WinUIPackaged.msix` `BadMC_Launcher.\<你的系统架构\>-DesktopWindows.exe` -下载后直接直接运行程序即可进入安装流程。 - -压缩包: `BadMC_Launcher.\<你的系统架构\>-WinUIUnpackaged.zip` `BadMC_Launcher.\<你的系统架构\>-DesktopWindows.zip` -下载后解压然后运行BadMC_Launcher.exe.(**这不是安装程序!**) - -### macOS - -> 适用范围 -> -> 所有支持 .NET 9 和 Mac Catalyst 的 macOS(macOS 10.15+) -> -> Arm64, x64, x86 - -安装包: `BadMC_Launcher.\<你的系统架构\>-DesktopMacOS.dmg` `BadMC_Launcher.\<你的系统架构\>-MacCatalyst.pkg` -下载后直接直接运行程序即可进入安装流程. - -压缩包: `BadMC_Launcher.\<你的系统架构\>-DesktopMacOS.zip` `BadMC_Launcher.\<你的系统架构\>-MacCatalyst.zip` -下载后解压然后运行BadMC_Launcher.app.(**这不是安装程序!**) - -> [!IMPORTANT] -> 如果无法安装,请在终端运行这行命令. -> ```bash -> sudo spctl --master-disable -> ``` -> 然后打开`系统偏好设置 \> 隐私与安全性 \> 安全性`,点击`任何来源`. -> 这将允许MacOS从任何来源安装软件,你可以在设置将其关闭. -> -> 如果依然无法安装,请尝试在终端运行这行命令. -> ```bash -> sudo xattr -rd com.apple.quarantine \<你的dmg文件的路径,你可以直接将dmg文件拖到这里.\> -> ``` -> 运行这些命令可能会要求你输入管理员密码已验证身份,不过注意,在你输入密码时,终端不会显示你的输入. - -### Linux - -> 适用范围 -> -> 所有支持 .NET 9 的 Linux -> -> Arm64, x64, x86 - -安装包: `BadMC_Launcher.\<你的系统架构\>-DesktopLinux.snap` -下载后定位到安装包所在位置,使用snap安装BadMC_Launcher. -```bash -sudo snap install BadMC_Launcher.\<你的系统架构\>-DesktopLinux.snap --dangerous --classic -``` - -Snap应用商店: -直接在命令行输入这段命令以安装BadMC Launcher. -```bash -sudo snap install BadMC_Launcher -``` - -**不过在我们发布第一个Drowned分支的版本时应该还是别考虑这么一堆下载方式能用了吧......(QAQ)** - -
-
- -## 构建 - -由于 BadMC_Launcher 使用 Uno Platform 开发,所以在构建之前最好使用Uno.Check来设置环境: - -```bash -dotnet tool install Uno.Check -g - -//如果需要更新 -dotnet tool update Uno.Check -g - -uno-check -``` -无需修复 Android 或 ASP.NET 问题,我们没有用到这些. - -如果只是简单构建,请参考 [Uno Platform 的构建](https://platform.uno/docs/articles/uno-development/building-uno-ui.html) -如果需要发布,请最好参考 [Uno Platform 的发布流程](https://platform.uno/docs/articles/uno-publishing-overview.html). - -## 寻求帮助 & 报告问题 - -> [!WARNING] -> 1. 请在继续时使用 Bing 搜索你的问题 -> 2. **我们不对 `怎么解压`, `手机能用吗`, `怎么下载`, `桌面在哪`, `下载下来运行不了它说没有关联的程序打开zip文件`, `为什么我的 Windows 7 没法运行`, `我的 Windows 8.1 没法运行WinUIPackaged怎么回事`, `说好的免费为啥解压要钱啊`, `我电脑不是 i9 级吗怎么玩 MC 这么卡啊`, `这是怎么回事(附上一个缺少 .NET 运行时的截图)`, `装 .NET 9 怎么要 48 块钱啊`, `什么是微软账号`, `我要玩我的世界为什么上面显示"启动 Minecraft!"啊我不玩 Minecraft 啊`, `Java 是什么`, `JDK 是什么`, `这压缩包我看不懂啊(把源码下载下来了)`, `Forge 是什么`, `我Mod装上去崩了咋办啊(Mod问题问我们干嘛???(#°Д°))`, `它说要管理员权限,我得找我爸妈要吗`, `显卡和CPU是什么`, `为什么打不开啊(没附报错截图)`之类的问题进行解答,你是嫌我们的血压还不够高是吧(╬▔皿▔)╯** -> 4. 搜索有没有人提过类似的问题 -> -> **再乱搞你可要赔偿我们一顿 KFC 疯狂星期四降压套餐(恼😡)** - -你可以在 Issues 或者 Discussions 的 Q&A 板块提出问题,如果你的问题符合规则,我们会帮助你 awa - -**或者即刻加入我们的 QQ 群或 Discord 以获取帮助!q(≧▽≦q)(最快)** - -[![Discord](https://img.shields.io/discord/1025379148304240690?style=for-the-badge&logo=discord&logoColor=0077FF&label=Discord&labelColor=F3F3F3&color=0077FF&link=https%3A%2F%2Fdiscord.gg%2FjfZPPpC3Av)](https://discord.gg/jfZPPpC3Av) -[![BadBC Developer](https://img.shields.io/badge/BadBC%20Developer-%E7%94%B3%E8%AF%B7%20BadBC%20Developer%20%E6%88%90%E5%91%98-0077FF?style=for-the-badge&labelColor=F3F3F3&link=https%3A%2F%2Fforms.office.com%2Fr%2Fmp5madSnHi)](https://forms.office.com/r/mp5madSnHi) -[![Starcloudsea 的团伙窝点 (雾)](https://img.shields.io/badge/Starcloudsea%20%E7%9A%84%E5%9B%A2%E4%BC%99%E7%AA%9D%E7%82%B9%20(%E9%9B%BE)-631610017-0077FF?style=for-the-badge&labelColor=F3F3F3&link=https%3A%2F%2Fqm.qq.com%2Fq%2FtLesvcJCa4)](https://qm.qq.com/q/tLesvcJCa4) - -## 主要引用项 & 参考 - -### [WonderLab.Override](https://github.com/Bless-Studio/WonderLab.Override) - -真正的下一代跨平台 Minecraft 启动器 - -开源协议: [AGPL-3.0 license](https://github.com/Bless-Studio/WonderLab.Override/blob/master/LICENSE) - -### [Natsurainko.FluentLauncher](https://github.com/Xcube-Studio/Natsurainko.FluentLauncher) - -基于 .NET 8 以及 WinUI3 技术开发的 Minecraft Java 版启动器 -专为 Windows 11 设计的 Minecraft 启动器 -提供简洁、流畅的视觉体验 - -开源协议: [MIT license](https://github.com/Xcube-Studio/Natsurainko.FluentLauncher/blob/main/LICENSE) - -### [MinecraftLaunch](https://github.com/Bless-Studio/MinecraftLaunch) - -The next-generation versatile and modular high-performance Minecraft startup core. - -开源协议: [MIT license](https://github.com/Bless-Studio/MinecraftLaunch/blob/4.0.x/LICENSE) - -### [Uno Platform](https://github.com/unoplatform/uno) - -Pixel-Perfect. Multi-Platform. C# & Windows XAML. Today. - -开源协议: [Apache-2.0 license](https://github.com/unoplatform/uno/blob/master/License.md) - -### [WindowsAppSDK](https://github.com/microsoft/WindowsAppSDK) - -The Windows App SDK empowers all Windows desktop apps with modern Windows UI, APIs, and platform features, including back-compat support, shipped via NuGet. - -开源协议: [MIT license](https://github.com/microsoft/WindowsAppSDK/blob/main/LICENSE) - -### [WinUI 3](https://github.com/microsoft/microsoft-ui-xaml) - -WinUI: a modern UI framework with a rich set of controls and styles to build dynamic and high-performing Windows applications. - -开源协议: [MIT license](https://github.com/microsoft/microsoft-ui-xaml/blob/main/LICENSE) - -### [Windows Community Toolkit](https://github.com/CommunityToolkit/Windows) - -Collection of controls for WinUI 2, WinUI 3, and Uno Platform developers. Simplifies and demonstrates common developer tasks building experiences for Windows with .NET. - -开源协议: [MIT license](https://github.com/CommunityToolkit/Windows/blob/main/License.md) - -## 鸣谢 - -感谢 bangbang93 提供 Minecraft 的镜像服务. -[赞助 bangbang93](https://afdian.net/@bangbang93) - -## 开源协议 -[MPL-2.0 license](https://github.com/BadBC-Studio/BadMC_Launcher/blob/Release/LICENSE),在二次分发时请务必遵守该协议. - -Starcloudsea 的作品. -Copyright (c) 2019-2025 BadBC. diff --git a/TemplateEngineHost/vs/.vstemplates.global.etag b/TemplateEngineHost/vs/.vstemplates.global.etag deleted file mode 100644 index d7ae7aa..0000000 --- a/TemplateEngineHost/vs/.vstemplates.global.etag +++ /dev/null @@ -1 +0,0 @@ -ff8ddb577476f483a07c22dccb4bc5530cb0baeff1652f0a6377f4bced298f58 \ No newline at end of file diff --git a/TemplateEngineHost/vs/.vstemplates.local b/TemplateEngineHost/vs/.vstemplates.local deleted file mode 100644 index 8a16182..0000000 --- a/TemplateEngineHost/vs/.vstemplates.local +++ /dev/null @@ -1,18 +0,0 @@ -C:\Program Files\dotnet\templates\9.0.1\microsoft.dotnet.common.itemtemplates.9.0.102.nupkg -C:\Program Files\dotnet\templates\8.0.12\microsoft.dotnet.common.projecttemplates.8.0.8.0.405.nupkg -C:\Program Files\dotnet\templates\8.0.12\microsoft.dotnet.test.projecttemplates.8.0.1.1.0-rc.24059.1.nupkg -C:\Program Files\dotnet\templates\8.0.12\microsoft.dotnet.web.itemtemplates.8.0.8.0.12.nupkg -C:\Program Files\dotnet\templates\8.0.12\microsoft.dotnet.web.projecttemplates.8.0.8.0.12.nupkg -C:\Program Files\dotnet\templates\9.0.1\microsoft.dotnet.winforms.projecttemplates.9.0.1-servicing.24610.6.nupkg -C:\Program Files\dotnet\templates\9.0.1\microsoft.dotnet.wpf.projecttemplates.9.0.1-rtm.24610.3.nupkg -C:\Program Files\dotnet\templates\9.0.1\microsoft.dotnet.common.projecttemplates.9.0.9.0.102.nupkg -C:\Program Files\dotnet\templates\9.0.1\microsoft.dotnet.test.projecttemplates.9.0.1.1.0-rtm.24605.1.nupkg -C:\Program Files\dotnet\templates\9.0.1\microsoft.dotnet.web.itemtemplates.9.0.9.0.1.nupkg -C:\Program Files\dotnet\templates\9.0.1\microsoft.dotnet.web.projecttemplates.9.0.9.0.1.nupkg -C:\Program Files\dotnet\template-packs\microsoft.android.templates.35.0.24.nupkg -C:\Program Files\dotnet\template-packs\microsoft.ios.templates.18.1.9163.nupkg -C:\Program Files\dotnet\template-packs\microsoft.maccatalyst.templates.18.1.9163.nupkg -C:\Program Files\dotnet\template-packs\microsoft.macos.templates.15.1.9163.nupkg -C:\Program Files\dotnet\template-packs\microsoft.maui.templates.net9.9.0.0.nupkg -C:\Program Files\dotnet\template-packs\microsoft.maui.templates.net8.8.0.83.nupkg -c:\program files\microsoft visual studio\2022\community\common7\ide\extensions\microsoft\templateengine\Microsoft.VisualStudio.TemplateEngine.FallbackHostData.17.12.178.nupkg diff --git a/TemplateEngineHost/vs/.vstemplates.local.etag b/TemplateEngineHost/vs/.vstemplates.local.etag deleted file mode 100644 index de924cb..0000000 --- a/TemplateEngineHost/vs/.vstemplates.local.etag +++ /dev/null @@ -1 +0,0 @@ -6d57c16305935b5102cd9fe8c48e51ee3d0dacd8eb9291f67924abec32e37d17 \ No newline at end of file diff --git a/TemplateEngineHost/vs/templatecache.json b/TemplateEngineHost/vs/templatecache.json deleted file mode 100644 index db261ba..0000000 --- a/TemplateEngineHost/vs/templatecache.json +++ /dev/null @@ -1 +0,0 @@ -{"Version":"1.0.0.7","Locale":"zh-CN","TemplateInfo":[{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":null,"Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"如果为 true,则为文件系统目录层次结构中最近的 Directory.Build.props 添加 Import。默认情况下,Directory.Build.props 不会继承,因此这样做可以按文件夹生成一组自定义项。","Name":"inherit","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"False","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果为 true,则为文件系统目录层次结构中最近的 Directory.Build.props 添加 Import。默认情况下,Directory.Build.props 不会继承,因此这样做可以按文件夹生成一组自定义项。","DisplayName":"继承","AllowMultipleValues":false},{"Documentation":"如果为 true,则添加属性来启动工件输出布局。这是用于创建生成工件(例如 NuGet 包)的项目的常见模式,这些项目放置在公用文件夹中。","Name":"useArtifacts","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"False","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果为 true,则添加属性来启动工件输出布局。这是用于创建生成工件(例如 NuGet 包)的项目的常见模式,这些项目放置在公用文件夹中。","DisplayName":"使用工件输出布局","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.common.itemtemplates.9.0.102.nupkg","Author":"Microsoft","Classifications":["MSBuild","props"],"DefaultName":null,"Description":"一个空的 Directory.Build.props 文件,可用于为整个文件夹指定 MSBuild 属性","Identity":"Microsoft.Standard.QuickStarts.DirectoryProps","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"MSBuild.DirectoryPropsFile","Precedence":0,"Name":"MSBuild Directory.Build.props 文件","ShortNameList":["buildprops"],"PreferDefaultName":false,"ConfigPlace":"/content/BuildProps/.template.config/template.json","LocaleConfigPlace":"/content/BuildProps/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/BuildProps/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"type":"item"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"itemHierarchyPaths\":[\"General\"]}","PostActions":[],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":null,"Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"如果为 true,则为文件系统目录层次结构中最近的 Directory.Build.targets 添加 Import。默认情况下,Directory.Build.targets 不会继承,因此这样做可以按文件夹生成一组自定义项。","Name":"inherit","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"False","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果为 true,则为文件系统目录层次结构中最近的 Directory.Build.targets 添加 Import。默认情况下,Directory.Build.targets 不会继承,因此这样做可以按文件夹生成一组自定义项。","DisplayName":"继承","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.common.itemtemplates.9.0.102.nupkg","Author":"Microsoft","Classifications":["MSBuild","props"],"DefaultName":null,"Description":"一个空的 Directory.Build.targets 文件,可用于为整个文件夹指定 MSBuild 任务和目标","Identity":"Microsoft.Standard.QuickStarts.DirectoryTargets","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"MSBuild.DirectoryTargetsFile","Precedence":0,"Name":"MSBuild Directory.Build.targets 文件","ShortNameList":["buildtargets"],"PreferDefaultName":false,"ConfigPlace":"/content/BuildTargets/.template.config/template.json","LocaleConfigPlace":"/content/BuildTargets/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/BuildTargets/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"type":"item"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"itemHierarchyPaths\":[\"General\"]}","PostActions":[],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Class1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.common.itemtemplates.9.0.102.nupkg","Author":"Microsoft","Classifications":["Common"],"DefaultName":"Class1","Description":"创建新的 C# 类","Identity":"DotNet.Common.Class.CSharp","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"DotNet.Common.Class","Precedence":0,"Name":"类","ShortNameList":["class"],"PreferDefaultName":true,"ConfigPlace":"/content/Class-CSharp/.template.config/template.json","LocaleConfigPlace":"/content/Class-CSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":null,"PostActions":[],"Constraints":[{"Type":"project-capability","Args":"\"CSharp\""}]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Class1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"VB":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"VB","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.common.itemtemplates.9.0.102.nupkg","Author":"Microsoft","Classifications":["Common"],"DefaultName":"Class1","Description":"创建新的 Visual Basic 类","Identity":"DotNet.Common.Class.VisualBasic","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"DotNet.Common.Class","Precedence":0,"Name":"类","ShortNameList":["class"],"PreferDefaultName":true,"ConfigPlace":"/content/Class-VisualBasic/.template.config/template.json","LocaleConfigPlace":"/content/Class-VisualBasic/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"item"},"HostData":null,"PostActions":[],"Constraints":[{"Type":"project-capability","Args":"\"VB\""}]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":null,"Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"创建空的 .editorconfig 而非 .NET 的默认值。","Name":"Empty","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"创建空的 .editorconfig 而非 .NET 的默认值。","DisplayName":"空","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.common.itemtemplates.9.0.102.nupkg","Author":"Microsoft","Classifications":["Config"],"DefaultName":null,"Description":"创建用于配置代码样式首选项的 .editorconfig 文件。","Identity":"Microsoft.Standard.QuickStarts.EditorConfigFile","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":null,"Precedence":0,"Name":"EditorConfig 文件","ShortNameList":["editorconfig",".editorconfig"],"PreferDefaultName":false,"ConfigPlace":"/content/EditorConfig/.template.config/template.json","LocaleConfigPlace":"/content/EditorConfig/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"type":"item"},"HostData":null,"PostActions":[],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Enum1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.common.itemtemplates.9.0.102.nupkg","Author":"Microsoft","Classifications":["Common"],"DefaultName":"Enum1","Description":"创建新的 C# 枚举","Identity":"DotNet.Common.Enum.CSharp","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"DotNet.Common.Enum","Precedence":0,"Name":"枚举","ShortNameList":["enum"],"PreferDefaultName":true,"ConfigPlace":"/content/Enum-CSharp/.template.config/template.json","LocaleConfigPlace":"/content/Enum-CSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":null,"PostActions":[],"Constraints":[{"Type":"project-capability","Args":"\"CSharp\""}]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Enum1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"VB":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"VB","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.common.itemtemplates.9.0.102.nupkg","Author":"Microsoft","Classifications":["Common"],"DefaultName":"Enum1","Description":"创建新的 Visual Basic 枚举","Identity":"DotNet.Common.Enum.VisualBasic","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"DotNet.Common.Enum","Precedence":0,"Name":"枚举","ShortNameList":["enum"],"PreferDefaultName":true,"ConfigPlace":"/content/Enum-VisualBasic/.template.config/template.json","LocaleConfigPlace":"/content/Enum-VisualBasic/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"item"},"HostData":null,"PostActions":[],"Constraints":[{"Type":"project-capability","Args":"\"VB\""}]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":null,"Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.common.itemtemplates.9.0.102.nupkg","Author":"Microsoft","Classifications":["Config"],"DefaultName":null,"Description":"为 dotnet 项目创建 gitignore 文件。","Identity":"Microsoft.Standard.QuickStarts.GitignoreFile","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"GitignoreFile","Precedence":100,"Name":"dotnet gitignore 文件","ShortNameList":["gitignore",".gitignore"],"PreferDefaultName":false,"ConfigPlace":"/content/Gitignore/.template.config/template.json","LocaleConfigPlace":"/content/Gitignore/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"type":"item"},"HostData":null,"PostActions":[],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"unused","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"要使用的 .NET SDK 的版本。","Name":"SdkVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":null,"DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要使用的 .NET SDK 的版本。","DisplayName":"SDK 版本","AllowMultipleValues":false},{"Documentation":"","Name":"dotnet-cli-version","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":null,"DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"","DisplayName":"dotnet CLI 版本","AllowMultipleValues":false},{"Documentation":"选择 SDK 版本时要使用的前滚策略。","Name":"RollForward","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"patch":{"DisplayName":"补丁","Description":"使用指定的版本。\n如果未找到,请前滚到最新的补丁级别。\n如果未找到,则为失败。\n该值为早期 SDK 版本中的旧行为。"},"feature":{"DisplayName":"功能","Description":"为指定的主要版本、次要版本以及功能区段使用最新的补丁级别。\n如果未找到,请前滚到同一主要/次要版本中的下一个更高功能区段,并为该功能区段使用最新的补丁级别。\n如果未找到,则为失败。"},"minor":{"DisplayName":"次要版本","Description":"为指定的主要版本、次要版本以及功能区段使用最新的补丁级别。\n如果未找到,请前滚到同一主要/次要版本中的下一个更高功能区段,并为该功能区段使用最新的补丁级别。\n如果未找到,请前滚到同一次要版本中的下一个更高次要版本和功能区段,并为该功能区段使用最新的补丁级别。\n如果未找到,则为失败。"},"major":{"DisplayName":"主要版本","Description":"为指定的主要版本、次要版本以及功能区段使用最新的补丁级别。\n如果未找到,请前滚到同一主要/次要版本中的下一个更高功能区段,并为该功能区段使用最新的补丁级别。\n如果未找到,请前滚到同一主要版本中的下一个更高次要版本和功能区段,并为该功能区段使用最新的补丁级别。\n如果未找到,请前滚到下一个更高的主要版本、次要版本以及功能区段,并为该功能区段使用最新的补丁级别。\n如果未找到,则为失败。"},"latestPatch":{"DisplayName":"最新补丁","Description":"使用最新安装的补丁级别,该级别与请求的主要版本、次要版本以及功能区段(具有补丁级别)匹配,且大于或等于指定值。\n如果未找到,则为失败。"},"latestFeature":{"DisplayName":"最新功能","Description":"使用安装的最高功能区段和补丁级别,该级别与请求的主要版本和次要版本(具有功能区段和大于或等于指定值的补丁级别)匹配。\n如果未找到,则为失败。"},"latestMinor":{"DisplayName":"最新次要版本","Description":"使用安装的最高次要版本、功能区段以及补丁级别,该级别与请求的主要版本(具有次要版本、功能区段以及大于或等于指定值的补丁级别)匹配。\n如果未找到,则为失败。"},"latestMajor":{"DisplayName":"最新主要版本","Description":"使用安装的最高 .NET SDK,其版本大于或等于指定值。\n如果未找到,则为失败。"},"disable":{"DisplayName":"禁用前滚","Description":"不要前滚。需要完全匹配。"}},"Description":"选择 SDK 版本时要使用的前滚策略。","DisplayName":"前滚策略","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.common.itemtemplates.9.0.102.nupkg","Author":"Microsoft","Classifications":["Config"],"DefaultName":"global.json","Description":"用于选择 .NET SDK 版本的文件。","Identity":"Microsoft.Standard.QuickStarts.GlobalJsonFile","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"GlobalJsonFile","Precedence":100,"Name":"global.json file","ShortNameList":["globaljson","global.json"],"PreferDefaultName":false,"ConfigPlace":"/content/GlobalJson/.template.config/template.json","LocaleConfigPlace":"/content/GlobalJson/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"type":"item"},"HostData":null,"PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Interface1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.common.itemtemplates.9.0.102.nupkg","Author":"Microsoft","Classifications":["Common"],"DefaultName":"Interface1","Description":"创建新的 C# 接口","Identity":"DotNet.Common.Interface.CSharp","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"DotNet.Common.Interface","Precedence":0,"Name":"接口","ShortNameList":["interface"],"PreferDefaultName":true,"ConfigPlace":"/content/Interface-CSharp/.template.config/template.json","LocaleConfigPlace":"/content/Interface-CSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":null,"PostActions":[],"Constraints":[{"Type":"project-capability","Args":"\"CSharp\""}]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Interface1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"VB":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"VB","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.common.itemtemplates.9.0.102.nupkg","Author":"Microsoft","Classifications":["Common"],"DefaultName":"Interface1","Description":"创建新的 Visual Basic 接口","Identity":"DotNet.Common.Interface.VisualBasic","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"DotNet.Common.Interface","Precedence":0,"Name":"接口","ShortNameList":["interface"],"PreferDefaultName":true,"ConfigPlace":"/content/Interface-VisualBasic/.template.config/template.json","LocaleConfigPlace":"/content/Interface-VisualBasic/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"item"},"HostData":null,"PostActions":[],"Constraints":[{"Type":"project-capability","Args":"\"VB\""}]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Module1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"VB":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"VB","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.common.itemtemplates.9.0.102.nupkg","Author":"Microsoft","Classifications":["Common"],"DefaultName":"Module1","Description":"创建新的 Visual Basic 模块","Identity":"DotNet.Common.Module.VisualBasic","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"DotNet.Common.Module","Precedence":0,"Name":"模块","ShortNameList":["module"],"PreferDefaultName":true,"ConfigPlace":"/content/Module-VisualBasic/.template.config/template.json","LocaleConfigPlace":"/content/Module-VisualBasic/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"item"},"HostData":null,"PostActions":[],"Constraints":[{"Type":"project-capability","Args":"\"VB\""}]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":null,"Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.common.itemtemplates.9.0.102.nupkg","Author":"Microsoft","Classifications":["Config"],"DefaultName":"nuget.config","Description":"用于配置位置 NuGet 的文件将搜索包","Identity":"Microsoft.Standard.QuickStarts.Nuget.Config","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"ItemNugetConfig","Precedence":100,"Name":"NuGet 配置","ShortNameList":["nugetconfig","nuget.config"],"PreferDefaultName":false,"ConfigPlace":"/content/Nuget/.template.config/template.json","LocaleConfigPlace":"/content/Nuget/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"type":"item"},"HostData":null,"PostActions":["cb9a6cf3-4f5c-4860-b9d2-03a574959774","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":null,"Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"如果为 true,则会为文件系统目录层次结构中最近的 Directory.Packages.props 添加 Import。默认情况下,Directory.Packages.props 不会继承,因此这样做可以按文件夹生成一组自定义项。","Name":"inherit","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"False","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果为 true,则会为文件系统目录层次结构中最近的 Directory.Packages.props 添加 Import。默认情况下,Directory.Packages.props 不会继承,因此这样做可以按文件夹生成一组自定义项。","DisplayName":"继承","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.common.itemtemplates.9.0.102.nupkg","Author":"Microsoft","Classifications":["MSBuild","packages","props","CPM"],"DefaultName":null,"Description":"一个空的 Directory.Packages.props 文件,可用于集中指定包版本","Identity":"Microsoft.Standard.QuickStarts.DirectoryPackages","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"MSBuild.DirectoryPackagesFile","Precedence":0,"Name":"MSBuild Directory.Packages.props 文件","ShortNameList":["packagesprops"],"PreferDefaultName":false,"ConfigPlace":"/content/PackagesProps/.template.config/template.json","LocaleConfigPlace":"/content/PackagesProps/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/PackagesProps/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"type":"item"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"itemHierarchyPaths\":[\"General\"]}","PostActions":[],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Record1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.common.itemtemplates.9.0.102.nupkg","Author":"Microsoft","Classifications":["Common"],"DefaultName":"Record1","Description":"创建新的 C# 记录","Identity":"DotNet.Common.Record.CSharp","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"DotNet.Common.Record","Precedence":0,"Name":"记录","ShortNameList":["record"],"PreferDefaultName":true,"ConfigPlace":"/content/Record-CSharp/.template.config/template.json","LocaleConfigPlace":"/content/Record-CSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":null,"PostActions":[],"Constraints":[{"Type":"project-capability","Args":"\"CSharp\""}]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Solution1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.common.itemtemplates.9.0.102.nupkg","Author":"Microsoft","Classifications":["Solution"],"DefaultName":"Solution1","Description":"创建不包含项目的空解决方案","Identity":"Microsoft.Standard.QuickStarts.Solution","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"ItemSolution","Precedence":100,"Name":"解决方案文件","ShortNameList":["sln","solution"],"PreferDefaultName":false,"ConfigPlace":"/content/Solution/.template.config/template.json","LocaleConfigPlace":"/content/Solution/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{},"HostData":null,"PostActions":[],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Struct1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.common.itemtemplates.9.0.102.nupkg","Author":"Microsoft","Classifications":["Common"],"DefaultName":"Struct1","Description":"创建新的 C# 结构","Identity":"DotNet.Common.Struct.CSharp","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"DotNet.Common.Struct","Precedence":0,"Name":"结构","ShortNameList":["struct"],"PreferDefaultName":true,"ConfigPlace":"/content/Struct-CSharp/.template.config/template.json","LocaleConfigPlace":"/content/Struct-CSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":null,"PostActions":[],"Constraints":[{"Type":"project-capability","Args":"\"CSharp\""}]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Structure1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"VB":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"VB","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.common.itemtemplates.9.0.102.nupkg","Author":"Microsoft","Classifications":["Common"],"DefaultName":"Structure1","Description":"创建新的 Visual Basic 结构","Identity":"DotNet.Common.Struct.VisualBasic","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"DotNet.Common.Struct","Precedence":0,"Name":"结构","ShortNameList":["struct","structure"],"PreferDefaultName":true,"ConfigPlace":"/content/Structure-VisualBasic/.template.config/template.json","LocaleConfigPlace":"/content/Structure-VisualBasic/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"item"},"HostData":null,"PostActions":[],"Constraints":[{"Type":"project-capability","Args":"\"VB\""}]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":null,"Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.common.itemtemplates.9.0.102.nupkg","Author":"Microsoft","Classifications":["Config"],"DefaultName":null,"Description":"定义可用 dotnet 工具的文件。","Identity":"Microsoft.Standard.QuickStarts.ToolManifestFile","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"ToolManifestFile","Precedence":100,"Name":"Dotnet 本地工具清单文件","ShortNameList":["tool-manifest"],"PreferDefaultName":false,"ConfigPlace":"/content/ToolManifest/.template.config/template.json","LocaleConfigPlace":"/content/ToolManifest/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"type":"item"},"HostData":null,"PostActions":[],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"WebConfig","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.common.itemtemplates.9.0.102.nupkg","Author":"Microsoft","Classifications":["Config"],"DefaultName":"web.config","Description":"用于配置 Web 应用程序设置的文件","Identity":"Microsoft.Standard.QuickStarts.Web.Config","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"ItemWebConfig","Precedence":100,"Name":"Web 配置","ShortNameList":["webconfig"],"PreferDefaultName":false,"ConfigPlace":"/content/WebConfig/.template.config/template.json","LocaleConfigPlace":"/content/WebConfig/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"type":"item"},"HostData":null,"PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.ClassLibrary1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"替代目标框架","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代目标框架","DisplayName":"目标框架替代","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net8.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net8.0":{"DisplayName":".NET 8.0","Description":"目标 net8.0"},"netstandard2.1":{"DisplayName":".NET Standard 2.1","Description":"目标 netstandard2.1"},"netstandard2.0":{"DisplayName":".NET Standard 2.0","Description":"目标 netstandard2.0"}},"Description":"项目的目标框架。","DisplayName":"框架","AllowMultipleValues":false},{"Documentation":"在创建的项目文件中设置 LangVersion 属性","Name":"langVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"在创建的项目文件中设置 LangVersion 属性","DisplayName":"语言版本","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"跳过还原","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.common.projecttemplates.8.0.8.0.405.nupkg","Author":"Microsoft","Classifications":["Common","Library"],"DefaultName":"ClassLibrary1","Description":"用于创建面向 .NET 或 .NET Standard 的类库的项目","Identity":"Microsoft.Common.Library.CSharp.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.Library","Precedence":10000,"Name":"类库","ShortNameList":["classlib"],"PreferDefaultName":false,"ConfigPlace":"/content/ClassLibrary-CSharp/.template.config/template.json","LocaleConfigPlace":"/content/ClassLibrary-CSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/ClassLibrary-CSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{"app":{"Description":"Target .NET","DefaultOverrides":{"Framework":"net8.0"}},"standard":{"Description":"Target netstandard","DefaultOverrides":{"Framework":"netstandard2.0"}}},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"tags\":[{\"type\":\"projectType\",\"add\":[],\"remove\":[\"Common\"]}]}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.ClassLibrary1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"F#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"F#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"替代目标框架","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代目标框架","DisplayName":"目标框架替代","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net8.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net8.0":{"DisplayName":".NET 8.0","Description":"目标 net8.0"},"netstandard2.1":{"DisplayName":".NET Standard 2.1","Description":"目标 netstandard2.1"},"netstandard2.0":{"DisplayName":".NET Standard 2.0","Description":"目标 netstandard2.0"}},"Description":"项目的目标框架。","DisplayName":"框架","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"跳过还原","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.common.projecttemplates.8.0.8.0.405.nupkg","Author":"Microsoft","Classifications":["Common","Library"],"DefaultName":"ClassLibrary1","Description":"用于创建面向 .NET 或 .NET Standard 的类库的项目","Identity":"Microsoft.Common.Library.FSharp.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.Library","Precedence":10000,"Name":"类库","ShortNameList":["classlib"],"PreferDefaultName":false,"ConfigPlace":"/content/ClassLibrary-FSharp/.template.config/template.json","LocaleConfigPlace":"/content/ClassLibrary-FSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/ClassLibrary-FSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{"app":{"Description":"Target .NET","DefaultOverrides":{"Framework":"net8.0"}},"standard":{"Description":"Target netstandard","DefaultOverrides":{"Framework":"netstandard2.0"}}},"TagsCollection":{"language":"F#","type":"project"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"tags\":[{\"type\":\"projectType\",\"add\":[],\"remove\":[\"Common\"]}]}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.ClassLibrary1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"VB":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"VB","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"替代目标框架","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代目标框架","DisplayName":"目标框架替代","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net8.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net8.0":{"DisplayName":".NET 8.0","Description":"目标 net8.0"},"netstandard2.1":{"DisplayName":".NET Standard 2.1","Description":"目标 netstandard2.1"},"netstandard2.0":{"DisplayName":".NET Standard 2.0","Description":"目标 netstandard2.0"}},"Description":"项目的目标框架。","DisplayName":"框架","AllowMultipleValues":false},{"Documentation":"在创建的项目文件中设置 LangVersion 属性","Name":"langVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"在创建的项目文件中设置 LangVersion 属性","DisplayName":"语言版本","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"跳过还原","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.common.projecttemplates.8.0.8.0.405.nupkg","Author":"Microsoft","Classifications":["Common","Library"],"DefaultName":"ClassLibrary1","Description":"用于创建面向 .NET 或 .NET Standard 的类库的项目","Identity":"Microsoft.Common.Library.VisualBasic.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.Library","Precedence":10000,"Name":"类库","ShortNameList":["classlib"],"PreferDefaultName":false,"ConfigPlace":"/content/ClassLibrary-VisualBasic/.template.config/template.json","LocaleConfigPlace":"/content/ClassLibrary-VisualBasic/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/ClassLibrary-VisualBasic/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{"app":{"Description":"Target .NET","DefaultOverrides":{"Framework":"net8.0"}},"standard":{"Description":"Target netstandard","DefaultOverrides":{"Framework":"netstandard2.0"}}},"TagsCollection":{"language":"VB","type":"project"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"tags\":[{\"type\":\"projectType\",\"add\":[],\"remove\":[\"Common\"]}]}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.ConsoleApplication1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"替代目标框架","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代目标框架","DisplayName":"目标框架替代","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net8.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net8.0":{"DisplayName":".NET 8.0","Description":"目标 net8.0"}},"Description":"项目的目标框架。","DisplayName":"框架","AllowMultipleValues":false},{"Documentation":"在创建的项目文件中设置 LangVersion 属性","Name":"langVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"在创建的项目文件中设置 LangVersion 属性","DisplayName":"语言版本","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"跳过还原","AllowMultipleValues":false},{"Documentation":"是否生成显式程序类和主方法,而不是顶级语句。","Name":"UseProgramMain","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否生成显式程序类和主方法,而不是顶级语句。","DisplayName":"不使用顶级语句(_T)","AllowMultipleValues":false},{"Documentation":"是否启用将项目以 native AOT 发布。","Name":"NativeAot","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否启用将项目以 native AOT 发布。","DisplayName":"启用 native AOT 发布(_N)","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.common.projecttemplates.8.0.8.0.405.nupkg","Author":"Microsoft","Classifications":["Common","Console"],"DefaultName":"ConsoleApp1","Description":"用于创建可在 Windows、Linux 和 macOS 上 .NET 上运行的命令行应用程序的项目","Identity":"Microsoft.Common.Console.CSharp.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.Console","Precedence":10000,"Name":"控制台应用","ShortNameList":["console"],"PreferDefaultName":false,"ConfigPlace":"/content/ConsoleApplication-CSharp/.template.config/template.json","LocaleConfigPlace":"/content/ConsoleApplication-CSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/ConsoleApplication-CSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"tags\":[{\"type\":\"projectType\",\"add\":[],\"remove\":[\"Common\"]}],\"symbolInfo\":[{\"id\":\"UseProgramMain\",\"isVisible\":true,\"PersistenceScope\":\"Shared\",\"PersistenceScopeName\":\"Microsoft\"},{\"id\":\"NativeAot\",\"isVisible\":true}]}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.ConsoleApplication1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"F#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"F#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"替代目标框架","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代目标框架","DisplayName":"目标框架替代","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net8.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net8.0":{"DisplayName":".NET 8.0","Description":"目标 net8.0"}},"Description":"项目的目标框架。","DisplayName":"框架","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"跳过还原","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.common.projecttemplates.8.0.8.0.405.nupkg","Author":"Microsoft","Classifications":["Common","Console"],"DefaultName":"ConsoleApp1","Description":"用于创建可在 Windows、Linux 和 macOS 上 .NET 上运行的命令行应用程序的项目","Identity":"Microsoft.Common.Console.FSharp.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.Console","Precedence":10000,"Name":"控制台应用","ShortNameList":["console"],"PreferDefaultName":false,"ConfigPlace":"/content/ConsoleApplication-FSharp/.template.config/template.json","LocaleConfigPlace":"/content/ConsoleApplication-FSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/ConsoleApplication-FSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"F#","type":"project"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"tags\":[{\"type\":\"projectType\",\"add\":[],\"remove\":[\"Common\"]}]}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.ConsoleApplication1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"VB":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"VB","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"替代目标框架","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代目标框架","DisplayName":"目标框架替代","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net8.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net8.0":{"DisplayName":".NET 8.0","Description":"目标 net8.0"}},"Description":"项目的目标框架。","DisplayName":"框架","AllowMultipleValues":false},{"Documentation":"在创建的项目文件中设置 LangVersion 属性","Name":"langVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"在创建的项目文件中设置 LangVersion 属性","DisplayName":"语言版本","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"跳过还原","AllowMultipleValues":false},{"Documentation":"是否启用将项目以 native AOT 发布。","Name":"NativeAot","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否启用将项目以 native AOT 发布。","DisplayName":"启用 native AOT 发布(_N)","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.common.projecttemplates.8.0.8.0.405.nupkg","Author":"Microsoft","Classifications":["Common","Console"],"DefaultName":"ConsoleApp1","Description":"用于创建可在 Windows、Linux 和 macOS 上 .NET 上运行的命令行应用程序的项目","Identity":"Microsoft.Common.Console.VisualBasic.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.Console","Precedence":10000,"Name":"控制台应用","ShortNameList":["console"],"PreferDefaultName":false,"ConfigPlace":"/content/ConsoleApplication-VisualBasic/.template.config/template.json","LocaleConfigPlace":"/content/ConsoleApplication-VisualBasic/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/ConsoleApplication-VisualBasic/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"project"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"tags\":[{\"type\":\"projectType\",\"add\":[],\"remove\":[\"Common\"]}],\"symbolInfo\":[{\"id\":\"NativeAot\",\"isVisible\":true}]}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"Company.TestProject1","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"C#","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"C#":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":"Overrides the target framework","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"Overrides the target framework","DisplayName":"","AllowMultipleValues":false},{"Documentation":"The target framework for the project.","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net8.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net8.0":{"DisplayName":"","Description":"Target net8.0"}},"Description":"The target framework for the project.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Whether or not to enable packaging (via (\"dotnet pack\") for the project.","Name":"EnablePack","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Whether or not to enable packaging (via (\"dotnet pack\") for the project.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"If specified, skips the automatic restore of the project on create.","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"If specified, skips the automatic restore of the project on create.","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.test.projecttemplates.8.0.1.1.0-rc.24059.1.nupkg","Author":"Microsoft","Classifications":["Test","MSTest"],"DefaultName":"TestProject1","Description":"A project that contains MSTest unit tests that can run on .NET on Windows, Linux and MacOS.","Identity":"Microsoft.Test.MSTest.CSharp.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Test.MSTest","Precedence":10000,"Name":"MSTest Test Project","ShortNameList":["mstest"],"PreferDefaultName":false,"ConfigPlace":"/content/MSTest-CSharp/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":null,"PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"Company.TestProject1","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"F#","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"F#":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":"Overrides the target framework","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"Overrides the target framework","DisplayName":"","AllowMultipleValues":false},{"Documentation":"The target framework for the project.","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net8.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net8.0":{"DisplayName":"","Description":"Target net8.0"}},"Description":"The target framework for the project.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Whether or not to enable packaging (via (\"dotnet pack\") for the project.","Name":"EnablePack","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Whether or not to enable packaging (via (\"dotnet pack\") for the project.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"If specified, skips the automatic restore of the project on create.","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"If specified, skips the automatic restore of the project on create.","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.test.projecttemplates.8.0.1.1.0-rc.24059.1.nupkg","Author":"Microsoft","Classifications":["Test","MSTest"],"DefaultName":"TestProject1","Description":"A project that contains MSTest unit tests that can run on .NET on Windows, Linux and MacOS.","Identity":"Microsoft.Test.MSTest.FSharp.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Test.MSTest","Precedence":10000,"Name":"MSTest Test Project","ShortNameList":["mstest"],"PreferDefaultName":false,"ConfigPlace":"/content/MSTest-FSharp/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"F#","type":"project"},"HostData":null,"PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"Company.TestProject1","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"VB","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"VB":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":"Overrides the target framework","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"Overrides the target framework","DisplayName":"","AllowMultipleValues":false},{"Documentation":"The target framework for the project.","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net8.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net8.0":{"DisplayName":"","Description":"Target net8.0"}},"Description":"The target framework for the project.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Whether or not to enable packaging (via (\"dotnet pack\") for the project.","Name":"EnablePack","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Whether or not to enable packaging (via (\"dotnet pack\") for the project.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"If specified, skips the automatic restore of the project on create.","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"If specified, skips the automatic restore of the project on create.","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.test.projecttemplates.8.0.1.1.0-rc.24059.1.nupkg","Author":"Microsoft","Classifications":["Test","MSTest"],"DefaultName":"TestProject1","Description":"A project that contains MSTest unit tests that can run on .NET on Windows, Linux and MacOS.","Identity":"Microsoft.Test.MSTest.VisualBasic.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Test.MSTest","Precedence":10000,"Name":"MSTest Test Project","ShortNameList":["mstest"],"PreferDefaultName":false,"ConfigPlace":"/content/MSTest-VisualBasic/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"project"},"HostData":null,"PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"UnitTest1","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"C#","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"C#":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"item","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"item":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.test.projecttemplates.8.0.1.1.0-rc.24059.1.nupkg","Author":"Aleksei Kharlov aka halex2005 (codeofclimber.ru)","Classifications":["Test","NUnit"],"DefaultName":"NUnitTestItem","Description":"A item that contains NUnit tests","Identity":"NUnit3.DotNetNew.ItemTemplate.CSharp","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"NUnit3.DotNetNew.ItemTemplate","Precedence":0,"Name":"NUnit 3 Test Item","ShortNameList":["nunit-test"],"PreferDefaultName":false,"ConfigPlace":"/content/NUnit-CSharp-Item/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":null,"PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"Company.TestProject1","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"C#","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"C#":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":"Overrides the target framework","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"Overrides the target framework","DisplayName":"","AllowMultipleValues":false},{"Documentation":"The target framework for the project.","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net8.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net8.0":{"DisplayName":"","Description":"Target net8.0"}},"Description":"The target framework for the project.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Whether or not to enable packaging (via (\"dotnet pack\") for the project.","Name":"EnablePack","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Whether or not to enable packaging (via (\"dotnet pack\") for the project.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"If specified, skips the automatic restore of the project on create.","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"If specified, skips the automatic restore of the project on create.","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.test.projecttemplates.8.0.1.1.0-rc.24059.1.nupkg","Author":"Aleksei Kharlov aka halex2005 (codeofclimber.ru)","Classifications":["Test","NUnit"],"DefaultName":"TestProject1","Description":"A project that contains NUnit tests that can run on .NET on Windows, Linux and macOS","Identity":"NUnit3.DotNetNew.Template.CSharp.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"NUnit3.DotNetNew.Template","Precedence":10000,"Name":"NUnit 3 Test Project","ShortNameList":["nunit"],"PreferDefaultName":false,"ConfigPlace":"/content/NUnit-CSharp/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":null,"PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"UnitTest1","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"F#","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"F#":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"item","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"item":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.test.projecttemplates.8.0.1.1.0-rc.24059.1.nupkg","Author":"Aleksei Kharlov aka halex2005 (codeofclimber.ru)","Classifications":["Test","NUnit"],"DefaultName":"NUnitTestItem","Description":"A item that contains NUnit tests","Identity":"NUnit3.DotNetNew.ItemTemplate.FSharp","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"NUnit3.DotNetNew.ItemTemplate","Precedence":0,"Name":"NUnit 3 Test Item","ShortNameList":["nunit-test"],"PreferDefaultName":false,"ConfigPlace":"/content/NUnit-FSharp-Item/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"F#","type":"item"},"HostData":null,"PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"Company.TestProject1","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"F#","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"F#":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":"Overrides the target framework","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"Overrides the target framework","DisplayName":"","AllowMultipleValues":false},{"Documentation":"The target framework for the project.","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net8.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net8.0":{"DisplayName":"","Description":"Target net8.0"}},"Description":"The target framework for the project.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Whether or not to enable packaging (via (\"dotnet pack\") for the project.","Name":"EnablePack","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Whether or not to enable packaging (via (\"dotnet pack\") for the project.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"If specified, skips the automatic restore of the project on create.","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"If specified, skips the automatic restore of the project on create.","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.test.projecttemplates.8.0.1.1.0-rc.24059.1.nupkg","Author":"Aleksei Kharlov aka halex2005 (codeofclimber.ru)","Classifications":["Test","NUnit"],"DefaultName":"TestProject1","Description":"A project that contains NUnit tests that can run on .NET on Windows, Linux and macOS","Identity":"NUnit3.DotNetNew.Template.FSharp.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"NUnit3.DotNetNew.Template","Precedence":10000,"Name":"NUnit 3 Test Project","ShortNameList":["nunit"],"PreferDefaultName":false,"ConfigPlace":"/content/NUnit-FSharp/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"F#","type":"project"},"HostData":null,"PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"UnitTest1","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"VB","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"VB":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"item","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"item":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.test.projecttemplates.8.0.1.1.0-rc.24059.1.nupkg","Author":"Aleksei Kharlov aka halex2005 (codeofclimber.ru)","Classifications":["Test","NUnit"],"DefaultName":"NUnitTestItem","Description":"A item that contains NUnit tests","Identity":"NUnit3.DotNetNew.ItemTemplate.VisualBasic","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"NUnit3.DotNetNew.ItemTemplate","Precedence":0,"Name":"NUnit 3 Test Item","ShortNameList":["nunit-test"],"PreferDefaultName":false,"ConfigPlace":"/content/NUnit-VisualBasic-Item/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"item"},"HostData":null,"PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"Company.TestProject1","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"VB","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"VB":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":"Overrides the target framework","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"Overrides the target framework","DisplayName":"","AllowMultipleValues":false},{"Documentation":"The target framework for the project.","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net8.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net8.0":{"DisplayName":"","Description":"Target net8.0"}},"Description":"The target framework for the project.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Whether or not to enable packaging (via (\"dotnet pack\") for the project.","Name":"EnablePack","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Whether or not to enable packaging (via (\"dotnet pack\") for the project.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"If specified, skips the automatic restore of the project on create.","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"If specified, skips the automatic restore of the project on create.","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.test.projecttemplates.8.0.1.1.0-rc.24059.1.nupkg","Author":"Aleksei Kharlov aka halex2005 (codeofclimber.ru)","Classifications":["Test","NUnit"],"DefaultName":"TestProject1","Description":"A project that contains NUnit tests that can run on .NET on Windows, Linux and macOS","Identity":"NUnit3.DotNetNew.Template.VisualBasic.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"NUnit3.DotNetNew.Template","Precedence":10000,"Name":"NUnit 3 Test Project","ShortNameList":["nunit"],"PreferDefaultName":false,"ConfigPlace":"/content/NUnit-VisualBasic/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"project"},"HostData":null,"PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"Company.TestProject1","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"C#","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"C#":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":"Overrides the target framework","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"Overrides the target framework","DisplayName":"","AllowMultipleValues":false},{"Documentation":"The target framework for the project.","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net8.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net8.0":{"DisplayName":"","Description":"Target net8.0"}},"Description":"The target framework for the project.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Whether or not to enable packaging (via (\"dotnet pack\") for the project.","Name":"EnablePack","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Whether or not to enable packaging (via (\"dotnet pack\") for the project.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"If specified, skips the automatic restore of the project on create.","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"If specified, skips the automatic restore of the project on create.","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.test.projecttemplates.8.0.1.1.0-rc.24059.1.nupkg","Author":"Microsoft","Classifications":["Test","MSTest","Playwright"],"DefaultName":"TestProject1","Description":"A project that contains Playwright tests using MSTest test framwork, that can run on .NET on Windows, Linux and MacOS.","Identity":"Microsoft.Test.Playwright.MSTest.CSharp.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Test.Playwright.MSTest","Precedence":10000,"Name":"MSTest Playwright Test Project","ShortNameList":["mstest-playwright"],"PreferDefaultName":false,"ConfigPlace":"/content/Playwright-MSTest-CSharp/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":null,"PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"Company.TestProject1","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"C#","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"C#":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":"Overrides the target framework","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"Overrides the target framework","DisplayName":"","AllowMultipleValues":false},{"Documentation":"The target framework for the project.","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net8.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net8.0":{"DisplayName":"","Description":"Target net8.0"}},"Description":"The target framework for the project.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Whether or not to enable packaging (via (\"dotnet pack\") for the project.","Name":"EnablePack","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Whether or not to enable packaging (via (\"dotnet pack\") for the project.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"If specified, skips the automatic restore of the project on create.","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"If specified, skips the automatic restore of the project on create.","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.test.projecttemplates.8.0.1.1.0-rc.24059.1.nupkg","Author":"Microsoft","Classifications":["Test","NUnit","Playwright"],"DefaultName":"TestProject1","Description":"A project that contains Playwright tests using NUnit test framwork, that can run on .NET on Windows, Linux and MacOS.","Identity":"Microsoft.Test.Playwright.NUnit.CSharp.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Test.Playwright.NUnit","Precedence":10000,"Name":"NUnit Playwright Test Project","ShortNameList":["nunit-playwright"],"PreferDefaultName":false,"ConfigPlace":"/content/Playwright-NUnit-CSharp/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":null,"PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"Company.TestProject1","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"C#","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"C#":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":"Overrides the target framework","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"Overrides the target framework","DisplayName":"","AllowMultipleValues":false},{"Documentation":"The target framework for the project.","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net8.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net8.0":{"DisplayName":"","Description":"Target net8.0"}},"Description":"The target framework for the project.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Whether or not to enable packaging (via (\"dotnet pack\") for the project.","Name":"EnablePack","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Whether or not to enable packaging (via (\"dotnet pack\") for the project.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"If specified, skips the automatic restore of the project on create.","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"If specified, skips the automatic restore of the project on create.","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.test.projecttemplates.8.0.1.1.0-rc.24059.1.nupkg","Author":"Microsoft","Classifications":["Test","xUnit"],"DefaultName":"TestProject1","Description":"A project that contains xUnit.net tests that can run on .NET on Windows, Linux and macOS","Identity":"Microsoft.Test.xUnit.CSharp.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Test.xUnit","Precedence":10000,"Name":"xUnit Test Project","ShortNameList":["xunit"],"PreferDefaultName":false,"ConfigPlace":"/content/XUnit-CSharp/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":null,"PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"Company.TestProject1","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"F#","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"F#":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":"Overrides the target framework","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"Overrides the target framework","DisplayName":"","AllowMultipleValues":false},{"Documentation":"The target framework for the project.","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net8.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net8.0":{"DisplayName":"","Description":"Target net8.0"}},"Description":"The target framework for the project.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Whether or not to enable packaging (via (\"dotnet pack\") for the project.","Name":"EnablePack","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Whether or not to enable packaging (via (\"dotnet pack\") for the project.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"If specified, skips the automatic restore of the project on create.","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"If specified, skips the automatic restore of the project on create.","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.test.projecttemplates.8.0.1.1.0-rc.24059.1.nupkg","Author":"Microsoft","Classifications":["Test","xUnit"],"DefaultName":"TestProject1","Description":"A project that contains xUnit.net tests that can run on .NET on Windows, Linux and macOS","Identity":"Microsoft.Test.xUnit.FSharp.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Test.xUnit","Precedence":10000,"Name":"xUnit Test Project","ShortNameList":["xunit"],"PreferDefaultName":false,"ConfigPlace":"/content/XUnit-FSharp/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"F#","type":"project"},"HostData":null,"PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"Company.TestProject1","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"VB","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"VB":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":"Overrides the target framework","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"Overrides the target framework","DisplayName":"","AllowMultipleValues":false},{"Documentation":"The target framework for the project.","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net8.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net8.0":{"DisplayName":"","Description":"Target net8.0"}},"Description":"The target framework for the project.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Whether or not to enable packaging (via (\"dotnet pack\") for the project.","Name":"EnablePack","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Whether or not to enable packaging (via (\"dotnet pack\") for the project.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"If specified, skips the automatic restore of the project on create.","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"If specified, skips the automatic restore of the project on create.","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.test.projecttemplates.8.0.1.1.0-rc.24059.1.nupkg","Author":"Microsoft","Classifications":["Test","xUnit"],"DefaultName":"TestProject1","Description":"A project that contains xUnit.net tests that can run on .NET on Windows, Linux and macOS","Identity":"Microsoft.Test.xUnit.VisualBasic.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Test.xUnit","Precedence":10000,"Name":"xUnit Test Project","ShortNameList":["xunit"],"PreferDefaultName":false,"ConfigPlace":"/content/XUnit-VisualBasic/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"project"},"HostData":null,"PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"ValueController","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"所生成代码的命名空间","Name":"namespace","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"MyApp.Namespace","DataType":null,"DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"所生成代码的命名空间","DisplayName":"","AllowMultipleValues":false},{"Documentation":"使用读/写操作创建控制器","Name":"actions","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"使用读/写操作创建控制器","DisplayName":"添加读/写操作","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.web.itemtemplates.8.0.8.0.12.nupkg","Author":"Microsoft","Classifications":["Web","ASP.NET"],"DefaultName":"ValueController","Description":"具有或不具有读/写操作的 API 控制器","Identity":"Microsoft.AspNetCore.Mvc.ApiController.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.AspNetCore.Mvc.ApiController","Precedence":9800,"Name":"API 控制器","ShortNameList":["apicontroller"],"PreferDefaultName":false,"ConfigPlace":"/content/ApiController/.template.config/template.json","LocaleConfigPlace":"/content/ApiController/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":null,"PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"HomeController","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"所生成代码的命名空间","Name":"namespace","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"MyApp.Namespace","DataType":null,"DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"所生成代码的命名空间","DisplayName":"","AllowMultipleValues":false},{"Documentation":"使用读/写操作创建控制器","Name":"actions","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"使用读/写操作创建控制器","DisplayName":"添加读/写操作","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.web.itemtemplates.8.0.8.0.12.nupkg","Author":"Microsoft","Classifications":["Web","ASP.NET"],"DefaultName":"HomeController","Description":"具有或不具有读/写操作的 MVC 控制器","Identity":"Microsoft.AspNetCore.Mvc.MvcController.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.AspNetCore.Mvc.MvcController","Precedence":9800,"Name":"MVC 控制器","ShortNameList":["mvccontroller"],"PreferDefaultName":false,"ConfigPlace":"/content/MvcController/.template.config/template.json","LocaleConfigPlace":"/content/MvcController/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":null,"PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"protobuf","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"生成的代码的命名空间","Name":"namespace","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"MyApp.Namespace","DataType":null,"DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"生成的代码的命名空间","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.web.itemtemplates.8.0.8.0.12.nupkg","Author":"Microsoft","Classifications":["Web","gRPC"],"DefaultName":"protobuf","Description":"一个协议缓冲区文件,它用于描述 gRPC 的消息和服务。","Identity":"Microsoft.Web.Grpc.Protobuf.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Web.Grpc.Protobuf","Precedence":9800,"Name":"协议缓冲区文件","ShortNameList":["proto"],"PreferDefaultName":false,"ConfigPlace":"/content/Protobuf/.template.config/template.json","LocaleConfigPlace":"/content/Protobuf/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"","type":"item"},"HostData":null,"PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Component1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.web.itemtemplates.8.0.8.0.12.nupkg","Author":"Microsoft","Classifications":["Web","ASP.NET"],"DefaultName":"Component1","Description":"使用 Razor 实现的可重用 UI 组件","Identity":"Microsoft.AspNetCore.Components.RazorComponent.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.AspNetCore.Components.RazorComponent","Precedence":9800,"Name":"Razor 组件","ShortNameList":["razorcomponent"],"PreferDefaultName":false,"ConfigPlace":"/content/RazorComponent/.template.config/template.json","LocaleConfigPlace":"/content/RazorComponent/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":null,"PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Index","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"生成的代码的命名空间","Name":"namespace","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"MyApp.Namespace","DataType":null,"DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"生成的代码的命名空间","DisplayName":"","AllowMultipleValues":false},{"Documentation":"创建不带 PageModel 的页面","Name":"no-pagemodel","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"创建不带 PageModel 的页面","DisplayName":"排除 PageModel","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.web.itemtemplates.8.0.8.0.12.nupkg","Author":"Microsoft","Classifications":["Web","ASP.NET"],"DefaultName":"Index","Description":"带或不带页面模型的 Razor 页面","Identity":"Microsoft.AspNetCore.Mvc.RazorPage.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.AspNetCore.Mvc.RazorPage","Precedence":9800,"Name":"Razor 页面","ShortNameList":["page"],"PreferDefaultName":false,"ConfigPlace":"/content/RazorPage/.template.config/template.json","LocaleConfigPlace":"/content/RazorPage/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":null,"PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Index","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.web.itemtemplates.8.0.8.0.12.nupkg","Author":"Microsoft","Classifications":["Web","ASP.NET"],"DefaultName":"Index","Description":"空的 Razor 视图","Identity":"Microsoft.AspNetCore.Mvc.RazorView.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.AspNetCore.Mvc.RazorView","Precedence":9800,"Name":"Razor 视图","ShortNameList":["view"],"PreferDefaultName":false,"ConfigPlace":"/content/RazorView/.template.config/template.json","LocaleConfigPlace":"/content/RazorView/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":null,"PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"ignoreme","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"生成的代码的命名空间","Name":"namespace","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"MyApp.Namespace","DataType":null,"DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"生成的代码的命名空间","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.web.itemtemplates.8.0.8.0.12.nupkg","Author":"Microsoft","Classifications":["Web","ASP.NET"],"DefaultName":"_ViewImports","Description":"MVC 视图导入页","Identity":"Microsoft.AspNetCore.Mvc.ViewImports.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.AspNetCore.Mvc.ViewImports","Precedence":9800,"Name":"MVC ViewImports","ShortNameList":["viewimports"],"PreferDefaultName":false,"ConfigPlace":"/content/ViewImports/.template.config/template.json","LocaleConfigPlace":"/content/ViewImports/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":null,"PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"ignoreme","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.web.itemtemplates.8.0.8.0.12.nupkg","Author":"Microsoft","Classifications":["Web","ASP.NET"],"DefaultName":"_ViewStart","Description":"MVC ViewStart 页面","Identity":"Microsoft.AspNetCore.Mvc.ViewStart.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.AspNetCore.Mvc.ViewStart","Precedence":9800,"Name":"MVC ViewStart","ShortNameList":["viewstart"],"PreferDefaultName":false,"ConfigPlace":"/content/ViewStart/.template.config/template.json","LocaleConfigPlace":"/content/ViewStart/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":null,"PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.WebApplication1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"要使用的身份验证类型","Name":"auth","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"None","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"None":{"DisplayName":"","Description":"无身份验证"},"IndividualB2C":{"DisplayName":"","Description":"使用 Azure AD B2C 进行个人身份验证"},"SingleOrg":{"DisplayName":"","Description":"单个租户的组织身份验证"},"Windows":{"DisplayName":"","Description":"Windows 身份验证"}},"Description":"要使用的身份验证类型","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要连接到的 Azure Active Directory B2C 实例(与 IndividualB2C 身份验证一起使用)。","Name":"AAdB2CInstance","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"https://qualified.domain.name.b2clogin.com/","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要连接到的 Azure Active Directory B2C 实例(与 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"此项目的登录和注册策略 ID (与 IndividualB2C 身份验证一起使用)。","Name":"SignUpSignInPolicyId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"b2c_1_susi","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"此项目的登录和注册策略 ID (与 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要连接到的 Azure Active Directory 实例(与 SingleOrg 身份验证一起使用)。","Name":"AADInstance","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"https://login.microsoftonline.com/","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要连接到的 Azure Active Directory 实例(与 SingleOrg 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"此项目的客户端 ID (与 SingleOrg 或 IndividualB2C 身份验证一起使用)。","Name":"ClientId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"11111111-1111-1111-11111111111111111","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"此项目的客户端 ID (与 SingleOrg 或 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"目录租户的域(与 SingleOrg 或 IndividualB2C 身份验证一起使用)。","Name":"Domain","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"qualified.domain.name","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"目录租户的域(与 SingleOrg 或 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"客户端预配访问令牌需要请求的 API 范围。(与 IndividualB2C、SingleOrg 一起使用)。","Name":"DefaultScope","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"access_as_user","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"客户端预配访问令牌需要请求的 API 范围。(与 IndividualB2C、SingleOrg 一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要连接到的目录的 TenantId ID (与 SingleOrg 身份验证一起使用)。","Name":"TenantId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"22222222-2222-2222-2222-222222222222","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要连接到的目录的 TenantId ID (与 SingleOrg 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否允许此应用程序对目录进行读取访问(仅适用于 SingleOrg 身份验证)。","Name":"OrgReadAccess","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否允许此应用程序对目录进行读取访问(仅适用于 SingleOrg 身份验证)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"用于机密的 ID (与 OrgReadAccess 或个人身份验证一起使用)。","Name":"UserSecretsId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"aspnet-Company.WebApplication1-53bc9b9d-9d6a-45d4-8429-2a2761773502","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"用于机密的 ID (与 OrgReadAccess 或个人身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否在生成的模板中排除 launchSettings.json。","Name":"ExcludeLaunchSettings","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否在生成的模板中排除 launchSettings.json。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 HTTP 终结点的端口号。","Name":"kestrelHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 HTTP 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualB2C 或 OrganizationalAuth,则将忽略 no-https)。","Name":"kestrelHttpsPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualB2C 或 OrganizationalAuth,则将忽略 no-https)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。","Name":"iisHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualB2C 或 OrganizationalAuth,则将忽略 no-https)。","Name":"iisHttpsPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualB2C 或 OrganizationalAuth,则将忽略 no-https)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否禁用 HTTPS。仅当 IndividualB2C、SingleOrg 或 MultiOrg 不用于 --auth 时,此选项才适用。","Name":"NoHttps","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否禁用 HTTPS。仅当 IndividualB2C、SingleOrg 或 MultiOrg 不用于 --auth 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否使用 LocalDB 而不是 SQLite。仅当指定了 --auth Individual 或 --auth IndividualB2C 时,此选项才适用。","Name":"UseLocalDB","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否使用 LocalDB 而不是 SQLite。仅当指定了 --auth Individual 或 --auth IndividualB2C 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net8.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net8.0":{"DisplayName":"","Description":"目标 net8.0"}},"Description":"项目的目标框架。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要从 Web 应用调用的 API 的 URL。仅当指定了 --auth SingleOrg 或 --auth IndividualB2C 时,此选项才适用。","Name":"CalledApiUrl","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"https://graph.microsoft.com/v1.0","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要从 Web 应用调用的 API 的 URL。仅当指定了 --auth SingleOrg 或 --auth IndividualB2C 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"指定 Web 应用是否调用 Microsoft Graph。仅当指定了 --auth SingleOrg 时,此选项才适用。","Name":"CallsMicrosoftGraph","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"指定 Web 应用是否调用 Microsoft Graph。仅当指定了 --auth SingleOrg 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"请求从 Web 应用调用 API 的范围。仅当指定了 --auth SingleOrg 或 --auth IndividualB2C 时,此选项才适用。","Name":"CalledApiScopes","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"user.read","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"请求从 Web 应用调用 API 的范围。仅当指定了 --auth SingleOrg 或 --auth IndividualB2C 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"禁用 OpenAI (Swagger)支持","Name":"DisableOpenAPI","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"禁用 OpenAI (Swagger)支持","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否生成显式程序类和主方法,而不是顶级语句。","Name":"UseProgramMain","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否生成显式程序类和主方法,而不是顶级语句。","DisplayName":"不使用顶级语句(_T)","AllowMultipleValues":false},{"Documentation":"是否使用最小 API 而不是控制器。","Name":"UseMinimalAPIs","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否使用最小 API 而不是控制器。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否使用控制器而不是最小 API。此选项替代指定的值,即“最小”。","Name":"UseControllers","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否使用控制器而不是最小 API。此选项替代指定的值,即“最小”。","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.web.projecttemplates.8.0.8.0.12.nupkg","Author":"Microsoft","Classifications":["Web","Web API","API","Service"],"DefaultName":"WebApplication","Description":"用于使用 ASP.NET Core 控制器或最小 API 创建 RESTful Web API 的项目模板,可选择支持 OpenAPI 和身份验证。","Identity":"Microsoft.Web.WebApi.CSharp.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Web.WebApi","Precedence":9800,"Name":"ASP.NET Core Web API","ShortNameList":["webapi"],"PreferDefaultName":false,"ConfigPlace":"/content/WebApi-CSharp/.template.config/template.json","LocaleConfigPlace":"/content/WebApi-CSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/WebApi-CSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"order\":200,\"icon\":\"ide/WebAPI.png\",\"supportsDocker\":true,\"symbolInfo\":[{\"id\":\"DisableOpenAPI\",\"name\":{\"text\":\"Enable _OpenAPI support\",\"overrideDefaultText\":true},\"description\":{\"text\":\"Enables OpenAPI (Swagger) support\",\"overrideDefaultText\":true},\"invertBoolean\":true,\"isVisible\":true,\"defaultValue\":\"true\",\"persistenceScope\":\"templateGroup\"},{\"id\":\"UseProgramMain\",\"isVisible\":true,\"persistenceScope\":\"shared\",\"persistenceScopeName\":\"Microsoft\"},{\"id\":\"UseMinimalAPIs\",\"name\":{\"text\":\"Use controllers\",\"overrideDefaultText\":true},\"description\":{\"text\":\"Use controllers instead of minimal APIs.\",\"overrideDefaultText\":true},\"invertBoolean\":true,\"isVisible\":true,\"persistenceScope\":\"templateGroup\"}],\"disableHttpsSymbol\":\"NoHttps\"}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.WebApplication1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"F#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"F#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"是否从生成的模板中排除 launchSettings.json。","Name":"ExcludeLaunchSettings","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否从生成的模板中排除 launchSettings.json。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 HTTP 终结点的端口号。","Name":"kestrelHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 HTTP 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 HTTPS 终结点的端口号。","Name":"kestrelHttpsPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 HTTPS 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。","Name":"iisHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。","Name":"iisHttpsPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net8.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net8.0":{"DisplayName":"","Description":"目标 net8.0"}},"Description":"项目的目标框架。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否禁用 HTTPS。","Name":"NoHttps","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否禁用 HTTPS。","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.web.projecttemplates.8.0.8.0.12.nupkg","Author":"Microsoft","Classifications":["Web","Web API"],"DefaultName":"WebApplication","Description":"用于创建包含 RESTful HTTP 服务示例控制器的 ASP.NET Core 应用程序的项目模板。此模板还可以用于 ASP.NET Core MVC 视图和控制器。","Identity":"Microsoft.Web.WebApi.FSharp.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Web.WebApi","Precedence":9800,"Name":"ASP.NET Core Web API","ShortNameList":["webapi"],"PreferDefaultName":false,"ConfigPlace":"/content/WebApi-FSharp/.template.config/template.json","LocaleConfigPlace":"/content/WebApi-FSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/WebApi-FSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"F#","type":"project"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"order\":201,\"icon\":\"ide/WebAPI.png\",\"supportsDocker\":true,\"disableHttpsSymbol\":\"NoHttps\"}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.WebApplication1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"是否从生成的模板中排除 launchSettings.json。","Name":"ExcludeLaunchSettings","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否从生成的模板中排除 launchSettings.json。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 HTTP 终结点的端口号。","Name":"kestrelHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 HTTP 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。","Name":"iisHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net8.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net8.0":{"DisplayName":"","Description":"目标 net8.0"}},"Description":"项目的目标框架。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否生成显式程序类和主方法,而不是顶级语句。","Name":"UseProgramMain","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否生成显式程序类和主方法,而不是顶级语句。","DisplayName":"不使用顶级语句(_T)","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.web.projecttemplates.8.0.8.0.12.nupkg","Author":"Microsoft","Classifications":["Web","Web API","API","Service"],"DefaultName":"WebApplication","Description":"用于使用发布为 native AOT 的 ASP.NET Core 最小 API 的 RESTful Web API 的项目模板。","Identity":"Microsoft.Web.WebApiAot.CSharp.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Web.WebApiAot","Precedence":9000,"Name":"ASP.NET Core Web API (native AOT)","ShortNameList":["webapiaot"],"PreferDefaultName":false,"ConfigPlace":"/content/WebApiAot-CSharp/.template.config/template.json","LocaleConfigPlace":"/content/WebApiAot-CSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/WebApiAot-CSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"order\":100,\"icon\":\"ide/API.png\",\"supportsDocker\":true,\"symbolInfo\":[{\"id\":\"UseProgramMain\",\"isVisible\":true,\"persistenceScope\":\"shared\",\"persistenceScopeName\":\"Microsoft\"}]}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.Application1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"是否从生成的模板中排除 launchSettings.json。","Name":"ExcludeLaunchSettings","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否从生成的模板中排除 launchSettings.json。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net8.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net8.0":{"DisplayName":"","Description":"目标 net8.0"}},"Description":"项目的目标框架。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否生成显式程序类和主方法,而不是顶级语句。","Name":"UseProgramMain","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否生成显式程序类和主方法,而不是顶级语句。","DisplayName":"不使用顶级语句(_T)","AllowMultipleValues":false},{"Documentation":"是否启用将项目以 native AOT 发布。","Name":"NativeAot","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否启用将项目以 native AOT 发布。","DisplayName":"启用 native AOT 发布(_N)","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.web.projecttemplates.8.0.8.0.12.nupkg","Author":"Microsoft","Classifications":["Common","Worker","Web"],"DefaultName":"WorkerService","Description":"用于创建 worker service 的空项目模板。","Identity":"Microsoft.Worker.Empty.CSharp.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Worker.Empty","Precedence":9800,"Name":"辅助角色服务","ShortNameList":["worker"],"PreferDefaultName":false,"ConfigPlace":"/content/Worker-CSharp/.template.config/template.json","LocaleConfigPlace":"/content/Worker-CSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/Worker-CSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"order\":300,\"icon\":\"ide/Worker.png\",\"supportsDocker\":true,\"symbolInfo\":[{\"id\":\"UseProgramMain\",\"isVisible\":true,\"persistenceScope\":\"shared\",\"persistenceScopeName\":\"Microsoft\"},{\"id\":\"NativeAot\",\"isVisible\":true}]}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.Application1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"F#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"F#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"是否从生成的模板中排除 launchSettings.json。","Name":"ExcludeLaunchSettings","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否从生成的模板中排除 launchSettings.json。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net8.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net8.0":{"DisplayName":"","Description":"目标 net8.0"}},"Description":"项目的目标框架。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.web.projecttemplates.8.0.8.0.12.nupkg","Author":"Microsoft","Classifications":["Common","Worker","Web"],"DefaultName":"WorkerService","Description":"用于创建 worker service 的空项目模板。","Identity":"Microsoft.Worker.Empty.FSharp.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Worker.Empty","Precedence":9800,"Name":"辅助角色服务","ShortNameList":["worker"],"PreferDefaultName":false,"ConfigPlace":"/content/Worker-FSharp/.template.config/template.json","LocaleConfigPlace":"/content/Worker-FSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/Worker-FSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"F#","type":"project"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"order\":300,\"icon\":\"ide/Worker.png\",\"supportsDocker\":true}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025"],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"BlazorWeb-CSharp","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"C#","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"C#":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":"The target framework for the project.","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net8.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net8.0":{"DisplayName":"","Description":"Target net8.0"}},"Description":"The target framework for the project.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"The ID to use for secrets (use with Individual auth).","Name":"UserSecretsId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"aspnet-BlazorWeb-CSharp-53bc9b9d-9d6a-45d4-8429-2a2761773502","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The ID to use for secrets (use with Individual auth).","DisplayName":"","AllowMultipleValues":false},{"Documentation":"If specified, skips the automatic restore of the project on create.","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"If specified, skips the automatic restore of the project on create.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Whether to exclude launchSettings.json from the generated template.","Name":"ExcludeLaunchSettings","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Whether to exclude launchSettings.json from the generated template.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Port number to use for the HTTP endpoint in launchSettings.json.","Name":"kestrelHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"Port number to use for the HTTP endpoint in launchSettings.json.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if Individual auth is used).","Name":"kestrelHttpsPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if Individual auth is used).","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Port number to use for the IIS Express HTTP endpoint in launchSettings.json.","Name":"iisHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"Port number to use for the IIS Express HTTP endpoint in launchSettings.json.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if Individual auth is used).","Name":"iisHttpsPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if Individual auth is used).","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Chooses which interactive render mode to use for interactive components","Name":"InteractivityPlatform","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"Server","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"None":{"DisplayName":"None","Description":"No interactivity (static server rendering only)"},"Server":{"DisplayName":"Server","Description":"Runs on the server"},"WebAssembly":{"DisplayName":"WebAssembly","Description":"Runs in the browser using WebAssembly"},"Auto":{"DisplayName":"Auto (Server and WebAssembly)","Description":"Uses Server while downloading WebAssembly assets, then uses WebAssembly"}},"Description":"Chooses which interactive render mode to use for interactive components","DisplayName":"_Interactive render mode","AllowMultipleValues":false},{"Documentation":"Chooses which components will have interactive rendering enabled","Name":"InteractivityLocation","Priority":2,"Precedence":{"PrecedenceDefinition":4,"IsRequiredCondition":null,"IsEnabledCondition":"(InteractivityPlatform != \"None\")","IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"InteractivePerPage","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"InteractivePerPage":{"DisplayName":"Per page/component","Description":"Interactivity is applied on a per-page or per-component basis"},"InteractiveGlobal":{"DisplayName":"Global","Description":"Interactivity is applied at the root level"}},"Description":"Chooses which components will have interactive rendering enabled","DisplayName":"_Interactivity location","AllowMultipleValues":false},{"Documentation":"Configures whether to add sample pages and styling to demonstrate basic usage patterns.","Name":"IncludeSampleContent","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Configures whether to add sample pages and styling to demonstrate basic usage patterns.","DisplayName":"_Include sample pages","AllowMultipleValues":false},{"Documentation":"Configures whether to omit sample pages and styling that demonstrate basic usage patterns.","Name":"Empty","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Configures whether to omit sample pages and styling that demonstrate basic usage patterns.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"The type of authentication to use","Name":"auth","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"None","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"None":{"DisplayName":"","Description":"No authentication"},"Individual":{"DisplayName":"","Description":"Individual authentication"}},"Description":"The type of authentication to use","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual is specified.","Name":"UseLocalDB","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual is specified.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Configures whether to make every page interactive by applying an interactive render mode at the top level. If false, pages will use static server rendering by default, and can be marked interactive on a per-page or per-component basis.","Name":"AllInteractive","Priority":2,"Precedence":{"PrecedenceDefinition":4,"IsRequiredCondition":null,"IsEnabledCondition":"(InteractivityPlatform != \"None\")","IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Configures whether to make every page interactive by applying an interactive render mode at the top level. If false, pages will use static server rendering by default, and can be marked interactive on a per-page or per-component basis.","DisplayName":"_Enable interactive rendering globally throughout the site","AllowMultipleValues":false},{"Documentation":"Whether to turn off HTTPS. This option only applies if Individual isn't used for --auth.","Name":"NoHttps","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Whether to turn off HTTPS. This option only applies if Individual isn't used for --auth.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Whether to generate an explicit Program class and Main method instead of top-level statements.","Name":"UseProgramMain","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Whether to generate an explicit Program class and Main method instead of top-level statements.","DisplayName":"Do not use _top-level statements","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.web.projecttemplates.8.0.8.0.12.nupkg","Author":"Microsoft","Classifications":["Web","Blazor","WebAssembly"],"DefaultName":"BlazorApp","Description":"A project template for creating a Blazor web app that supports both server-side rendering and client interactivity. This template can be used for web apps with rich dynamic user interfaces (UIs).","Identity":"Microsoft.Web.Blazor.CSharp.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Web.Blazor","Precedence":9800,"Name":"Blazor Web App","ShortNameList":["blazor"],"PreferDefaultName":false,"ConfigPlace":"/content/BlazorWeb-CSharp/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/BlazorWeb-CSharp/.template.config/ide.host.json","ThirdPartyNotices":"https://aka.ms/aspnetcore/8.0-third-party-notices","BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"order\":610,\"icon\":\"icon.png\",\"disableHttpsSymbol\":\"NoHttps\",\"symbolInfo\":[{\"id\":\"InteractivityPlatform\",\"isVisible\":true,\"persistenceScope\":\"templateGroup\"},{\"id\":\"InteractivityLocation\",\"isVisible\":true,\"persistenceScope\":\"templateGroup\"},{\"id\":\"IncludeSampleContent\",\"isVisible\":true,\"persistenceScope\":\"shared\",\"persistenceScopeName\":\"Microsoft\"},{\"id\":\"UseProgramMain\",\"isVisible\":true,\"persistenceScope\":\"shared\",\"persistenceScopeName\":\"Microsoft\"}]}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"ComponentsWebAssembly-CSharp","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net8.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net8.0":{"DisplayName":"","Description":"目标 net8.0"}},"Description":"项目的目标框架。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要使用的身份验证类型","Name":"auth","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"None","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"None":{"DisplayName":"","Description":"无身份验证"},"Individual":{"DisplayName":"","Description":"个人身份验证"},"IndividualB2C":{"DisplayName":"","Description":"使用 Azure AD B2C 进行个人身份验证"},"SingleOrg":{"DisplayName":"","Description":"单个租户的组织身份验证"}},"Description":"要使用的身份验证类型","DisplayName":"","AllowMultipleValues":false},{"Documentation":"OIDC 提供程序的颁发机构(与独立个人身份验证一起使用)。","Name":"Authority","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"https://login.microsoftonline.com/","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"OIDC 提供程序的颁发机构(与独立个人身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要连接到的 Azure Active Directory B2C 实例(与 IndividualB2C 身份验证一起使用)。","Name":"AAdB2CInstance","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"https:////aadB2CInstance.b2clogin.com/","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要连接到的 Azure Active Directory B2C 实例(与 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"此项目的登录和注册策略 ID (与 IndividualB2C 身份验证一起使用)。","Name":"SignUpSignInPolicyId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"b2c_1_susi","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"此项目的登录和注册策略 ID (与 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要连接到的 Azure Active Directory 实例(与 SingleOrg 身份验证一起使用)。","Name":"AADInstance","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"https://login.microsoftonline.com/","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要连接到的 Azure Active Directory 实例(与 SingleOrg 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"此项目的客户端 ID (在独立方案中与 IndividualB2C、SingleOrg 或个人身份验证一起使用)。","Name":"ClientId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"33333333-3333-3333-33333333333333333","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"此项目的客户端 ID (在独立方案中与 IndividualB2C、SingleOrg 或个人身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"目录租户的域(与 SingleOrg 或 IndividualB2C 身份验证一起使用)。","Name":"Domain","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"qualified.domain.name","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"目录租户的域(与 SingleOrg 或 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要调用的服务器 API 的应用 ID URI (与 SingleOrg 或 IndividualB2C 身份验证一起使用)。","Name":"AppIDUri","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"api.id.uri","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要调用的服务器 API 的应用 ID URI (与 SingleOrg 或 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"服务器托管的 API 的客户端 ID (与 IndividualB2C、SingleOrg 一起使用)。","Name":"APIClientId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"11111111-1111-1111-11111111111111111","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"服务器托管的 API 的客户端 ID (与 IndividualB2C、SingleOrg 一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"客户端预配访问令牌需要请求的 API 范围。(与 IndividualB2C、SingleOrg 一起使用)。","Name":"DefaultScope","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"access_as_user","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"客户端预配访问令牌需要请求的 API 范围。(与 IndividualB2C、SingleOrg 一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要连接到的目录的 TenantId ID (与 SingleOrg 身份验证一起使用)。","Name":"TenantId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"22222222-2222-2222-2222-222222222222","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要连接到的目录的 TenantId ID (与 SingleOrg 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否允许此应用程序对目录进行读取访问(仅适用于 SingleOrg)。","Name":"OrgReadAccess","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否允许此应用程序对目录进行读取访问(仅适用于 SingleOrg)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"用于机密的 ID (与 OrgReadAccess 或个人身份验证一起使用)。","Name":"UserSecretsId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"aspnet-BlazorServerWeb-CSharp-53bc9b9d-9d6a-45d4-8429-2a2761773502","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"用于机密的 ID (与 OrgReadAccess 或个人身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否从生成的模板中排除 launchSettings.json。","Name":"ExcludeLaunchSettings","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否从生成的模板中排除 launchSettings.json。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 HTTP 终结点的端口号。","Name":"kestrelHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 HTTP 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。","Name":"kestrelHttpsPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。","Name":"iisHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。","Name":"iisHttpsPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"如果指定,则生成支持安装和脱机使用的渐进式 Web 应用程序(PWA)。","Name":"PWA","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则生成支持安装和脱机使用的渐进式 Web 应用程序(PWA)。","DisplayName":"渐进式 Web 应用程序(_P)","AllowMultipleValues":false},{"Documentation":"Configures whether to add sample pages and styling to demonstrate basic usage patterns.","Name":"IncludeSampleContent","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Configures whether to add sample pages and styling to demonstrate basic usage patterns.","DisplayName":"_Include sample pages","AllowMultipleValues":false},{"Documentation":"Configures whether to omit sample pages and styling that demonstrate basic usage patterns.","Name":"Empty","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Configures whether to omit sample pages and styling that demonstrate basic usage patterns.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否禁用 HTTPS。仅当 Individual、IndividualB2C、SingleOrg 或 MultiOrg 不用于 --auth 时,此选项才适用。","Name":"NoHttps","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否禁用 HTTPS。仅当 Individual、IndividualB2C、SingleOrg 或 MultiOrg 不用于 --auth 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否使用 LocalDB 而不是 SQLite。仅当指定了 --auth Individual 或 --auth IndividualB2C 时,此选项才适用。","Name":"UseLocalDB","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否使用 LocalDB 而不是 SQLite。仅当指定了 --auth Individual 或 --auth IndividualB2C 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要从 Web 应用调用的 API 的 URL。仅当指定了 --auth SingleOrg、--auth MultiOrg 或不带 ASP.NET Core 主机的 --auth IndividualB2C 时,此选项才适用。","Name":"CalledApiUrl","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"https://graph.microsoft.com/v1.0","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要从 Web 应用调用的 API 的 URL。仅当指定了 --auth SingleOrg、--auth MultiOrg 或不带 ASP.NET Core 主机的 --auth IndividualB2C 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"请求从 Web 应用调用 API 的范围。仅当指定了 --auth SingleOrg、--auth MultiOrg 或不带 ASP.NET Core 主机的 --auth IndividualB2C 时,此选项才适用。","Name":"CalledApiScopes","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"user.read","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"请求从 Web 应用调用 API 的范围。仅当指定了 --auth SingleOrg、--auth MultiOrg 或不带 ASP.NET Core 主机的 --auth IndividualB2C 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否生成显式程序类和主方法,而不是顶级语句。","Name":"UseProgramMain","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否生成显式程序类和主方法,而不是顶级语句。","DisplayName":"不使用顶级语句(_T)","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.web.projecttemplates.8.0.8.0.12.nupkg","Author":"Microsoft","Classifications":["Web","Blazor","WebAssembly","PWA"],"DefaultName":"BlazorApp","Description":"用于创建在 WebAssembly 上运行的 Blazor 应用的项目模板。此模板可用于具有丰富动态用户界面(UI)的 Web 应用。","Identity":"Microsoft.Web.Blazor.Wasm.CSharp.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Web.Blazor.Wasm","Precedence":9800,"Name":"Blazor WebAssembly 应用","ShortNameList":["blazorwasm"],"PreferDefaultName":false,"ConfigPlace":"/content/ComponentsWebAssembly-CSharp/.template.config/template.json","LocaleConfigPlace":"/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/ComponentsWebAssembly-CSharp/.template.config/ide.host.json","ThirdPartyNotices":"https://aka.ms/aspnetcore/8.0-third-party-notices","BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"order\":610,\"icon\":\"icon.png\",\"disableHttpsSymbol\":\"NoHttps\",\"symbolInfo\":[{\"id\":\"PWA\",\"isVisible\":true,\"persistenceScope\":\"templateGroup\"},{\"id\":\"UseProgramMain\",\"isVisible\":true,\"persistenceScope\":\"shared\",\"persistenceScopeName\":\"Microsoft\"},{\"id\":\"IncludeSampleContent\",\"isVisible\":true,\"persistenceScope\":\"shared\",\"persistenceScopeName\":\"Microsoft\"}]}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.WebApplication1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"是否从生成的模板中排除 launchSettings.json。","Name":"ExcludeLaunchSettings","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否从生成的模板中排除 launchSettings.json。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 HTTP 终结点的端口号。","Name":"kestrelHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 HTTP 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。","Name":"kestrelHttpsPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。","Name":"iisHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。","Name":"iisHttpsPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net8.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net8.0":{"DisplayName":"","Description":"目标 net8.0"}},"Description":"项目的目标框架。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否禁用 HTTPS。仅当 Individual、IndividualB2C、SingleOrg 或 MultiOrg 不用于 --auth 时,此选项才适用。","Name":"NoHttps","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否禁用 HTTPS。仅当 Individual、IndividualB2C、SingleOrg 或 MultiOrg 不用于 --auth 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否生成显式程序类和主方法,而不是顶级语句。","Name":"UseProgramMain","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否生成显式程序类和主方法,而不是顶级语句。","DisplayName":"不使用顶级语句(_T)","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.web.projecttemplates.8.0.8.0.12.nupkg","Author":"Microsoft","Classifications":["Web","Empty"],"DefaultName":"WebApplication","Description":"用于创建 ASP.NET Core 应用程序的空项目模板。此模板中没有任何内容。","Identity":"Microsoft.Web.Empty.CSharp.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Web.Empty","Precedence":9800,"Name":"ASP.NET Core 空","ShortNameList":["web"],"PreferDefaultName":false,"ConfigPlace":"/content/EmptyWeb-CSharp/.template.config/template.json","LocaleConfigPlace":"/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/EmptyWeb-CSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"order\":100,\"icon\":\"ide/Empty.png\",\"supportsDocker\":true,\"symbolInfo\":[{\"id\":\"UseProgramMain\",\"isVisible\":true,\"persistenceScope\":\"shared\",\"persistenceScopeName\":\"Microsoft\"}],\"disableHttpsSymbol\":\"NoHttps\"}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.WebApplication1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"F#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"F#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"是否从生成的模板中排除 launchSettings.json。","Name":"ExcludeLaunchSettings","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否从生成的模板中排除 launchSettings.json。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 HTTP 终结点的端口号。","Name":"kestrelHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 HTTP 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。","Name":"kestrelHttpsPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。","Name":"iisHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。","Name":"iisHttpsPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net8.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net8.0":{"DisplayName":"","Description":"目标 net8.0"}},"Description":"项目的目标框架。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否禁用 HTTPS。仅当 Individual、IndividualB2C、SingleOrg 或 MultiOrg 不用于 --auth 时,此选项才适用。","Name":"NoHttps","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否禁用 HTTPS。仅当 Individual、IndividualB2C、SingleOrg 或 MultiOrg 不用于 --auth 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.web.projecttemplates.8.0.8.0.12.nupkg","Author":"Microsoft","Classifications":["Web","Empty"],"DefaultName":"WebApplication","Description":"用于创建 ASP.NET Core 应用程序的空项目模板。此模板中没有任何内容。","Identity":"Microsoft.Web.Empty.FSharp.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Web.Empty","Precedence":9800,"Name":"ASP.NET Core 空","ShortNameList":["web"],"PreferDefaultName":false,"ConfigPlace":"/content/EmptyWeb-FSharp/.template.config/template.json","LocaleConfigPlace":"/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/EmptyWeb-FSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"F#","type":"project"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"order\":101,\"icon\":\"ide/Empty.png\",\"supportsDocker\":true,\"disableHttpsSymbol\":\"NoHttps\"}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"GrpcService-CSharp","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net8.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net8.0":{"DisplayName":"","Description":"目标 net8.0"}},"Description":"项目的目标框架。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否从生成的模板中排除 launchSettings.json。","Name":"ExcludeLaunchSettings","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否从生成的模板中排除 launchSettings.json。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 HTTP 终结点的端口号。","Name":"kestrelHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 HTTP 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。","Name":"kestrelHttpsPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否生成显式程序类和主方法,而不是顶级语句。","Name":"UseProgramMain","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否生成显式程序类和主方法,而不是顶级语句。","DisplayName":"不使用顶级语句(_T)","AllowMultipleValues":false},{"Documentation":"是否启用将项目以 native AOT 发布。","Name":"NativeAot","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否启用将项目以 native AOT 发布。","DisplayName":"启用 native AOT 发布(_N)","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.web.projecttemplates.8.0.8.0.12.nupkg","Author":"Microsoft","Classifications":["Web","gRPC","API","Service"],"DefaultName":"GrpcService","Description":"用于使用 ASP.NET Core 创建 gRPC 服务的项目模板,可选择支持发布为 native AOT。","Identity":"Microsoft.Grpc.Service.CSharp.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Web.Grpc","Precedence":9800,"Name":"ASP.NET Core gRPC 服务","ShortNameList":["grpc"],"PreferDefaultName":false,"ConfigPlace":"/content/GrpcService-CSharp/.template.config/template.json","LocaleConfigPlace":"/content/GrpcService-CSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/GrpcService-CSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"order\":500,\"icon\":\"ide/gRPC.png\",\"supportsDocker\":true,\"symbolInfo\":[{\"id\":\"UseProgramMain\",\"isVisible\":true,\"persistenceScope\":\"shared\",\"persistenceScopeName\":\"Microsoft\"},{\"id\":\"NativeAot\",\"isVisible\":true}]}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.RazorClassLibrary1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net8.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net8.0":{"DisplayName":"","Description":"目标 net8.0"}},"Description":"项目的目标框架。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否支持将传统的 Razor Pages 和视图添加到此库。","Name":"SupportPagesAndViews","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否支持将传统的 Razor Pages 和视图添加到此库。","DisplayName":"支持页面和视图","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.web.projecttemplates.8.0.8.0.12.nupkg","Author":"Microsoft","Classifications":["Web","Razor","Library"],"DefaultName":"RazorClassLibrary","Description":"用于创建目标为 .NET 的 Razor 类库的项目","Identity":"Microsoft.Web.Razor.Library.CSharp.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Web.Razor","Precedence":9800,"Name":"Razor 类库","ShortNameList":["razorclasslib"],"PreferDefaultName":false,"ConfigPlace":"/content/RazorClassLibrary-CSharp/.template.config/template.json","LocaleConfigPlace":"/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/RazorClassLibrary-CSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"order\":700,\"icon\":\"ide/RazorClassLibrary.ico\",\"symbolInfo\":[{\"id\":\"SupportPagesAndViews\",\"isVisible\":true,\"persistenceScope\":\"templateGroup\"}]}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.WebApplication1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"要使用的身份验证类型","Name":"auth","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"None","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"None":{"DisplayName":"","Description":"无身份验证"},"Individual":{"DisplayName":"","Description":"个人身份验证"},"IndividualB2C":{"DisplayName":"","Description":"使用 Azure AD B2C 进行个人身份验证"},"SingleOrg":{"DisplayName":"","Description":"单个租户的组织身份验证"},"MultiOrg":{"DisplayName":"","Description":"多个租户的组织身份验证"},"Windows":{"DisplayName":"","Description":"Windows 身份验证"}},"Description":"要使用的身份验证类型","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要连接到的 Azure Active Directory B2C 实例(与 IndividualB2C 身份验证一起使用)。","Name":"AAdB2CInstance","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"https://login.microsoftonline.com/tfp/","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要连接到的 Azure Active Directory B2C 实例(与 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"此项目的登录和注册策略 ID (与 IndividualB2C 身份验证一起使用)。","Name":"SignUpSignInPolicyId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"b2c_1_susi","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"此项目的登录和注册策略 ID (与 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"全局注销回调(与 IndividualB2C 身份验证一起使用)。","Name":"SignedOutCallbackPath","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"/signout/B2C_1_susi","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"全局注销回调(与 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"此项目的重置密码策略 ID (与 IndividualB2C 身份验证一起使用)。","Name":"ResetPasswordPolicyId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"b2c_1_reset","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"此项目的重置密码策略 ID (与 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"此项目的编辑配置文件策略 ID (与 IndividualB2C 身份验证一起使用)。","Name":"EditProfilePolicyId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"b2c_1_edit_profile","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"此项目的编辑配置文件策略 ID (与 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要连接到的 Azure Active Directory 实例(与 SingleOrg 或 MultiOrg 身份验证一起使用)。","Name":"AADInstance","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"https://login.microsoftonline.com/","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要连接到的 Azure Active Directory 实例(与 SingleOrg 或 MultiOrg 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"此项目的客户端 ID (与 IndividualB2C、SingleOrg 或 MultiOrg 身份验证一起使用)。","Name":"ClientId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"11111111-1111-1111-11111111111111111","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"此项目的客户端 ID (与 IndividualB2C、SingleOrg 或 MultiOrg 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"目录租户的域(与 SingleOrg 或 IndividualB2C 身份验证一起使用)。","Name":"Domain","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"qualified.domain.name","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"目录租户的域(与 SingleOrg 或 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要连接到的目录的 TenantId ID (与 SingleOrg 身份验证一起使用)。","Name":"TenantId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"22222222-2222-2222-2222-222222222222","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要连接到的目录的 TenantId ID (与 SingleOrg 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"重定向 URI 的应用程序基路径内的请求路径(与 SingleOrg 或 IndividualB2C 身份验证一起使用)。","Name":"CallbackPath","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"/signin-oidc","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"重定向 URI 的应用程序基路径内的请求路径(与 SingleOrg 或 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否允许此应用程序对目录进行读取访问(仅适用于 SingleOrg 或 MultiOrg 身份验证)。","Name":"OrgReadAccess","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否允许此应用程序对目录进行读取访问(仅适用于 SingleOrg 或 MultiOrg 身份验证)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"用于机密的 ID (与 OrgReadAccess 或个人身份验证一起使用)。","Name":"UserSecretsId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"aspnet-Company.WebApplication1-53bc9b9d-9d6a-45d4-8429-2a2761773502","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"用于机密的 ID (与 OrgReadAccess 或个人身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否在生成的模板中排除 launchSettings.json。","Name":"ExcludeLaunchSettings","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否在生成的模板中排除 launchSettings.json。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 HTTP 终结点的端口号。","Name":"kestrelHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 HTTP 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualB2C 或 OrganizationalAuth,则将忽略 no-https)。","Name":"kestrelHttpsPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualB2C 或 OrganizationalAuth,则将忽略 no-https)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。","Name":"iisHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualB2C 或 OrganizationalAuth,则将忽略 no-https)。","Name":"iisHttpsPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualB2C 或 OrganizationalAuth,则将忽略 no-https)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否禁用 HTTPS。仅当 IndividualB2C、SingleOrg 或 MultiOrg 不用于 --auth 时,此选项才适用。","Name":"NoHttps","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否禁用 HTTPS。仅当 IndividualB2C、SingleOrg 或 MultiOrg 不用于 --auth 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否使用 LocalDB 而不是 SQLite。仅当指定了 --auth Individual 或 --auth IndividualB2C 时,此选项才适用。","Name":"UseLocalDB","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否使用 LocalDB 而不是 SQLite。仅当指定了 --auth Individual 或 --auth IndividualB2C 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net8.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net8.0":{"DisplayName":"","Description":"目标 net8.0"}},"Description":"项目的目标框架。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要从 Web 应用调用的 API 的 URL。仅当指定了 --auth SingleOrg、--auth MultiOrg 或 --auth IndividualB2C 时,此选项才适用。","Name":"CalledApiUrl","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"https://graph.microsoft.com/v1.0","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要从 Web 应用调用的 API 的 URL。仅当指定了 --auth SingleOrg、--auth MultiOrg 或 --auth IndividualB2C 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"指定 Web 应用是否调用 Microsoft Graph。仅当指定了 --auth SingleOrg 或 --auth MultiOrg 时,此选项才适用。","Name":"CallsMicrosoftGraph","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"指定 Web 应用是否调用 Microsoft Graph。仅当指定了 --auth SingleOrg 或 --auth MultiOrg 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"请求从 Web 应用调用 API 的范围。仅当指定了 --auth SingleOrg、--auth MultiOrg 或 --auth IndividualB2C 时,此选项才适用。","Name":"CalledApiScopes","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"user.read","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"请求从 Web 应用调用 API 的范围。仅当指定了 --auth SingleOrg、--auth MultiOrg 或 --auth IndividualB2C 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否生成显式程序类和主方法,而不是顶级语句。","Name":"UseProgramMain","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否生成显式程序类和主方法,而不是顶级语句。","DisplayName":"不使用顶级语句(_T)","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.web.projecttemplates.8.0.8.0.12.nupkg","Author":"Microsoft","Classifications":["Web","MVC","Razor Pages"],"DefaultName":"WebApplication","Description":"用于创建包含示例 ASP.NET Core Razor Pages 内容的 ASP.NET Core 应用程序的项目模板","Identity":"Microsoft.Web.RazorPages.CSharp.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Web.RazorPages","Precedence":9800,"Name":"ASP.NET Core Web 应用","ShortNameList":["webapp","razor"],"PreferDefaultName":false,"ConfigPlace":"/content/RazorPagesWeb-CSharp/.template.config/template.json","LocaleConfigPlace":"/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/RazorPagesWeb-CSharp/.template.config/ide.host.json","ThirdPartyNotices":"https://aka.ms/aspnetcore/8.0-third-party-notices","BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"order\":400,\"icon\":\"ide/WebApplication.png\",\"supportsDocker\":true,\"symbolInfo\":[{\"id\":\"UseProgramMain\",\"isVisible\":true,\"persistenceScope\":\"shared\",\"persistenceScopeName\":\"Microsoft\"}],\"disableHttpsSymbol\":\"NoHttps\"}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.WebApplication1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"要使用的身份验证类型","Name":"auth","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"None","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"None":{"DisplayName":"","Description":"无身份验证"},"Individual":{"DisplayName":"","Description":"个人身份验证"},"IndividualB2C":{"DisplayName":"","Description":"使用 Azure AD B2C 进行个人身份验证"},"SingleOrg":{"DisplayName":"","Description":"单个租户的组织身份验证"},"MultiOrg":{"DisplayName":"","Description":"多个租户的组织身份验证"},"Windows":{"DisplayName":"","Description":"Windows 身份验证"}},"Description":"要使用的身份验证类型","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要连接到的 Azure Active Directory B2C 实例(与 IndividualB2C 身份验证一起使用)。","Name":"AAdB2CInstance","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"https://login.microsoftonline.com/tfp/","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要连接到的 Azure Active Directory B2C 实例(与 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"此项目的登录和注册策略 ID (与 IndividualB2C 身份验证一起使用)。","Name":"SignUpSignInPolicyId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"b2c_1_susi","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"此项目的登录和注册策略 ID (与 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"全局注销回调(与 IndividualB2C 身份验证一起使用)。","Name":"SignedOutCallbackPath","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"/signout/B2C_1_susi","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"全局注销回调(与 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"此项目的重置密码策略 ID (与 IndividualB2C 身份验证一起使用)。","Name":"ResetPasswordPolicyId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"b2c_1_reset","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"此项目的重置密码策略 ID (与 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"此项目的编辑配置文件策略 ID (与 IndividualB2C 身份验证一起使用)。","Name":"EditProfilePolicyId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"b2c_1_edit_profile","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"此项目的编辑配置文件策略 ID (与 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要连接到的 Azure Active Directory 实例(与 SingleOrg 或 MultiOrg 身份验证一起使用)。","Name":"AADInstance","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"https://login.microsoftonline.com/","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要连接到的 Azure Active Directory 实例(与 SingleOrg 或 MultiOrg 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"此项目的客户端 ID (与 IndividualB2C、SingleOrg 或 MultiOrg 身份验证一起使用)。","Name":"ClientId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"11111111-1111-1111-11111111111111111","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"此项目的客户端 ID (与 IndividualB2C、SingleOrg 或 MultiOrg 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"目录租户的域(与 SingleOrg 或 IndividualB2C 身份验证一起使用)。","Name":"Domain","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"qualified.domain.name","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"目录租户的域(与 SingleOrg 或 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要连接到的目录的 TenantId ID (与 SingleOrg 身份验证一起使用)。","Name":"TenantId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"22222222-2222-2222-2222-222222222222","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要连接到的目录的 TenantId ID (与 SingleOrg 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"重定向 URI 的应用程序基路径内的请求路径(与 SingleOrg 或 IndividualB2C 身份验证一起使用)。","Name":"CallbackPath","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"/signin-oidc","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"重定向 URI 的应用程序基路径内的请求路径(与 SingleOrg 或 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否允许此应用程序对目录进行读取访问(仅适用于 SingleOrg 或 MultiOrg 身份验证)。","Name":"OrgReadAccess","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否允许此应用程序对目录进行读取访问(仅适用于 SingleOrg 或 MultiOrg 身份验证)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"用于机密的 ID (与 OrgReadAccess 或个人身份验证一起使用)。","Name":"UserSecretsId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"aspnet-Company.WebApplication1-53bc9b9d-9d6a-45d4-8429-2a2761773502","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"用于机密的 ID (与 OrgReadAccess 或个人身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否从生成的模板中排除 launchSettings.json。","Name":"ExcludeLaunchSettings","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否从生成的模板中排除 launchSettings.json。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 HTTP 终结点的端口号。","Name":"kestrelHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 HTTP 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualB2C 或 OrganizationalAuth,则将忽略 no-https)。","Name":"kestrelHttpsPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualB2C 或 OrganizationalAuth,则将忽略 no-https)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。","Name":"iisHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualB2C 或 OrganizationalAuth,则将忽略 no-https)。","Name":"iisHttpsPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualB2C 或 OrganizationalAuth,则将忽略 no-https)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否禁用 HTTPS。仅当 IndividualB2C、SingleOrg 或 MultiOrg 不用于 --auth 时,此选项才适用。","Name":"NoHttps","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否禁用 HTTPS。仅当 IndividualB2C、SingleOrg 或 MultiOrg 不用于 --auth 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否使用 LocalDB 而不是 SQLite。仅当指定了 --auth Individual 或 --auth IndividualB2C 时,此选项才适用。","Name":"UseLocalDB","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否使用 LocalDB 而不是 SQLite。仅当指定了 --auth Individual 或 --auth IndividualB2C 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net8.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net8.0":{"DisplayName":"","Description":"目标 net8.0"}},"Description":"项目的目标框架。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要从 Web 应用调用的 API 的 URL。仅当指定了 --auth SingleOrg、--auth MultiOrg 或 --auth IndividualB2C 时,此选项才适用。","Name":"CalledApiUrl","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"https://graph.microsoft.com/v1.0","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要从 Web 应用调用的 API 的 URL。仅当指定了 --auth SingleOrg、--auth MultiOrg 或 --auth IndividualB2C 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"指定 Web 应用是否调用 Microsoft Graph。仅当指定了 --auth SingleOrg 或 --auth MultiOrg 时,此选项才适用。","Name":"CallsMicrosoftGraph","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"指定 Web 应用是否调用 Microsoft Graph。仅当指定了 --auth SingleOrg 或 --auth MultiOrg 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"请求从 Web 应用调用 API 的范围。仅当指定了 --auth SingleOrg、--auth MultiOrg 或 --auth IndividualB2C 时,此选项才适用。","Name":"CalledApiScopes","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"user.read","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"请求从 Web 应用调用 API 的范围。仅当指定了 --auth SingleOrg、--auth MultiOrg 或 --auth IndividualB2C 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否生成显式程序类和主方法,而不是顶级语句。","Name":"UseProgramMain","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否生成显式程序类和主方法,而不是顶级语句。","DisplayName":"不使用顶级语句(_T)","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.web.projecttemplates.8.0.8.0.12.nupkg","Author":"Microsoft","Classifications":["Web","MVC"],"DefaultName":"WebApplication","Description":"用于创建包含示例 ASP.NET Core MVC 视图和控制器的 ASP.NET Core 应用程序的项目模板。此模板还可以用于 RESTful HTTP 服务。","Identity":"Microsoft.Web.Mvc.CSharp.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Web.Mvc","Precedence":9800,"Name":"ASP.NET Core Web 应用(模型-视图-控制器)","ShortNameList":["mvc"],"PreferDefaultName":false,"ConfigPlace":"/content/StarterWeb-CSharp/.template.config/template.json","LocaleConfigPlace":"/content/StarterWeb-CSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/StarterWeb-CSharp/.template.config/ide.host.json","ThirdPartyNotices":"https://aka.ms/aspnetcore/8.0-third-party-notices","BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"order\":410,\"icon\":\"ide/WebApplication.png\",\"supportsDocker\":true,\"symbolInfo\":[{\"id\":\"UseProgramMain\",\"isVisible\":true,\"persistenceScope\":\"shared\",\"persistenceScopeName\":\"Microsoft\"}],\"disableHttpsSymbol\":\"NoHttps\"}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.WebApplication1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"F#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"F#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"是否从生成的模板中排除 launchSettings.json。","Name":"ExcludeLaunchSettings","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否从生成的模板中排除 launchSettings.json。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 HTTP 终结点的端口号。","Name":"kestrelHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 HTTP 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。","Name":"kestrelHttpsPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。","Name":"iisHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。","Name":"iisHttpsPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net8.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net8.0":{"DisplayName":"","Description":"目标 net8.0"}},"Description":"项目的目标框架。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否禁用 HTTPS。仅当 Individual、IndividualB2C、SingleOrg 或 MultiOrg 不用于 --auth 时,此选项才适用。","Name":"NoHttps","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否禁用 HTTPS。仅当 Individual、IndividualB2C、SingleOrg 或 MultiOrg 不用于 --auth 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.web.projecttemplates.8.0.8.0.12.nupkg","Author":"Microsoft","Classifications":["Web","MVC"],"DefaultName":"WebApplication","Description":"用于创建包含示例 ASP.NET Core MVC 视图和控制器的 ASP.NET Core 应用程序的项目模板。此模板还可以用于 RESTful HTTP 服务。","Identity":"Microsoft.Web.Mvc.FSharp.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Web.Mvc","Precedence":9800,"Name":"ASP.NET Core Web 应用(模型-视图-控制器)","ShortNameList":["mvc"],"PreferDefaultName":false,"ConfigPlace":"/content/StarterWeb-FSharp/.template.config/template.json","LocaleConfigPlace":"/content/StarterWeb-FSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":"https://aka.ms/aspnetcore/8.0-third-party-notices","BaselineInfo":{},"TagsCollection":{"language":"F#","type":"project"},"HostData":null,"PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.WinFormsApplication1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"替代目标框架","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代目标框架","DisplayName":"目标框架替代","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net6.0":{"DisplayName":".NET 6.0","Description":"目标 net6.0"},"net7.0":{"DisplayName":".NET 7.0","Description":"目标 net7.0"},"net8.0":{"DisplayName":".NET 8.0","Description":"目标 net8.0"},"net9.0":{"DisplayName":".NET 9.0","Description":"目标 net9.0"}},"Description":"项目的目标框架。","DisplayName":"框架","AllowMultipleValues":false},{"Documentation":"在创建的项目文件中设置 langVersion","Name":"langVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"在创建的项目文件中设置 langVersion","DisplayName":"语言版本","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"跳过还原","AllowMultipleValues":false},{"Documentation":"是否为此项目启用可为 null 的引用类型。","Name":"Nullable","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否为此项目启用可为 null 的引用类型。","DisplayName":"启用可为 null","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.winforms.projecttemplates.9.0.1-servicing.24610.6.nupkg","Author":"Microsoft","Classifications":["Common","WinForms"],"DefaultName":"WinFormsApp1","Description":"用于创建 .NET Windows 窗体(WinForms)应用的项目模板。","Identity":"Microsoft.Common.WinForms.CSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.WinForms","Precedence":9000,"Name":"Windows 窗体应用","ShortNameList":["winforms"],"PreferDefaultName":false,"ConfigPlace":"/WinFormsApplication-CSharp/.template.config/template.json","LocaleConfigPlace":"/WinFormsApplication-CSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":null,"PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.WinFormsApplication1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"VB":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"VB","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"替代目标框架","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代目标框架","DisplayName":"目标框架替代","AllowMultipleValues":false},{"Documentation":"应用程序应使用 Visual Basic 应用程序框架","Name":"UseAppFramework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"应用程序应使用 Visual Basic 应用程序框架","DisplayName":"","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net6.0":{"DisplayName":".NET 6.0","Description":"目标 net6.0"},"net7.0":{"DisplayName":".NET 7.0","Description":"目标 net7.0"},"net8.0":{"DisplayName":".NET 8.0","Description":"目标 net8.0"},"net9.0":{"DisplayName":".NET 9.0","Description":"目标 net9.0"}},"Description":"项目的目标框架。","DisplayName":".NET 9.0","AllowMultipleValues":false},{"Documentation":"在创建的项目文件中设置 langVersion","Name":"langVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"在创建的项目文件中设置 langVersion","DisplayName":"语言版本","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"跳过还原","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.winforms.projecttemplates.9.0.1-servicing.24610.6.nupkg","Author":"Microsoft","Classifications":["Common","WinForms"],"DefaultName":"WinFormsApp1","Description":"用于创建 .NET Windows 窗体(WinForms)应用的项目模板。","Identity":"Microsoft.Common.WinForms.VisualBasic.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.WinForms","Precedence":9000,"Name":"Windows 窗体应用","ShortNameList":["winforms"],"PreferDefaultName":false,"ConfigPlace":"/WinFormsApplication-VisualBasic/.template.config/template.json","LocaleConfigPlace":"/WinFormsApplication-VisualBasic/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"project"},"HostData":null,"PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.ControlLibrary1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"替代目标框架","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代目标框架","DisplayName":"目标框架替代","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net6.0":{"DisplayName":".NET 6.0","Description":"目标 net6.0"},"net7.0":{"DisplayName":".NET 7.0","Description":"目标 net7.0"},"net8.0":{"DisplayName":".NET 8.0","Description":"目标 net8.0"},"net9.0":{"DisplayName":".NET 9.0","Description":"目标 net9.0"}},"Description":"项目的目标框架。","DisplayName":".NET 9.0","AllowMultipleValues":false},{"Documentation":"在创建的项目文件中设置 langVersion","Name":"langVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"在创建的项目文件中设置 langVersion","DisplayName":"语言版本","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"跳过还原","AllowMultipleValues":false},{"Documentation":"是否为此项目启用可为 null 的引用类型。","Name":"Nullable","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否为此项目启用可为 null 的引用类型。","DisplayName":"启用可为 null","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.winforms.projecttemplates.9.0.1-servicing.24610.6.nupkg","Author":"Microsoft","Classifications":["Common","WinForms"],"DefaultName":"WinFormsControlLibrary1","Description":"用于创建面向 .NET Windows 窗体(WinForms)的控件库的项目模板。","Identity":"Microsoft.Common.WinForms.ControlLibrary.CSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.WinForms.ControlLibrary","Precedence":9000,"Name":"Windows 窗体控件库","ShortNameList":["winformscontrollib"],"PreferDefaultName":false,"ConfigPlace":"/WinFormsControlLibrary-CSharp/.template.config/template.json","LocaleConfigPlace":"/WinFormsControlLibrary-CSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":null,"PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.ControlLibrary1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"VB":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"VB","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"替代目标框架","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代目标框架","DisplayName":"目标框架替代","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net6.0":{"DisplayName":".NET 6.0","Description":"目标 net6.0"},"net7.0":{"DisplayName":".NET 7.0","Description":"目标 net7.0"},"net8.0":{"DisplayName":".NET 8.0","Description":"目标 net8.0"},"net9.0":{"DisplayName":".NET 9.0","Description":"目标 net9.0"}},"Description":"项目的目标框架。","DisplayName":".NET 9.0","AllowMultipleValues":false},{"Documentation":"在创建的项目文件中设置 langVersion","Name":"langVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"在创建的项目文件中设置 langVersion","DisplayName":"语言版本","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"跳过还原","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.winforms.projecttemplates.9.0.1-servicing.24610.6.nupkg","Author":"Microsoft","Classifications":["Common","WinForms"],"DefaultName":"WinFormsControlLibrary1","Description":"用于创建面向 .NET Windows 窗体(WinForms)的控件库的项目模板。","Identity":"Microsoft.Common.WinForms.ControlLibrary.VisualBasic.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.WinForms.ControlLibrary","Precedence":9000,"Name":"Windows 窗体控件库","ShortNameList":["winformscontrollib"],"PreferDefaultName":false,"ConfigPlace":"/WinFormsControlLibrary-VisualBasic/.template.config/template.json","LocaleConfigPlace":"/WinFormsControlLibrary-VisualBasic/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"project"},"HostData":null,"PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.ClassLibrary1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"替代目标框架","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代目标框架","DisplayName":"目标框架替代","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net6.0":{"DisplayName":".NET 6.0","Description":"目标 net6.0"},"net7.0":{"DisplayName":".NET 7.0","Description":"目标 net7.0"},"net8.0":{"DisplayName":".NET 8.0","Description":"目标 net8.0"},"net9.0":{"DisplayName":".NET 9.0","Description":"目标 net9.0"}},"Description":"项目的目标框架。","DisplayName":".NET 9.0","AllowMultipleValues":false},{"Documentation":"在创建的项目文件中设置 langVersion","Name":"langVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"在创建的项目文件中设置 langVersion","DisplayName":"语言版本","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"跳过还原","AllowMultipleValues":false},{"Documentation":"是否为此项目启用可为 null 的引用类型。","Name":"Nullable","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否为此项目启用可为 null 的引用类型。","DisplayName":"启用可为 null","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.winforms.projecttemplates.9.0.1-servicing.24610.6.nupkg","Author":"Microsoft","Classifications":["Common","WinForms"],"DefaultName":"WinFormsLibrary1","Description":"用于创建面向 .NET Windows 窗体(WinForms)的类库的项目模板。","Identity":"Microsoft.Common.WinForms.Library.CSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.WinForms.Library","Precedence":9000,"Name":"Windows 窗体类库","ShortNameList":["winformslib"],"PreferDefaultName":false,"ConfigPlace":"/WinFormsLibrary-CSharp/.template.config/template.json","LocaleConfigPlace":"/WinFormsLibrary-CSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":null,"PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.ClassLibrary1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"VB":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"VB","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"替代目标框架","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代目标框架","DisplayName":"目标框架替代","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net6.0":{"DisplayName":".NET 6.0","Description":"目标 net6.0"},"net7.0":{"DisplayName":".NET 7.0","Description":"目标 net7.0"},"net8.0":{"DisplayName":".NET 8.0","Description":"目标 net8.0"},"net9.0":{"DisplayName":".NET 9.0","Description":"目标 net9.0"}},"Description":"项目的目标框架。","DisplayName":".NET 9.0","AllowMultipleValues":false},{"Documentation":"在创建的项目文件中设置 langVersion","Name":"langVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"在创建的项目文件中设置 langVersion","DisplayName":"语言版本","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"跳过还原","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.winforms.projecttemplates.9.0.1-servicing.24610.6.nupkg","Author":"Microsoft","Classifications":["Common","WinForms"],"DefaultName":"WinFormsLibrary1","Description":"用于创建面向 .NET Windows 窗体(WinForms)的类库的项目模板。","Identity":"Microsoft.Common.WinForms.Library.VisualBasic.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.WinForms.Library","Precedence":9000,"Name":"Windows 窗体类库","ShortNameList":["winformslib"],"PreferDefaultName":false,"ConfigPlace":"/WinFormsLibrary-VisualBasic/.template.config/template.json","LocaleConfigPlace":"/WinFormsLibrary-VisualBasic/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"project"},"HostData":null,"PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.WpfApplication1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"替代目标框架","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代目标框架","DisplayName":"目标框架替代","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"netcoreapp3.0":{"DisplayName":".NET Core 3.0","Description":"目标 netcoreapp3.0"},"netcoreapp3.1":{"DisplayName":".NET Core 3.1","Description":"目标 netcoreapp3.1"},"net5.0":{"DisplayName":".NET 5.0","Description":"目标 net5.0"},"net6.0":{"DisplayName":".NET 6.0","Description":"目标 net6.0"},"net7.0":{"DisplayName":".NET 7.0","Description":"目标 net7.0"},"net8.0":{"DisplayName":".NET 8.0","Description":"目标 net8.0"},"net9.0":{"DisplayName":".NET 9.0","Description":"目标 net9.0"}},"Description":"项目的目标框架。","DisplayName":"框架","AllowMultipleValues":false},{"Documentation":"在创建的项目文件中设置 langVersion","Name":"langVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"在创建的项目文件中设置 langVersion","DisplayName":"语言版本","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"跳过还原","AllowMultipleValues":false},{"Documentation":"是否为此项目启用可为 null 的引用类型。","Name":"Nullable","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否为此项目启用可为 null 的引用类型。","DisplayName":"启用可为 null","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.wpf.projecttemplates.9.0.1-rtm.24610.3.nupkg","Author":"Microsoft","Classifications":["Common","WPF"],"DefaultName":"WpfApp1","Description":"用于创建 .NET WPF 应用程序的项目","Identity":"Microsoft.Common.WPF.CSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.WPF","Precedence":9000,"Name":"WPF 应用程序","ShortNameList":["wpf"],"PreferDefaultName":false,"ConfigPlace":"/WpfApplication-CSharp/.template.config/template.json","LocaleConfigPlace":"/WpfApplication-CSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":null,"PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.WpfApplication1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"VB":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"VB","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"替代目标框架","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代目标框架","DisplayName":"目标框架替代","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"netcoreapp3.0":{"DisplayName":".NET Core 3.0","Description":"目标 netcoreapp3.0"},"netcoreapp3.1":{"DisplayName":".NET Core 3.1","Description":"目标 netcoreapp3.1"},"net5.0":{"DisplayName":".NET 5.0","Description":"目标 net5.0"},"net6.0":{"DisplayName":".NET 6.0","Description":"目标 net6.0"},"net7.0":{"DisplayName":".NET 7.0","Description":"目标 net7.0"},"net8.0":{"DisplayName":".NET 8.0","Description":"目标 net8.0"},"net9.0":{"DisplayName":".NET 9.0","Description":"目标 net9.0"}},"Description":"项目的目标框架。","DisplayName":"框架","AllowMultipleValues":false},{"Documentation":"在创建的项目文件中设置 langVersion","Name":"langVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"在创建的项目文件中设置 langVersion","DisplayName":"语言版本","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"跳过还原","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.wpf.projecttemplates.9.0.1-rtm.24610.3.nupkg","Author":"Microsoft","Classifications":["Common","WPF"],"DefaultName":"WpfApp1","Description":"用于创建 .NET WPF 应用程序的项目","Identity":"Microsoft.Common.WPF.VisualBasic.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.WPF","Precedence":9000,"Name":"WPF 应用程序","ShortNameList":["wpf"],"PreferDefaultName":false,"ConfigPlace":"/WpfApplication-VisualBasic/.template.config/template.json","LocaleConfigPlace":"/WpfApplication-VisualBasic/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"project"},"HostData":null,"PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.ClassLibrary1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"替代目标框架","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代目标框架","DisplayName":"目标框架替代","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"netcoreapp3.0":{"DisplayName":".NET Core 3.0","Description":"目标 netcoreapp3.0"},"netcoreapp3.1":{"DisplayName":".NET Core 3.1","Description":"目标 netcoreapp3.1"},"net5.0":{"DisplayName":".NET 5.0","Description":"目标 net5.0"},"net6.0":{"DisplayName":".NET 6.0","Description":"目标 net6.0"},"net7.0":{"DisplayName":".NET 7.0","Description":"目标 net7.0"},"net8.0":{"DisplayName":".NET 8.0","Description":"目标 net8.0"},"net9.0":{"DisplayName":".NET 9.0","Description":"目标 net9.0"}},"Description":"项目的目标框架。","DisplayName":"框架","AllowMultipleValues":false},{"Documentation":"在创建的项目文件中设置 langVersion","Name":"langVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"在创建的项目文件中设置 langVersion","DisplayName":"语言版本","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"跳过还原","AllowMultipleValues":false},{"Documentation":"是否为此项目启用可为 null 的引用类型。","Name":"Nullable","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否为此项目启用可为 null 的引用类型。","DisplayName":"启用可为 null","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.wpf.projecttemplates.9.0.1-rtm.24610.3.nupkg","Author":"Microsoft","Classifications":["Common","WPF"],"DefaultName":"WpfLibrary1","Description":"用于创建目标为 .NET WPF 应用程序的类库的项目","Identity":"Microsoft.Common.WPF.Library.CSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.WPF.Library","Precedence":9000,"Name":"WPF 类库","ShortNameList":["wpflib"],"PreferDefaultName":false,"ConfigPlace":"/WpfClassLibrary-CSharp/.template.config/template.json","LocaleConfigPlace":"/WpfClassLibrary-CSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":null,"PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.ClassLibrary1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"VB":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"VB","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"替代目标框架","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代目标框架","DisplayName":"目标框架替代","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"netcoreapp3.0":{"DisplayName":".NET Core 3.0","Description":"目标 netcoreapp3.0"},"netcoreapp3.1":{"DisplayName":".NET Core 3.1","Description":"目标 netcoreapp3.1"},"net5.0":{"DisplayName":".NET 5.0","Description":"目标 net5.0"},"net6.0":{"DisplayName":".NET 6.0","Description":"目标 net6.0"},"net7.0":{"DisplayName":".NET 7.0","Description":"目标 net7.0"},"net8.0":{"DisplayName":".NET 8.0","Description":"目标 net8.0"},"net9.0":{"DisplayName":".NET 9.0","Description":"目标 net9.0"}},"Description":"项目的目标框架。","DisplayName":"框架","AllowMultipleValues":false},{"Documentation":"在创建的项目文件中设置 langVersion","Name":"langVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"在创建的项目文件中设置 langVersion","DisplayName":"语言版本","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"跳过还原","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.wpf.projecttemplates.9.0.1-rtm.24610.3.nupkg","Author":"Microsoft","Classifications":["Common","WPF"],"DefaultName":"WpfLibrary1","Description":"用于创建目标为 .NET WPF 应用程序的类库的项目","Identity":"Microsoft.Common.WPF.Library.VisualBasic.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.WPF.Library","Precedence":9000,"Name":"WPF 类库","ShortNameList":["wpflib"],"PreferDefaultName":false,"ConfigPlace":"/WpfClassLibrary-VisualBasic/.template.config/template.json","LocaleConfigPlace":"/WpfClassLibrary-VisualBasic/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"project"},"HostData":null,"PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.WpfCustomControlLibrary","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"替代目标框架","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代目标框架","DisplayName":"目标框架替代","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"netcoreapp3.0":{"DisplayName":".NET Core 3.0","Description":"目标 netcoreapp3.0"},"netcoreapp3.1":{"DisplayName":".NET Core 3.1","Description":"目标 netcoreapp3.1"},"net5.0":{"DisplayName":".NET 5.0","Description":"目标 net5.0"},"net6.0":{"DisplayName":".NET 6.0","Description":"目标 net6.0"},"net7.0":{"DisplayName":".NET 7.0","Description":"目标 net7.0"},"net8.0":{"DisplayName":".NET 8.0","Description":"目标 net8.0"},"net9.0":{"DisplayName":".NET 9.0","Description":"目标 net9.0"}},"Description":"项目的目标框架。","DisplayName":"框架","AllowMultipleValues":false},{"Documentation":"在创建的项目文件中设置 langVersion","Name":"langVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"在创建的项目文件中设置 langVersion","DisplayName":"语言版本","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"跳过还原","AllowMultipleValues":false},{"Documentation":"是否为此项目启用可为 null 的引用类型。","Name":"Nullable","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否为此项目启用可为 null 的引用类型。","DisplayName":"启用可为 null","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.wpf.projecttemplates.9.0.1-rtm.24610.3.nupkg","Author":"Microsoft","Classifications":["Common","WPF"],"DefaultName":"WpfCustomControlLibrary1","Description":"用于为 .NET WPF 应用程序创建自定义控件库的项目","Identity":"Microsoft.Common.WPF.CustomControl.CSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.WPF.CustomControl","Precedence":9000,"Name":"WPF 自定义控件库","ShortNameList":["wpfcustomcontrollib"],"PreferDefaultName":false,"ConfigPlace":"/WpfCustomControlLibrary-CSharp/.template.config/template.json","LocaleConfigPlace":"/WpfCustomControlLibrary-CSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":null,"PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.WpfCustomControlLibrary","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"VB":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"VB","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"替代目标框架","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代目标框架","DisplayName":"目标框架替代","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"netcoreapp3.0":{"DisplayName":".NET Core 3.0","Description":"目标 netcoreapp3.0"},"netcoreapp3.1":{"DisplayName":".NET Core 3.1","Description":"目标 netcoreapp3.1"},"net5.0":{"DisplayName":".NET 5.0","Description":"目标 net5.0"},"net6.0":{"DisplayName":".NET 6.0","Description":"目标 net6.0"},"net7.0":{"DisplayName":".NET 7.0","Description":"目标 net7.0"},"net8.0":{"DisplayName":".NET 8.0","Description":"目标 net8.0"},"net9.0":{"DisplayName":".NET 9.0","Description":"目标 net9.0"}},"Description":"项目的目标框架。","DisplayName":"框架","AllowMultipleValues":false},{"Documentation":"在创建的项目文件中设置 langVersion","Name":"langVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"在创建的项目文件中设置 langVersion","DisplayName":"语言版本","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"跳过还原","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.wpf.projecttemplates.9.0.1-rtm.24610.3.nupkg","Author":"Microsoft","Classifications":["Common","WPF"],"DefaultName":"WpfCustomControlLibrary1","Description":"用于为 .NET WPF 应用程序创建自定义控件库的项目","Identity":"Microsoft.Common.WPF.CustomControl.VisualBasic.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.WPF.CustomControl","Precedence":9000,"Name":"WPF 自定义控件库","ShortNameList":["wpfcustomcontrollib"],"PreferDefaultName":false,"ConfigPlace":"/WpfCustomControlLibrary-VisualBasic/.template.config/template.json","LocaleConfigPlace":"/WpfCustomControlLibrary-VisualBasic/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"project"},"HostData":null,"PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.WpfControlLibrary","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"替代目标框架","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代目标框架","DisplayName":"目标框架替代","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"netcoreapp3.0":{"DisplayName":".NET Core 3.0","Description":"目标 netcoreapp3.0"},"netcoreapp3.1":{"DisplayName":".NET Core 3.1","Description":"目标 netcoreapp3.1"},"net5.0":{"DisplayName":".NET 5.0","Description":"目标 net5.0"},"net6.0":{"DisplayName":".NET 6.0","Description":"目标 net6.0"},"net7.0":{"DisplayName":".NET 7.0","Description":"目标 net7.0"},"net8.0":{"DisplayName":".NET 8.0","Description":"目标 net8.0"},"net9.0":{"DisplayName":".NET 9.0","Description":"目标 net9.0"}},"Description":"项目的目标框架。","DisplayName":"框架","AllowMultipleValues":false},{"Documentation":"在创建的项目文件中设置 langVersion","Name":"langVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"在创建的项目文件中设置 langVersion","DisplayName":"语言版本","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"跳过还原","AllowMultipleValues":false},{"Documentation":"是否为此项目启用可为 null 的引用类型。","Name":"Nullable","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否为此项目启用可为 null 的引用类型。","DisplayName":"启用可为 null","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.wpf.projecttemplates.9.0.1-rtm.24610.3.nupkg","Author":"Microsoft","Classifications":["Common","WPF"],"DefaultName":"WpfControlLibrary1","Description":"用于为 .NET WPF 应用程序创建用户控件库的项目","Identity":"Microsoft.Common.WPF.Control.CSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.WPF.Control","Precedence":9000,"Name":"WPF 用户控件库","ShortNameList":["wpfusercontrollib"],"PreferDefaultName":false,"ConfigPlace":"/WpfUserControlLibrary-CSharp/.template.config/template.json","LocaleConfigPlace":"/WpfUserControlLibrary-CSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":null,"PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.WpfControlLibrary","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"VB":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"VB","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"替代目标框架","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代目标框架","DisplayName":"目标框架替代","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"netcoreapp3.0":{"DisplayName":".NET Core 3.0","Description":"目标 netcoreapp3.0"},"netcoreapp3.1":{"DisplayName":".NET Core 3.1","Description":"目标 netcoreapp3.1"},"net5.0":{"DisplayName":".NET 5.0","Description":"目标 net5.0"},"net6.0":{"DisplayName":".NET 6.0","Description":"目标 net6.0"},"net7.0":{"DisplayName":".NET 7.0","Description":"目标 net7.0"},"net8.0":{"DisplayName":".NET 8.0","Description":"目标 net8.0"},"net9.0":{"DisplayName":".NET 9.0","Description":"目标 net9.0"}},"Description":"项目的目标框架。","DisplayName":"框架","AllowMultipleValues":false},{"Documentation":"在创建的项目文件中设置 langVersion","Name":"langVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"在创建的项目文件中设置 langVersion","DisplayName":"语言版本","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"跳过还原","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.wpf.projecttemplates.9.0.1-rtm.24610.3.nupkg","Author":"Microsoft","Classifications":["Common","WPF"],"DefaultName":"WpfControlLibrary1","Description":"用于为 .NET WPF 应用程序创建用户控件库的项目","Identity":"Microsoft.Common.WPF.Control.VisualBasic.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.WPF.Control","Precedence":9000,"Name":"WPF 用户控件库","ShortNameList":["wpfusercontrollib"],"PreferDefaultName":false,"ConfigPlace":"/WpfUserControlLibrary-VisualBasic/.template.config/template.json","LocaleConfigPlace":"/WpfUserControlLibrary-VisualBasic/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"project"},"HostData":null,"PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.ClassLibrary1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"替代目标框架","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代目标框架","DisplayName":"目标框架替代","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net9.0":{"DisplayName":".NET 9.0","Description":"目标 net9.0"},"netstandard2.1":{"DisplayName":".NET Standard 2.1","Description":"目标 netstandard2.1"},"netstandard2.0":{"DisplayName":".NET Standard 2.0","Description":"目标 netstandard2.0"}},"Description":"项目的目标框架。","DisplayName":"框架","AllowMultipleValues":false},{"Documentation":"在创建的项目文件中设置 LangVersion 属性","Name":"langVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"在创建的项目文件中设置 LangVersion 属性","DisplayName":"语言版本","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"跳过还原","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.common.projecttemplates.9.0.9.0.102.nupkg","Author":"Microsoft","Classifications":["Common","Library"],"DefaultName":"ClassLibrary1","Description":"用于创建面向 .NET 或 .NET Standard 的类库的项目","Identity":"Microsoft.Common.Library.CSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.Library","Precedence":11000,"Name":"类库","ShortNameList":["classlib"],"PreferDefaultName":false,"ConfigPlace":"/content/ClassLibrary-CSharp/.template.config/template.json","LocaleConfigPlace":"/content/ClassLibrary-CSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/ClassLibrary-CSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{"app":{"Description":"Target .NET","DefaultOverrides":{"Framework":"net9.0"}},"standard":{"Description":"Target netstandard","DefaultOverrides":{"Framework":"netstandard2.0"}}},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"tags\":[{\"type\":\"projectType\",\"add\":[],\"remove\":[\"Common\"]}]}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.ClassLibrary1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"F#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"F#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"替代目标框架","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代目标框架","DisplayName":"目标框架替代","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net9.0":{"DisplayName":".NET 9.0","Description":"目标 net9.0"},"netstandard2.1":{"DisplayName":".NET Standard 2.1","Description":"目标 netstandard2.1"},"netstandard2.0":{"DisplayName":".NET Standard 2.0","Description":"目标 netstandard2.0"}},"Description":"项目的目标框架。","DisplayName":"框架","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"跳过还原","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.common.projecttemplates.9.0.9.0.102.nupkg","Author":"Microsoft","Classifications":["Common","Library"],"DefaultName":"ClassLibrary1","Description":"用于创建面向 .NET 或 .NET Standard 的类库的项目","Identity":"Microsoft.Common.Library.FSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.Library","Precedence":11000,"Name":"类库","ShortNameList":["classlib"],"PreferDefaultName":false,"ConfigPlace":"/content/ClassLibrary-FSharp/.template.config/template.json","LocaleConfigPlace":"/content/ClassLibrary-FSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/ClassLibrary-FSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{"app":{"Description":"Target .NET","DefaultOverrides":{"Framework":"net9.0"}},"standard":{"Description":"Target netstandard","DefaultOverrides":{"Framework":"netstandard2.0"}}},"TagsCollection":{"language":"F#","type":"project"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"tags\":[{\"type\":\"projectType\",\"add\":[],\"remove\":[\"Common\"]}]}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.ClassLibrary1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"VB":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"VB","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"替代目标框架","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代目标框架","DisplayName":"目标框架替代","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net9.0":{"DisplayName":".NET 9.0","Description":"目标 net9.0"},"netstandard2.1":{"DisplayName":".NET Standard 2.1","Description":"目标 netstandard2.1"},"netstandard2.0":{"DisplayName":".NET Standard 2.0","Description":"目标 netstandard2.0"}},"Description":"项目的目标框架。","DisplayName":"框架","AllowMultipleValues":false},{"Documentation":"在创建的项目文件中设置 LangVersion 属性","Name":"langVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"在创建的项目文件中设置 LangVersion 属性","DisplayName":"语言版本","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"跳过还原","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.common.projecttemplates.9.0.9.0.102.nupkg","Author":"Microsoft","Classifications":["Common","Library"],"DefaultName":"ClassLibrary1","Description":"用于创建面向 .NET 或 .NET Standard 的类库的项目","Identity":"Microsoft.Common.Library.VisualBasic.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.Library","Precedence":11000,"Name":"类库","ShortNameList":["classlib"],"PreferDefaultName":false,"ConfigPlace":"/content/ClassLibrary-VisualBasic/.template.config/template.json","LocaleConfigPlace":"/content/ClassLibrary-VisualBasic/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/ClassLibrary-VisualBasic/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{"app":{"Description":"Target .NET","DefaultOverrides":{"Framework":"net9.0"}},"standard":{"Description":"Target netstandard","DefaultOverrides":{"Framework":"netstandard2.0"}}},"TagsCollection":{"language":"VB","type":"project"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"tags\":[{\"type\":\"projectType\",\"add\":[],\"remove\":[\"Common\"]}]}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.ConsoleApplication1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"替代目标框架","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代目标框架","DisplayName":"目标框架替代","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net9.0":{"DisplayName":".NET 9.0","Description":"目标 net9.0"}},"Description":"项目的目标框架。","DisplayName":"框架","AllowMultipleValues":false},{"Documentation":"在创建的项目文件中设置 LangVersion 属性","Name":"langVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"在创建的项目文件中设置 LangVersion 属性","DisplayName":"语言版本","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"跳过还原","AllowMultipleValues":false},{"Documentation":"是否生成显式程序类和主方法,而不是顶级语句。","Name":"UseProgramMain","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否生成显式程序类和主方法,而不是顶级语句。","DisplayName":"不使用顶级语句(_T)","AllowMultipleValues":false},{"Documentation":"是否启用“将项目以原生 AOT 发布”。","Name":"NativeAot","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否启用“将项目以原生 AOT 发布”。","DisplayName":"启用原生 AOT 发布(_N)","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.common.projecttemplates.9.0.9.0.102.nupkg","Author":"Microsoft","Classifications":["Common","Console"],"DefaultName":"ConsoleApp1","Description":"用于创建可在 Windows、Linux 和 macOS 上 .NET 上运行的命令行应用程序的项目","Identity":"Microsoft.Common.Console.CSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.Console","Precedence":11000,"Name":"控制台应用","ShortNameList":["console"],"PreferDefaultName":false,"ConfigPlace":"/content/ConsoleApplication-CSharp/.template.config/template.json","LocaleConfigPlace":"/content/ConsoleApplication-CSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/ConsoleApplication-CSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"tags\":[{\"type\":\"projectType\",\"add\":[],\"remove\":[\"Common\"]}],\"symbolInfo\":[{\"id\":\"UseProgramMain\",\"isVisible\":true,\"PersistenceScope\":\"Shared\",\"PersistenceScopeName\":\"Microsoft\"},{\"id\":\"NativeAot\",\"isVisible\":true}]}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.ConsoleApplication1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"F#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"F#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"替代目标框架","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代目标框架","DisplayName":"目标框架替代","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net9.0":{"DisplayName":".NET 9.0","Description":"目标 net9.0"}},"Description":"项目的目标框架。","DisplayName":"框架","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"跳过还原","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.common.projecttemplates.9.0.9.0.102.nupkg","Author":"Microsoft","Classifications":["Common","Console"],"DefaultName":"ConsoleApp1","Description":"用于创建可在 Windows、Linux 和 macOS 上 .NET 上运行的命令行应用程序的项目","Identity":"Microsoft.Common.Console.FSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.Console","Precedence":11000,"Name":"控制台应用","ShortNameList":["console"],"PreferDefaultName":false,"ConfigPlace":"/content/ConsoleApplication-FSharp/.template.config/template.json","LocaleConfigPlace":"/content/ConsoleApplication-FSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/ConsoleApplication-FSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"F#","type":"project"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"tags\":[{\"type\":\"projectType\",\"add\":[],\"remove\":[\"Common\"]}]}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.ConsoleApplication1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"VB":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"VB","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"替代目标框架","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代目标框架","DisplayName":"目标框架替代","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net9.0":{"DisplayName":".NET 9.0","Description":"目标 net9.0"}},"Description":"项目的目标框架。","DisplayName":"框架","AllowMultipleValues":false},{"Documentation":"在创建的项目文件中设置 LangVersion 属性","Name":"langVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"在创建的项目文件中设置 LangVersion 属性","DisplayName":"语言版本","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"跳过还原","AllowMultipleValues":false},{"Documentation":"是否启用“将项目以原生 AOT 发布”。","Name":"NativeAot","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否启用“将项目以原生 AOT 发布”。","DisplayName":"启用原生 AOT 发布(_N)","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.common.projecttemplates.9.0.9.0.102.nupkg","Author":"Microsoft","Classifications":["Common","Console"],"DefaultName":"ConsoleApp1","Description":"用于创建可在 Windows、Linux 和 macOS 上 .NET 上运行的命令行应用程序的项目","Identity":"Microsoft.Common.Console.VisualBasic.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.Console","Precedence":11000,"Name":"控制台应用","ShortNameList":["console"],"PreferDefaultName":false,"ConfigPlace":"/content/ConsoleApplication-VisualBasic/.template.config/template.json","LocaleConfigPlace":"/content/ConsoleApplication-VisualBasic/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/ConsoleApplication-VisualBasic/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"project"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"tags\":[{\"type\":\"projectType\",\"add\":[],\"remove\":[\"Common\"]}],\"symbolInfo\":[{\"id\":\"NativeAot\",\"isVisible\":true}]}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Test1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"选择要包含在项目中的固定例程类型。","Name":"Fixture","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"None","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"None":{"DisplayName":"无","Description":"无固定例程方法"},"AssemblyInitialize":{"DisplayName":"","Description":"AssemblyInitialize 固定例程方法"},"AssemblyCleanup":{"DisplayName":"","Description":"AssemblyCleanup 固定例程方法"},"ClassInitialize":{"DisplayName":"","Description":"ClassInitialize 固定例程方法"},"ClassCleanup":{"DisplayName":"","Description":"ClassCleanup 固定例程方法"},"TestInitialize":{"DisplayName":"","Description":"TestInitialize 固定例程方法"},"TestCleanup":{"DisplayName":"","Description":"TestCleanup 固定例程方法"}},"Description":"选择要包含在项目中的固定例程类型。","DisplayName":"固定例程","AllowMultipleValues":true}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.test.projecttemplates.9.0.1.1.0-rtm.24605.1.nupkg","Author":"Microsoft","Classifications":["Test","MSTest"],"DefaultName":"Test1","Description":"创建新的 MSTest 测试类","Identity":"Microsoft.Test.MSTest.TestClass.CSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Test.MSTest.TestClass","Precedence":11000,"Name":"MSTest 测试类","ShortNameList":["mstest-class"],"PreferDefaultName":true,"ConfigPlace":"/content/MSTest-CSharp-TestClass/.template.config/template.json","LocaleConfigPlace":"/content/MSTest-CSharp-TestClass/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/MSTest-CSharp-TestClass/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":"{\"$schema\":\"https://json.schemastore.org/ide.host\",\"icon\":\"ide/icon.ico\",\"itemHierarchyPaths\":[\"Test\"],\"appliesTo\":\"TestContainer|TestingPlatformServer\",\"defaultItemExtension\":\"cs\",\"symbolInfo\":[{\"id\":\"Fixture\",\"isVisible\":true}]}","PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[{"Type":"project-capability","Args":"\"CSharp\""}]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"Company.TestProject1","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"C#","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"C#":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":"Overrides the target framework","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"Overrides the target framework","DisplayName":"Target framework override","AllowMultipleValues":false},{"Documentation":"The target framework for the project.","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net9.0":{"DisplayName":"","Description":".NET 9"},"net9.0-windows":{"DisplayName":"","Description":".NET 9 (Windows only)"},"net8.0":{"DisplayName":"","Description":".NET 8"},"net8.0-windows":{"DisplayName":"","Description":".NET 8 (Windows only)"},"net7.0":{"DisplayName":"","Description":".NET 7"},"net7.0-windows":{"DisplayName":"","Description":".NET 7 (Windows only)"},"net6.0":{"DisplayName":"","Description":".NET 6"},"net6.0-windows":{"DisplayName":"","Description":".NET 6 (Windows only)"},"netcoreapp3.1":{"DisplayName":"","Description":".NET Core 3.1"},"net481":{"DisplayName":"","Description":".NET Framework 4.8.1"},"net48":{"DisplayName":"","Description":".NET Framework 4.8"},"net472":{"DisplayName":"","Description":".NET Framework 4.7.2"},"net471":{"DisplayName":"","Description":".NET Framework 4.7.1"},"net47":{"DisplayName":"","Description":".NET Framework 4.7"},"net462":{"DisplayName":"","Description":".NET Framework 4.6.2"}},"Description":"The target framework for the project.","DisplayName":"Framework","AllowMultipleValues":false},{"Documentation":"If specified, skips the automatic restore of the project on create.","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"If specified, skips the automatic restore of the project on create.","DisplayName":"Skip restore","AllowMultipleValues":false},{"Documentation":"Sets the LangVersion property in the created project file","Name":"langVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"latest","DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"Sets the LangVersion property in the created project file","DisplayName":"Language version","AllowMultipleValues":false},{"Documentation":"Use MSTest.Sdk project style. More information at https://aka.ms/mstest/sdk","Name":"UseMSTestSdk","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"False","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Use MSTest.Sdk project style. More information at https://aka.ms/mstest/sdk","DisplayName":"Use MSTest.Sdk","AllowMultipleValues":false},{"Documentation":"Select the runner/platform. More information at https://aka.ms/mstest/sdk/extensions-profile","Name":"TestRunner","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"VSTest","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"MSTest":{"DisplayName":"","Description":"Use MSTest Runner (Microsoft.Testing.Platform)"},"VSTest":{"DisplayName":"","Description":"Use VSTest platform"}},"Description":"Select the runner/platform. More information at https://aka.ms/mstest/sdk/extensions-profile","DisplayName":"Test runner","AllowMultipleValues":false},{"Documentation":"The coverage tool to use for the project.","Name":"CoverageTool","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"Microsoft.CodeCoverage","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"Microsoft.CodeCoverage":{"DisplayName":"","Description":"Microsoft Code Coverage"},"coverlet":{"DisplayName":"","Description":"coverlet"}},"Description":"The coverage tool to use for the project.","DisplayName":"Coverage tool","AllowMultipleValues":false},{"Documentation":"Select the SDK extensions profile when using MSTest Runner. More information at https://aka.ms/mstest/sdk/extensions-profile","Name":"ExtensionsProfile","Priority":2,"Precedence":{"PrecedenceDefinition":4,"IsRequiredCondition":null,"IsEnabledCondition":"UseMSTestSdk && (TestRunner == MSTest)","IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"Default","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"Default":{"DisplayName":"Default","Description":"Default extensions profile (recommended)"},"None":{"DisplayName":"None","Description":"No extensions are enabled"},"AllMicrosoft":{"DisplayName":"AllMicrosoft","Description":"Enable all extensions shipped by Microsoft (including extensions with a restrictive license)"}},"Description":"Select the SDK extensions profile when using MSTest Runner. More information at https://aka.ms/mstest/sdk/extensions-profile","DisplayName":"Testing extensions profile","AllowMultipleValues":false},{"Documentation":"Select the fixture kinds to include in the project.","Name":"Fixture","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"None","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"None":{"DisplayName":"None","Description":"No fixture methods"},"AssemblyInitialize":{"DisplayName":"","Description":"AssemblyInitialize fixture method"},"AssemblyCleanup":{"DisplayName":"","Description":"AssemblyCleanup fixture method"},"ClassInitialize":{"DisplayName":"","Description":"ClassInitialize fixture method"},"ClassCleanup":{"DisplayName":"","Description":"ClassCleanup fixture method"},"TestInitialize":{"DisplayName":"","Description":"TestInitialize fixture method"},"TestCleanup":{"DisplayName":"","Description":"TestCleanup fixture method"}},"Description":"Select the fixture kinds to include in the project.","DisplayName":"Fixture","AllowMultipleValues":true}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.test.projecttemplates.9.0.1.1.0-rtm.24605.1.nupkg","Author":"Microsoft","Classifications":["Test","MSTest","Desktop","Web"],"DefaultName":"TestProject1","Description":"A project that contains MSTest tests that can run on .NET on Windows, Linux and MacOS.","Identity":"Microsoft.Test.MSTest.CSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Test.MSTest","Precedence":11000,"Name":"MSTest Test Project","ShortNameList":["mstest"],"PreferDefaultName":false,"ConfigPlace":"/content/MSTest-CSharp/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/MSTest-CSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"https://json.schemastore.org/ide.host\",\"icon\":\"ide/icon.ico\",\"symbolInfo\":[{\"id\":\"UseMSTestSdk\",\"isVisible\":true,\"persistenceScope\":\"shared\"},{\"id\":\"TestRunner\",\"isVisible\":true,\"persistenceScope\":\"shared\"},{\"id\":\"ExtensionsProfile\",\"isVisible\":true},{\"id\":\"CoverageTool\",\"isVisible\":true,\"persistenceScope\":\"shared\"},{\"id\":\"Fixture\",\"isVisible\":true}],\"tags\":[{\"type\":\"platform\",\"add\":[\"Linux\",\"macOS\",\"Windows\"]}]}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Test1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"F#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"F#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"选择要包含在项目中的固定例程类型。","Name":"Fixture","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"None","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"None":{"DisplayName":"无","Description":"无固定例程方法"},"AssemblyInitialize":{"DisplayName":"","Description":"AssemblyInitialize 固定例程方法"},"AssemblyCleanup":{"DisplayName":"","Description":"AssemblyCleanup 固定例程方法"},"ClassInitialize":{"DisplayName":"","Description":"ClassInitialize 固定例程方法"},"ClassCleanup":{"DisplayName":"","Description":"ClassCleanup 固定例程方法"},"TestInitialize":{"DisplayName":"","Description":"TestInitialize 固定例程方法"},"TestCleanup":{"DisplayName":"","Description":"TestCleanup 固定例程方法"}},"Description":"选择要包含在项目中的固定例程类型。","DisplayName":"固定例程","AllowMultipleValues":true}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.test.projecttemplates.9.0.1.1.0-rtm.24605.1.nupkg","Author":"Microsoft","Classifications":["Test","MSTest"],"DefaultName":"Test1","Description":"创建新的 MSTest 测试类","Identity":"Microsoft.Test.MSTest.TestClass.FSharp.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Test.MSTest.TestClass","Precedence":10000,"Name":"MSTest 测试类","ShortNameList":["mstest-class"],"PreferDefaultName":true,"ConfigPlace":"/content/MSTest-FSharp-TestClass/.template.config/template.json","LocaleConfigPlace":"/content/MSTest-FSharp-TestClass/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/MSTest-FSharp-TestClass/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"F#","type":"item"},"HostData":"{\"$schema\":\"https://json.schemastore.org/ide.host\",\"icon\":\"ide/icon.ico\",\"itemHierarchyPaths\":[\"Test\"],\"appliesTo\":\"TestContainer|TestingPlatformServer\",\"defaultItemExtension\":\"fs\",\"symbolInfo\":[{\"id\":\"Fixture\",\"isVisible\":true}]}","PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"Company.TestProject1","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"F#","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"F#":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":"Overrides the target framework","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"Overrides the target framework","DisplayName":"Target framework override","AllowMultipleValues":false},{"Documentation":"The target framework for the project.","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net9.0":{"DisplayName":"","Description":".NET 9"},"net9.0-windows":{"DisplayName":"","Description":".NET 9 (Windows only)"},"net8.0":{"DisplayName":"","Description":".NET 8"},"net8.0-windows":{"DisplayName":"","Description":".NET 8 (Windows only)"},"net7.0":{"DisplayName":"","Description":".NET 7"},"net7.0-windows":{"DisplayName":"","Description":".NET 7 (Windows only)"},"net6.0":{"DisplayName":"","Description":".NET 6"},"net6.0-windows":{"DisplayName":"","Description":".NET 6 (Windows only)"},"netcoreapp3.1":{"DisplayName":"","Description":".NET Core 3.1"},"net481":{"DisplayName":"","Description":".NET Framework 4.8.1"},"net48":{"DisplayName":"","Description":".NET Framework 4.8"},"net472":{"DisplayName":"","Description":".NET Framework 4.7.2"},"net471":{"DisplayName":"","Description":".NET Framework 4.7.1"},"net47":{"DisplayName":"","Description":".NET Framework 4.7"},"net462":{"DisplayName":"","Description":".NET Framework 4.6.2"}},"Description":"The target framework for the project.","DisplayName":"Framework","AllowMultipleValues":false},{"Documentation":"If specified, skips the automatic restore of the project on create.","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"If specified, skips the automatic restore of the project on create.","DisplayName":"Skip restore","AllowMultipleValues":false},{"Documentation":"Sets the LangVersion property in the created project file","Name":"langVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"latest","DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"Sets the LangVersion property in the created project file","DisplayName":"Language version","AllowMultipleValues":false},{"Documentation":"Use MSTest.Sdk project style. More information at https://aka.ms/mstest/sdk","Name":"UseMSTestSdk","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"False","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Use MSTest.Sdk project style. More information at https://aka.ms/mstest/sdk","DisplayName":"Use MSTest.Sdk","AllowMultipleValues":false},{"Documentation":"Select the runner/platform. More information at https://aka.ms/mstest/sdk/extensions-profile","Name":"TestRunner","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"VSTest","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"MSTest":{"DisplayName":"","Description":"Use MSTest Runner (Microsoft.Testing.Platform)"},"VSTest":{"DisplayName":"","Description":"Use VSTest platform"}},"Description":"Select the runner/platform. More information at https://aka.ms/mstest/sdk/extensions-profile","DisplayName":"Test runner","AllowMultipleValues":false},{"Documentation":"The coverage tool to use for the project.","Name":"CoverageTool","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"Microsoft.CodeCoverage","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"Microsoft.CodeCoverage":{"DisplayName":"","Description":"Microsoft Code Coverage"},"coverlet":{"DisplayName":"","Description":"coverlet"}},"Description":"The coverage tool to use for the project.","DisplayName":"Coverage tool","AllowMultipleValues":false},{"Documentation":"Select the SDK extensions profile when using MSTest Runner. More information at https://aka.ms/mstest/sdk/extensions-profile","Name":"ExtensionsProfile","Priority":2,"Precedence":{"PrecedenceDefinition":4,"IsRequiredCondition":null,"IsEnabledCondition":"UseMSTestSdk && (TestRunner == MSTest)","IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"Default","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"Default":{"DisplayName":"Default","Description":"Default extensions profile (recommended)"},"None":{"DisplayName":"None","Description":"No extensions are enabled"},"AllMicrosoft":{"DisplayName":"AllMicrosoft","Description":"Enable all extensions shipped by Microsoft (including extensions with a restrictive license)"}},"Description":"Select the SDK extensions profile when using MSTest Runner. More information at https://aka.ms/mstest/sdk/extensions-profile","DisplayName":"Testing extensions profile","AllowMultipleValues":false},{"Documentation":"Select the fixture kinds to include in the project.","Name":"Fixture","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"None","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"None":{"DisplayName":"None","Description":"No fixture methods"},"AssemblyInitialize":{"DisplayName":"","Description":"AssemblyInitialize fixture method"},"AssemblyCleanup":{"DisplayName":"","Description":"AssemblyCleanup fixture method"},"ClassInitialize":{"DisplayName":"","Description":"ClassInitialize fixture method"},"ClassCleanup":{"DisplayName":"","Description":"ClassCleanup fixture method"},"TestInitialize":{"DisplayName":"","Description":"TestInitialize fixture method"},"TestCleanup":{"DisplayName":"","Description":"TestCleanup fixture method"}},"Description":"Select the fixture kinds to include in the project.","DisplayName":"Fixture","AllowMultipleValues":true}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.test.projecttemplates.9.0.1.1.0-rtm.24605.1.nupkg","Author":"Microsoft","Classifications":["Test","MSTest","Desktop","Web"],"DefaultName":"TestProject1","Description":"A project that contains MSTest tests that can run on .NET on Windows, Linux and MacOS.","Identity":"Microsoft.Test.MSTest.FSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Test.MSTest","Precedence":11000,"Name":"MSTest Test Project","ShortNameList":["mstest"],"PreferDefaultName":false,"ConfigPlace":"/content/MSTest-FSharp/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/MSTest-FSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"F#","type":"project"},"HostData":"{\"$schema\":\"https://json.schemastore.org/ide.host\",\"icon\":\"ide/icon.ico\",\"symbolInfo\":[{\"id\":\"UseMSTestSdk\",\"isVisible\":true,\"persistenceScope\":\"shared\"},{\"id\":\"TestRunner\",\"isVisible\":true,\"persistenceScope\":\"shared\"},{\"id\":\"ExtensionsProfile\",\"isVisible\":true},{\"id\":\"CoverageTool\",\"isVisible\":true,\"persistenceScope\":\"shared\"},{\"id\":\"Fixture\",\"isVisible\":true}],\"tags\":[{\"type\":\"platform\",\"add\":[\"Linux\",\"macOS\",\"Windows\"]}]}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Test1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"VB":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"VB","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"选择要包含在项目中的固定例程类型。","Name":"Fixture","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"None","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"None":{"DisplayName":"无","Description":"无固定例程方法"},"AssemblyInitialize":{"DisplayName":"","Description":"AssemblyInitialize 固定例程方法"},"AssemblyCleanup":{"DisplayName":"","Description":"AssemblyCleanup 固定例程方法"},"ClassInitialize":{"DisplayName":"","Description":"ClassInitialize 固定例程方法"},"ClassCleanup":{"DisplayName":"","Description":"ClassCleanup 固定例程方法"},"TestInitialize":{"DisplayName":"","Description":"TestInitialize 固定例程方法"},"TestCleanup":{"DisplayName":"","Description":"TestCleanup 固定例程方法"}},"Description":"选择要包含在项目中的固定例程类型。","DisplayName":"固定例程","AllowMultipleValues":true}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.test.projecttemplates.9.0.1.1.0-rtm.24605.1.nupkg","Author":"Microsoft","Classifications":["Test","MSTest"],"DefaultName":"Test1","Description":"创建新的 MSTest 测试类","Identity":"Microsoft.Test.MSTest.TestClass.VisualBasic.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Test.MSTest.TestClass","Precedence":10000,"Name":"MSTest 测试类","ShortNameList":["mstest-class"],"PreferDefaultName":true,"ConfigPlace":"/content/MSTest-VisualBasic-TestClass/.template.config/template.json","LocaleConfigPlace":"/content/MSTest-VisualBasic-TestClass/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/MSTest-VisualBasic-TestClass/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"item"},"HostData":"{\"$schema\":\"https://json.schemastore.org/ide.host\",\"icon\":\"ide/icon.ico\",\"itemHierarchyPaths\":[\"Test\"],\"appliesTo\":\"TestContainer|TestingPlatformServer\",\"defaultItemExtension\":\"vb\",\"symbolInfo\":[{\"id\":\"Fixture\",\"isVisible\":true}]}","PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"Company.TestProject1","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"VB","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"VB":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":"Overrides the target framework","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"Overrides the target framework","DisplayName":"Target framework override","AllowMultipleValues":false},{"Documentation":"The target framework for the project.","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net9.0":{"DisplayName":"","Description":".NET 9"},"net9.0-windows":{"DisplayName":"","Description":".NET 9 (Windows only)"},"net8.0":{"DisplayName":"","Description":".NET 8"},"net8.0-windows":{"DisplayName":"","Description":".NET 8 (Windows only)"},"net7.0":{"DisplayName":"","Description":".NET 7"},"net7.0-windows":{"DisplayName":"","Description":".NET 7 (Windows only)"},"net6.0":{"DisplayName":"","Description":".NET 6"},"net6.0-windows":{"DisplayName":"","Description":".NET 6 (Windows only)"},"netcoreapp3.1":{"DisplayName":"","Description":".NET Core 3.1"},"net481":{"DisplayName":"","Description":".NET Framework 4.8.1"},"net48":{"DisplayName":"","Description":".NET Framework 4.8"},"net472":{"DisplayName":"","Description":".NET Framework 4.7.2"},"net471":{"DisplayName":"","Description":".NET Framework 4.7.1"},"net47":{"DisplayName":"","Description":".NET Framework 4.7"},"net462":{"DisplayName":"","Description":".NET Framework 4.6.2"}},"Description":"The target framework for the project.","DisplayName":"Framework","AllowMultipleValues":false},{"Documentation":"If specified, skips the automatic restore of the project on create.","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"If specified, skips the automatic restore of the project on create.","DisplayName":"Skip restore","AllowMultipleValues":false},{"Documentation":"Sets the LangVersion property in the created project file","Name":"langVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"latest","DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"Sets the LangVersion property in the created project file","DisplayName":"Language version","AllowMultipleValues":false},{"Documentation":"Use MSTest.Sdk project style. More information at https://aka.ms/mstest/sdk","Name":"UseMSTestSdk","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"False","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Use MSTest.Sdk project style. More information at https://aka.ms/mstest/sdk","DisplayName":"Use MSTest.Sdk","AllowMultipleValues":false},{"Documentation":"Select the runner/platform. More information at https://aka.ms/mstest/sdk/extensions-profile","Name":"TestRunner","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"VSTest","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"MSTest":{"DisplayName":"","Description":"Use MSTest Runner (Microsoft.Testing.Platform)"},"VSTest":{"DisplayName":"","Description":"Use VSTest platform"}},"Description":"Select the runner/platform. More information at https://aka.ms/mstest/sdk/extensions-profile","DisplayName":"Test runner","AllowMultipleValues":false},{"Documentation":"The coverage tool to use for the project.","Name":"CoverageTool","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"Microsoft.CodeCoverage","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"Microsoft.CodeCoverage":{"DisplayName":"","Description":"Microsoft Code Coverage"},"coverlet":{"DisplayName":"","Description":"coverlet"}},"Description":"The coverage tool to use for the project.","DisplayName":"Coverage tool","AllowMultipleValues":false},{"Documentation":"Select the SDK extensions profile when using MSTest Runner. More information at https://aka.ms/mstest/sdk/extensions-profile","Name":"ExtensionsProfile","Priority":2,"Precedence":{"PrecedenceDefinition":4,"IsRequiredCondition":null,"IsEnabledCondition":"UseMSTestSdk && (TestRunner == MSTest)","IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"Default","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"Default":{"DisplayName":"Default","Description":"Default extensions profile (recommended)"},"None":{"DisplayName":"None","Description":"No extensions are enabled"},"AllMicrosoft":{"DisplayName":"AllMicrosoft","Description":"Enable all extensions shipped by Microsoft (including extensions with a restrictive license)"}},"Description":"Select the SDK extensions profile when using MSTest Runner. More information at https://aka.ms/mstest/sdk/extensions-profile","DisplayName":"Testing extensions profile","AllowMultipleValues":false},{"Documentation":"Select the fixture kinds to include in the project.","Name":"Fixture","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"None","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"None":{"DisplayName":"None","Description":"No fixture methods"},"AssemblyInitialize":{"DisplayName":"","Description":"AssemblyInitialize fixture method"},"AssemblyCleanup":{"DisplayName":"","Description":"AssemblyCleanup fixture method"},"ClassInitialize":{"DisplayName":"","Description":"ClassInitialize fixture method"},"ClassCleanup":{"DisplayName":"","Description":"ClassCleanup fixture method"},"TestInitialize":{"DisplayName":"","Description":"TestInitialize fixture method"},"TestCleanup":{"DisplayName":"","Description":"TestCleanup fixture method"}},"Description":"Select the fixture kinds to include in the project.","DisplayName":"Fixture","AllowMultipleValues":true}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.test.projecttemplates.9.0.1.1.0-rtm.24605.1.nupkg","Author":"Microsoft","Classifications":["Test","MSTest","Desktop","Web"],"DefaultName":"TestProject1","Description":"A project that contains MSTest tests that can run on .NET on Windows, Linux and MacOS.","Identity":"Microsoft.Test.MSTest.VisualBasic.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Test.MSTest","Precedence":11000,"Name":"MSTest Test Project","ShortNameList":["mstest"],"PreferDefaultName":false,"ConfigPlace":"/content/MSTest-VisualBasic/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/MSTest-VisualBasic/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"project"},"HostData":"{\"$schema\":\"https://json.schemastore.org/ide.host\",\"icon\":\"ide/icon.ico\",\"symbolInfo\":[{\"id\":\"UseMSTestSdk\",\"isVisible\":true,\"persistenceScope\":\"shared\"},{\"id\":\"TestRunner\",\"isVisible\":true,\"persistenceScope\":\"shared\"},{\"id\":\"ExtensionsProfile\",\"isVisible\":true},{\"id\":\"CoverageTool\",\"isVisible\":true,\"persistenceScope\":\"shared\"},{\"id\":\"Fixture\",\"isVisible\":true}],\"tags\":[{\"type\":\"platform\",\"add\":[\"Linux\",\"macOS\",\"Windows\"]}]}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"UnitTest1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.test.projecttemplates.9.0.1.1.0-rtm.24605.1.nupkg","Author":"Aleksei Kharlov aka halex2005 (codeofclimber.ru)","Classifications":["Test","NUnit"],"DefaultName":"NUnitTestItem","Description":"创建新的 NUnit 测试类","Identity":"NUnit3.DotNetNew.ItemTemplate.CSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"NUnit3.DotNetNew.ItemTemplate","Precedence":11000,"Name":"NUnit 3 测试项","ShortNameList":["nunit-test"],"PreferDefaultName":false,"ConfigPlace":"/content/NUnit-CSharp-Item/.template.config/template.json","LocaleConfigPlace":"/content/NUnit-CSharp-Item/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/NUnit-CSharp-Item/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":"{\"$schema\":\"https://json.schemastore.org/ide.host\",\"icon\":\"ide/icon.ico\",\"itemHierarchyPaths\":[\"Test\"],\"appliesTo\":\"TestContainer|TestingPlatformServer\",\"defaultItemExtension\":\"cs\"}","PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[{"Type":"project-capability","Args":"\"CSharp\""}]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.TestProject1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"替代目标框架","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代目标框架","DisplayName":"目标框架替代","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net9.0":{"DisplayName":"","Description":"目标 net9.0"}},"Description":"项目的目标框架。","DisplayName":"框架","AllowMultipleValues":false},{"Documentation":"是否(通过 \"dotnet pack\")为项目启用打包。","Name":"EnablePack","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否(通过 \"dotnet pack\")为项目启用打包。","DisplayName":"启用包","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"跳过还原","AllowMultipleValues":false},{"Documentation":"在创建的项目文件中设置 LangVersion 属性","Name":"langVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"latest","DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"在创建的项目文件中设置 LangVersion 属性","DisplayName":"语言版本","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.test.projecttemplates.9.0.1.1.0-rtm.24605.1.nupkg","Author":"Aleksei Kharlov aka halex2005 (codeofclimber.ru)","Classifications":["Test","NUnit","Desktop","Web"],"DefaultName":"TestProject1","Description":"一个包含 NUnit 测试的项目,这些测试可在 Windows、Linux 和 macOS 的 .NET 上运行","Identity":"NUnit3.DotNetNew.Template.CSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"NUnit3.DotNetNew.Template","Precedence":11000,"Name":"NUnit 3 测试项目","ShortNameList":["nunit"],"PreferDefaultName":false,"ConfigPlace":"/content/NUnit-CSharp/.template.config/template.json","LocaleConfigPlace":"/content/NUnit-CSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/NUnit-CSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"https://json.schemastore.org/ide.host\",\"icon\":\"ide/icon.ico\",\"tags\":[{\"type\":\"platform\",\"add\":[\"Linux\",\"macOS\",\"Windows\"]}]}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"UnitTest1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"F#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"F#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.test.projecttemplates.9.0.1.1.0-rtm.24605.1.nupkg","Author":"Aleksei Kharlov aka halex2005 (codeofclimber.ru)","Classifications":["Test","NUnit"],"DefaultName":"NUnitTestItem","Description":"创建新的 NUnit 测试类","Identity":"NUnit3.DotNetNew.ItemTemplate.FSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"NUnit3.DotNetNew.ItemTemplate","Precedence":11000,"Name":"NUnit 3 测试项","ShortNameList":["nunit-test"],"PreferDefaultName":false,"ConfigPlace":"/content/NUnit-FSharp-Item/.template.config/template.json","LocaleConfigPlace":"/content/NUnit-FSharp-Item/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/NUnit-FSharp-Item/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"F#","type":"item"},"HostData":"{\"$schema\":\"https://json.schemastore.org/ide.host\",\"icon\":\"ide/icon.ico\",\"itemHierarchyPaths\":[\"Test\"],\"appliesTo\":\"TestContainer|TestingPlatformServer\",\"defaultItemExtension\":\"fs\"}","PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.TestProject1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"F#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"F#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"替代目标框架","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代目标框架","DisplayName":"目标框架替代","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net9.0":{"DisplayName":"","Description":"目标 net9.0"}},"Description":"项目的目标框架。","DisplayName":"框架","AllowMultipleValues":false},{"Documentation":"是否(通过 \"dotnet pack\")为项目启用打包。","Name":"EnablePack","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否(通过 \"dotnet pack\")为项目启用打包。","DisplayName":"启用包","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"跳过还原","AllowMultipleValues":false},{"Documentation":"在创建的项目文件中设置 LangVersion 属性","Name":"langVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"latest","DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"在创建的项目文件中设置 LangVersion 属性","DisplayName":"语言版本","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.test.projecttemplates.9.0.1.1.0-rtm.24605.1.nupkg","Author":"Aleksei Kharlov aka halex2005 (codeofclimber.ru)","Classifications":["Test","NUnit","Desktop","Web"],"DefaultName":"TestProject1","Description":"一个包含 NUnit 测试的项目,这些测试可在 Windows、Linux 和 macOS 的 .NET 上运行","Identity":"NUnit3.DotNetNew.Template.FSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"NUnit3.DotNetNew.Template","Precedence":11000,"Name":"NUnit 3 测试项目","ShortNameList":["nunit"],"PreferDefaultName":false,"ConfigPlace":"/content/NUnit-FSharp/.template.config/template.json","LocaleConfigPlace":"/content/NUnit-FSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/NUnit-FSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"F#","type":"project"},"HostData":"{\"$schema\":\"https://json.schemastore.org/ide.host\",\"icon\":\"ide/icon.ico\",\"tags\":[{\"type\":\"platform\",\"add\":[\"Linux\",\"macOS\",\"Windows\"]}]}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"UnitTest1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"VB":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"VB","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.test.projecttemplates.9.0.1.1.0-rtm.24605.1.nupkg","Author":"Aleksei Kharlov aka halex2005 (codeofclimber.ru)","Classifications":["Test","NUnit"],"DefaultName":"NUnitTestItem","Description":"创建新的 NUnit 测试类","Identity":"NUnit3.DotNetNew.ItemTemplate.VisualBasic.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"NUnit3.DotNetNew.ItemTemplate","Precedence":11000,"Name":"NUnit 3 测试项","ShortNameList":["nunit-test"],"PreferDefaultName":false,"ConfigPlace":"/content/NUnit-VisualBasic-Item/.template.config/template.json","LocaleConfigPlace":"/content/NUnit-VisualBasic-Item/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/NUnit-VisualBasic-Item/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"item"},"HostData":"{\"$schema\":\"https://json.schemastore.org/ide.host\",\"icon\":\"ide/icon.ico\",\"itemHierarchyPaths\":[\"Test\"],\"appliesTo\":\"TestContainer|TestingPlatformServer\",\"defaultItemExtension\":\"vb\"}","PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.TestProject1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"VB":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"VB","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"替代目标框架","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代目标框架","DisplayName":"目标框架替代","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net9.0":{"DisplayName":"","Description":"目标 net9.0"}},"Description":"项目的目标框架。","DisplayName":"框架","AllowMultipleValues":false},{"Documentation":"是否(通过 \"dotnet pack\")为项目启用打包。","Name":"EnablePack","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否(通过 \"dotnet pack\")为项目启用打包。","DisplayName":"启用包","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"跳过还原","AllowMultipleValues":false},{"Documentation":"在创建的项目文件中设置 LangVersion 属性","Name":"langVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"latest","DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"在创建的项目文件中设置 LangVersion 属性","DisplayName":"语言版本","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.test.projecttemplates.9.0.1.1.0-rtm.24605.1.nupkg","Author":"Aleksei Kharlov aka halex2005 (codeofclimber.ru)","Classifications":["Test","NUnit","Desktop","Web"],"DefaultName":"TestProject1","Description":"一个包含 NUnit 测试的项目,这些测试可在 Windows、Linux 和 macOS 的 .NET 上运行","Identity":"NUnit3.DotNetNew.Template.VisualBasic.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"NUnit3.DotNetNew.Template","Precedence":11000,"Name":"NUnit 3 测试项目","ShortNameList":["nunit"],"PreferDefaultName":false,"ConfigPlace":"/content/NUnit-VisualBasic/.template.config/template.json","LocaleConfigPlace":"/content/NUnit-VisualBasic/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/NUnit-VisualBasic/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"project"},"HostData":"{\"$schema\":\"https://json.schemastore.org/ide.host\",\"icon\":\"ide/icon.ico\",\"tags\":[{\"type\":\"platform\",\"add\":[\"Linux\",\"macOS\",\"Windows\"]}]}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"Company.TestProject1","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"C#","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"C#":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":"Overrides the target framework","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"Overrides the target framework","DisplayName":"Target framework override","AllowMultipleValues":false},{"Documentation":"The target framework for the project.","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net9.0":{"DisplayName":"","Description":".NET 9"},"net9.0-windows":{"DisplayName":"","Description":".NET 9 (Windows only)"},"net8.0":{"DisplayName":"","Description":".NET 8"},"net8.0-windows":{"DisplayName":"","Description":".NET 8 (Windows only)"},"net7.0":{"DisplayName":"","Description":".NET 7"},"net7.0-windows":{"DisplayName":"","Description":".NET 7 (Windows only)"},"net6.0":{"DisplayName":"","Description":".NET 6"},"net6.0-windows":{"DisplayName":"","Description":".NET 6 (Windows only)"},"netcoreapp3.1":{"DisplayName":"","Description":".NET Core 3.1"},"net481":{"DisplayName":"","Description":".NET Framework 4.8.1"},"net48":{"DisplayName":"","Description":".NET Framework 4.8"},"net472":{"DisplayName":"","Description":".NET Framework 4.7.2"},"net471":{"DisplayName":"","Description":".NET Framework 4.7.1"},"net47":{"DisplayName":"","Description":".NET Framework 4.7"},"net462":{"DisplayName":"","Description":".NET Framework 4.6.2"}},"Description":"The target framework for the project.","DisplayName":"Framework","AllowMultipleValues":false},{"Documentation":"If specified, skips the automatic restore of the project on create.","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"If specified, skips the automatic restore of the project on create.","DisplayName":"Skip restore","AllowMultipleValues":false},{"Documentation":"Sets the LangVersion property in the created project file","Name":"langVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"latest","DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"Sets the LangVersion property in the created project file","DisplayName":"Language version","AllowMultipleValues":false},{"Documentation":"Use MSTest.Sdk project style. More information at https://aka.ms/mstest/sdk","Name":"UseMSTestSdk","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"False","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Use MSTest.Sdk project style. More information at https://aka.ms/mstest/sdk","DisplayName":"Use MSTest.Sdk","AllowMultipleValues":false},{"Documentation":"Select the runner/platform. More information at https://aka.ms/mstest/sdk/extensions-profile","Name":"TestRunner","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"VSTest","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"MSTest":{"DisplayName":"","Description":"Use MSTest Runner (Microsoft.Testing.Platform)"},"VSTest":{"DisplayName":"","Description":"Use VSTest platform"}},"Description":"Select the runner/platform. More information at https://aka.ms/mstest/sdk/extensions-profile","DisplayName":"Test runner","AllowMultipleValues":false},{"Documentation":"The coverage tool to use for the project.","Name":"CoverageTool","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"Microsoft.CodeCoverage","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"Microsoft.CodeCoverage":{"DisplayName":"","Description":"Microsoft Code Coverage"},"coverlet":{"DisplayName":"","Description":"coverlet"}},"Description":"The coverage tool to use for the project.","DisplayName":"Coverage tool","AllowMultipleValues":false},{"Documentation":"Select the SDK extensions profile when using MSTest Runner. More information at https://aka.ms/mstest/sdk/extensions-profile","Name":"ExtensionsProfile","Priority":2,"Precedence":{"PrecedenceDefinition":4,"IsRequiredCondition":null,"IsEnabledCondition":"UseMSTestSdk && (TestRunner == MSTest)","IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"Default","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"Default":{"DisplayName":"Default","Description":"Default extensions profile (recommended)"},"None":{"DisplayName":"None","Description":"No extensions are enabled"},"AllMicrosoft":{"DisplayName":"AllMicrosoft","Description":"Enable all extensions shipped by Microsoft (including extensions with a restrictive license)"}},"Description":"Select the SDK extensions profile when using MSTest Runner. More information at https://aka.ms/mstest/sdk/extensions-profile","DisplayName":"Testing extensions profile","AllowMultipleValues":false},{"Documentation":"Select the fixture kinds to include in the project.","Name":"Fixture","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"None","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"None":{"DisplayName":"None","Description":"No fixture methods"},"AssemblyInitialize":{"DisplayName":"","Description":"AssemblyInitialize fixture method"},"AssemblyCleanup":{"DisplayName":"","Description":"AssemblyCleanup fixture method"},"ClassInitialize":{"DisplayName":"","Description":"ClassInitialize fixture method"},"ClassCleanup":{"DisplayName":"","Description":"ClassCleanup fixture method"},"TestInitialize":{"DisplayName":"","Description":"TestInitialize fixture method"},"TestCleanup":{"DisplayName":"","Description":"TestCleanup fixture method"}},"Description":"Select the fixture kinds to include in the project.","DisplayName":"Fixture","AllowMultipleValues":true}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.test.projecttemplates.9.0.1.1.0-rtm.24605.1.nupkg","Author":"Microsoft","Classifications":["Test","MSTest","Playwright","Desktop","Web"],"DefaultName":"TestProject1","Description":"A project that contains Playwright tests using MSTest test framework, that can run on .NET on Windows, Linux and MacOS.","Identity":"Microsoft.Test.Playwright.MSTest.CSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Test.Playwright.MSTest","Precedence":11000,"Name":"MSTest Playwright Test Project","ShortNameList":["mstest-playwright"],"PreferDefaultName":false,"ConfigPlace":"/content/Playwright-MSTest-CSharp/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/Playwright-MSTest-CSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"https://json.schemastore.org/ide.host\",\"icon\":\"ide/icon.ico\",\"symbolInfo\":[{\"id\":\"UseMSTestSdk\",\"isVisible\":true,\"persistenceScope\":\"shared\"},{\"id\":\"TestRunner\",\"isVisible\":true,\"persistenceScope\":\"shared\"},{\"id\":\"ExtensionsProfile\",\"isVisible\":true},{\"id\":\"CoverageTool\",\"isVisible\":true,\"persistenceScope\":\"shared\"},{\"id\":\"Fixture\",\"isVisible\":true}],\"tags\":[{\"type\":\"platform\",\"add\":[\"Linux\",\"macOS\",\"Windows\"]}]}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.TestProject1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"替代目标框架","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代目标框架","DisplayName":"目标框架替代","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net9.0":{"DisplayName":"","Description":"目标 net9.0"}},"Description":"项目的目标框架。","DisplayName":"框架","AllowMultipleValues":false},{"Documentation":"是否(通过 \"dotnet pack\")为项目启用打包。","Name":"EnablePack","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否(通过 \"dotnet pack\")为项目启用打包。","DisplayName":"启用包","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"跳过还原","AllowMultipleValues":false},{"Documentation":"在创建的项目文件中设置 LangVersion 属性","Name":"langVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"latest","DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"在创建的项目文件中设置 LangVersion 属性","DisplayName":"语言版本","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.test.projecttemplates.9.0.1.1.0-rtm.24605.1.nupkg","Author":"Microsoft","Classifications":["Test","NUnit","Playwright","Desktop","Web"],"DefaultName":"TestProject1","Description":"一个包含使用 NUnit 测试框架的 Playwright 测试的项目,这些测试可在 Windows、Linux 和 MacOS 上的 .NET 上运行。","Identity":"Microsoft.Test.Playwright.NUnit.CSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Test.Playwright.NUnit","Precedence":11000,"Name":"NUnit Playwright 测试项目","ShortNameList":["nunit-playwright"],"PreferDefaultName":false,"ConfigPlace":"/content/Playwright-NUnit-CSharp/.template.config/template.json","LocaleConfigPlace":"/content/Playwright-NUnit-CSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/Playwright-NUnit-CSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"https://json.schemastore.org/ide.host\",\"icon\":\"ide/icon.ico\",\"tags\":[{\"type\":\"platform\",\"add\":[\"Linux\",\"macOS\",\"Windows\"]}]}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.TestProject1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"替代目标框架","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代目标框架","DisplayName":"目标框架替代","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net9.0":{"DisplayName":"","Description":"目标 net9.0"}},"Description":"项目的目标框架。","DisplayName":"框架","AllowMultipleValues":false},{"Documentation":"是否(通过 \"dotnet pack\")为项目启用打包。","Name":"EnablePack","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否(通过 \"dotnet pack\")为项目启用打包。","DisplayName":"启用包","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"跳过还原","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.test.projecttemplates.9.0.1.1.0-rtm.24605.1.nupkg","Author":"Microsoft","Classifications":["Test","xUnit","Desktop","Web"],"DefaultName":"TestProject1","Description":"一个包含 xUnit.net 测试的项目,这些测试可在 Windows、Linux 和 macOS 的 .NET 上运行","Identity":"Microsoft.Test.xUnit.CSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Test.xUnit","Precedence":11000,"Name":"xUnit 测试项目","ShortNameList":["xunit"],"PreferDefaultName":false,"ConfigPlace":"/content/XUnit-CSharp/.template.config/template.json","LocaleConfigPlace":"/content/XUnit-CSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/XUnit-CSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"https://json.schemastore.org/ide.host\",\"icon\":\"ide/icon.ico\",\"tags\":[{\"type\":\"platform\",\"add\":[\"Linux\",\"macOS\",\"Windows\"]}]}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.TestProject1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"F#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"F#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"替代目标框架","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代目标框架","DisplayName":"目标框架替代","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net9.0":{"DisplayName":"","Description":"目标 net9.0"}},"Description":"项目的目标框架。","DisplayName":"框架","AllowMultipleValues":false},{"Documentation":"是否(通过 \"dotnet pack\")为项目启用打包。","Name":"EnablePack","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否(通过 \"dotnet pack\")为项目启用打包。","DisplayName":"启用包","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"跳过还原","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.test.projecttemplates.9.0.1.1.0-rtm.24605.1.nupkg","Author":"Microsoft","Classifications":["Test","xUnit","Desktop","Web"],"DefaultName":"TestProject1","Description":"一个包含 xUnit.net 测试的项目,这些测试可在 Windows、Linux 和 macOS 的 .NET 上运行","Identity":"Microsoft.Test.xUnit.FSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Test.xUnit","Precedence":11000,"Name":"xUnit 测试项目","ShortNameList":["xunit"],"PreferDefaultName":false,"ConfigPlace":"/content/XUnit-FSharp/.template.config/template.json","LocaleConfigPlace":"/content/XUnit-FSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/XUnit-FSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"F#","type":"project"},"HostData":"{\"$schema\":\"https://json.schemastore.org/ide.host\",\"icon\":\"ide/icon.ico\",\"tags\":[{\"type\":\"platform\",\"add\":[\"Linux\",\"macOS\",\"Windows\"]}]}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.TestProject1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"VB":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"VB","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"替代目标框架","Name":"TargetFrameworkOverride","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代目标框架","DisplayName":"目标框架替代","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net9.0":{"DisplayName":"","Description":"目标 net9.0"}},"Description":"项目的目标框架。","DisplayName":"框架","AllowMultipleValues":false},{"Documentation":"是否(通过 \"dotnet pack\")为项目启用打包。","Name":"EnablePack","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否(通过 \"dotnet pack\")为项目启用打包。","DisplayName":"启用包","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"跳过还原","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.test.projecttemplates.9.0.1.1.0-rtm.24605.1.nupkg","Author":"Microsoft","Classifications":["Test","xUnit","Desktop","Web"],"DefaultName":"TestProject1","Description":"一个包含 xUnit.net 测试的项目,这些测试可在 Windows、Linux 和 macOS 的 .NET 上运行","Identity":"Microsoft.Test.xUnit.VisualBasic.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Test.xUnit","Precedence":11000,"Name":"xUnit 测试项目","ShortNameList":["xunit"],"PreferDefaultName":false,"ConfigPlace":"/content/XUnit-VisualBasic/.template.config/template.json","LocaleConfigPlace":"/content/XUnit-VisualBasic/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/XUnit-VisualBasic/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"project"},"HostData":"{\"$schema\":\"https://json.schemastore.org/ide.host\",\"icon\":\"ide/icon.ico\",\"tags\":[{\"type\":\"platform\",\"add\":[\"Linux\",\"macOS\",\"Windows\"]}]}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"ValueController","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"所生成代码的命名空间","Name":"namespace","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"MyApp.Namespace","DataType":null,"DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"所生成代码的命名空间","DisplayName":"","AllowMultipleValues":false},{"Documentation":"使用读/写操作创建控制器","Name":"actions","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"使用读/写操作创建控制器","DisplayName":"添加读/写操作","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.web.itemtemplates.9.0.9.0.1.nupkg","Author":"Microsoft","Classifications":["Web","ASP.NET"],"DefaultName":"ValueController","Description":"具有或不具有读/写操作的 API 控制器","Identity":"Microsoft.AspNetCore.Mvc.ApiController.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.AspNetCore.Mvc.ApiController","Precedence":9900,"Name":"API 控制器","ShortNameList":["apicontroller"],"PreferDefaultName":false,"ConfigPlace":"/content/ApiController/.template.config/template.json","LocaleConfigPlace":"/content/ApiController/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":null,"PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"HomeController","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"所生成代码的命名空间","Name":"namespace","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"MyApp.Namespace","DataType":null,"DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"所生成代码的命名空间","DisplayName":"","AllowMultipleValues":false},{"Documentation":"使用读/写操作创建控制器","Name":"actions","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"使用读/写操作创建控制器","DisplayName":"添加读/写操作","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.web.itemtemplates.9.0.9.0.1.nupkg","Author":"Microsoft","Classifications":["Web","ASP.NET"],"DefaultName":"HomeController","Description":"具有或不具有读/写操作的 MVC 控制器","Identity":"Microsoft.AspNetCore.Mvc.MvcController.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.AspNetCore.Mvc.MvcController","Precedence":9900,"Name":"MVC 控制器","ShortNameList":["mvccontroller"],"PreferDefaultName":false,"ConfigPlace":"/content/MvcController/.template.config/template.json","LocaleConfigPlace":"/content/MvcController/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":null,"PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"protobuf","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"生成的代码的命名空间","Name":"namespace","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"MyApp.Namespace","DataType":null,"DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"生成的代码的命名空间","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.web.itemtemplates.9.0.9.0.1.nupkg","Author":"Microsoft","Classifications":["Web","gRPC"],"DefaultName":"protobuf","Description":"一个协议缓冲区文件,它用于描述 gRPC 的消息和服务。","Identity":"Microsoft.Web.Grpc.Protobuf.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Web.Grpc.Protobuf","Precedence":9900,"Name":"协议缓冲区文件","ShortNameList":["proto"],"PreferDefaultName":false,"ConfigPlace":"/content/Protobuf/.template.config/template.json","LocaleConfigPlace":"/content/Protobuf/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"","type":"item"},"HostData":null,"PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Component1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.web.itemtemplates.9.0.9.0.1.nupkg","Author":"Microsoft","Classifications":["Web","ASP.NET"],"DefaultName":"Component1","Description":"使用 Razor 实现的可重用 UI 组件","Identity":"Microsoft.AspNetCore.Components.RazorComponent.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.AspNetCore.Components.RazorComponent","Precedence":9900,"Name":"Razor 组件","ShortNameList":["razorcomponent"],"PreferDefaultName":false,"ConfigPlace":"/content/RazorComponent/.template.config/template.json","LocaleConfigPlace":"/content/RazorComponent/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":null,"PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Index","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"生成的代码的命名空间","Name":"namespace","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"MyApp.Namespace","DataType":null,"DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"生成的代码的命名空间","DisplayName":"","AllowMultipleValues":false},{"Documentation":"创建不带 PageModel 的页面","Name":"no-pagemodel","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"创建不带 PageModel 的页面","DisplayName":"排除 PageModel","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.web.itemtemplates.9.0.9.0.1.nupkg","Author":"Microsoft","Classifications":["Web","ASP.NET"],"DefaultName":"Index","Description":"带或不带页面模型的 Razor 页面","Identity":"Microsoft.AspNetCore.Mvc.RazorPage.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.AspNetCore.Mvc.RazorPage","Precedence":9900,"Name":"Razor 页面","ShortNameList":["page"],"PreferDefaultName":false,"ConfigPlace":"/content/RazorPage/.template.config/template.json","LocaleConfigPlace":"/content/RazorPage/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":null,"PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Index","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.web.itemtemplates.9.0.9.0.1.nupkg","Author":"Microsoft","Classifications":["Web","ASP.NET"],"DefaultName":"Index","Description":"空的 Razor 视图","Identity":"Microsoft.AspNetCore.Mvc.RazorView.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.AspNetCore.Mvc.RazorView","Precedence":9900,"Name":"Razor 视图","ShortNameList":["view"],"PreferDefaultName":false,"ConfigPlace":"/content/RazorView/.template.config/template.json","LocaleConfigPlace":"/content/RazorView/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":null,"PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"ignoreme","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"生成的代码的命名空间","Name":"namespace","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"MyApp.Namespace","DataType":null,"DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"生成的代码的命名空间","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.web.itemtemplates.9.0.9.0.1.nupkg","Author":"Microsoft","Classifications":["Web","ASP.NET"],"DefaultName":"_ViewImports","Description":"MVC 视图导入页","Identity":"Microsoft.AspNetCore.Mvc.ViewImports.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.AspNetCore.Mvc.ViewImports","Precedence":9900,"Name":"MVC ViewImports","ShortNameList":["viewimports"],"PreferDefaultName":false,"ConfigPlace":"/content/ViewImports/.template.config/template.json","LocaleConfigPlace":"/content/ViewImports/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":null,"PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"ignoreme","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.web.itemtemplates.9.0.9.0.1.nupkg","Author":"Microsoft","Classifications":["Web","ASP.NET"],"DefaultName":"_ViewStart","Description":"MVC ViewStart 页面","Identity":"Microsoft.AspNetCore.Mvc.ViewStart.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.AspNetCore.Mvc.ViewStart","Precedence":9900,"Name":"MVC ViewStart","ShortNameList":["viewstart"],"PreferDefaultName":false,"ConfigPlace":"/content/ViewStart/.template.config/template.json","LocaleConfigPlace":"/content/ViewStart/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":null,"PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.Application1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"F#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"F#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"是否从生成的模板中排除 launchSettings.json。","Name":"ExcludeLaunchSettings","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否从生成的模板中排除 launchSettings.json。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net9.0":{"DisplayName":"","Description":"Target net9.0"}},"Description":"项目的目标框架。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.web.projecttemplates.9.0.9.0.1.nupkg","Author":"Microsoft","Classifications":["Common","Worker","Web"],"DefaultName":"WorkerService","Description":"用于创建 worker service 的空项目模板。","Identity":"Microsoft.Worker.Empty.FSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Worker.Empty","Precedence":9900,"Name":"辅助角色服务","ShortNameList":["worker"],"PreferDefaultName":false,"ConfigPlace":"/content/Worker-FSharp/.template.config/template.json","LocaleConfigPlace":"/content/Worker-FSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/Worker-FSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"F#","type":"project"},"HostData":"{\"$schema\":\"https://json.schemastore.org/ide.host\",\"order\":300,\"icon\":\"ide/icon.ico\",\"supportsDocker\":true}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025"],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"BlazorWeb-CSharp","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"C#","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"C#":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":"The target framework for the project.","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net9.0":{"DisplayName":"","Description":"Target net9.0"}},"Description":"The target framework for the project.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"The ID to use for secrets (use with Individual auth).","Name":"UserSecretsId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"aspnet-BlazorWeb-CSharp-53bc9b9d-9d6a-45d4-8429-2a2761773502","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The ID to use for secrets (use with Individual auth).","DisplayName":"","AllowMultipleValues":false},{"Documentation":"If specified, skips the automatic restore of the project on create.","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"If specified, skips the automatic restore of the project on create.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Whether to exclude launchSettings.json from the generated template.","Name":"ExcludeLaunchSettings","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Whether to exclude launchSettings.json from the generated template.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Port number to use for the HTTP endpoint in launchSettings.json.","Name":"kestrelHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"Port number to use for the HTTP endpoint in launchSettings.json.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if Individual auth is used).","Name":"kestrelHttpsPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if Individual auth is used).","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Port number to use for the IIS Express HTTP endpoint in launchSettings.json.","Name":"iisHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"Port number to use for the IIS Express HTTP endpoint in launchSettings.json.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if Individual auth is used).","Name":"iisHttpsPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if Individual auth is used).","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Chooses which interactive render mode to use for interactive components","Name":"InteractivityPlatform","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"Server","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"None":{"DisplayName":"None","Description":"No interactivity (static server rendering only)"},"Server":{"DisplayName":"Server","Description":"Runs on the server"},"WebAssembly":{"DisplayName":"WebAssembly","Description":"Runs in the browser using WebAssembly"},"Auto":{"DisplayName":"Auto (Server and WebAssembly)","Description":"Uses Server while downloading WebAssembly assets, then uses WebAssembly"}},"Description":"Chooses which interactive render mode to use for interactive components","DisplayName":"_Interactive render mode","AllowMultipleValues":false},{"Documentation":"Chooses which components will have interactive rendering enabled","Name":"InteractivityLocation","Priority":2,"Precedence":{"PrecedenceDefinition":4,"IsRequiredCondition":null,"IsEnabledCondition":"(InteractivityPlatform != \"None\")","IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"InteractivePerPage","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"InteractivePerPage":{"DisplayName":"Per page/component","Description":"Interactivity is applied on a per-page or per-component basis"},"InteractiveGlobal":{"DisplayName":"Global","Description":"Interactivity is applied at the root level"}},"Description":"Chooses which components will have interactive rendering enabled","DisplayName":"_Interactivity location","AllowMultipleValues":false},{"Documentation":"Configures whether to add sample pages and styling to demonstrate basic usage patterns.","Name":"IncludeSampleContent","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Configures whether to add sample pages and styling to demonstrate basic usage patterns.","DisplayName":"_Include sample pages","AllowMultipleValues":false},{"Documentation":"Configures whether to omit sample pages and styling that demonstrate basic usage patterns.","Name":"Empty","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Configures whether to omit sample pages and styling that demonstrate basic usage patterns.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"The type of authentication to use","Name":"auth","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"None","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"None":{"DisplayName":"","Description":"No authentication"},"Individual":{"DisplayName":"","Description":"Individual authentication"}},"Description":"The type of authentication to use","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual is specified.","Name":"UseLocalDB","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual is specified.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Configures whether to make every page interactive by applying an interactive render mode at the top level. If false, pages will use static server rendering by default, and can be marked interactive on a per-page or per-component basis.","Name":"AllInteractive","Priority":2,"Precedence":{"PrecedenceDefinition":4,"IsRequiredCondition":null,"IsEnabledCondition":"(InteractivityPlatform != \"None\")","IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Configures whether to make every page interactive by applying an interactive render mode at the top level. If false, pages will use static server rendering by default, and can be marked interactive on a per-page or per-component basis.","DisplayName":"_Enable interactive rendering globally throughout the site","AllowMultipleValues":false},{"Documentation":"Whether to turn off HTTPS. This option only applies if Individual isn't used for --auth.","Name":"NoHttps","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Whether to turn off HTTPS. This option only applies if Individual isn't used for --auth.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Whether to generate an explicit Program class and Main method instead of top-level statements.","Name":"UseProgramMain","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Whether to generate an explicit Program class and Main method instead of top-level statements.","DisplayName":"Do not use _top-level statements","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.web.projecttemplates.9.0.9.0.1.nupkg","Author":"Microsoft","Classifications":["Web","Blazor","WebAssembly"],"DefaultName":"BlazorApp","Description":"A project template for creating a Blazor web app that supports both server-side rendering and client interactivity. This template can be used for web apps with rich dynamic user interfaces (UIs).","Identity":"Microsoft.Web.Blazor.CSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Web.Blazor","Precedence":9900,"Name":"Blazor Web App","ShortNameList":["blazor"],"PreferDefaultName":false,"ConfigPlace":"/content/BlazorWeb-CSharp/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/BlazorWeb-CSharp/.template.config/ide.host.json","ThirdPartyNotices":"https://aka.ms/aspnetcore/9.0-third-party-notices","BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"https://json.schemastore.org/ide.host\",\"order\":610,\"icon\":\"ide/icon.ico\",\"disableHttpsSymbol\":\"NoHttps\",\"symbolInfo\":[{\"id\":\"InteractivityPlatform\",\"isVisible\":true,\"persistenceScope\":\"templateGroup\"},{\"id\":\"InteractivityLocation\",\"isVisible\":true,\"persistenceScope\":\"templateGroup\"},{\"id\":\"IncludeSampleContent\",\"isVisible\":true,\"persistenceScope\":\"shared\",\"persistenceScopeName\":\"Microsoft\"},{\"id\":\"UseProgramMain\",\"isVisible\":true,\"persistenceScope\":\"shared\",\"persistenceScopeName\":\"Microsoft\"}]}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"ComponentsWebAssembly-CSharp","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net9.0":{"DisplayName":"","Description":"Target net9.0"}},"Description":"项目的目标框架。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要使用的身份验证类型","Name":"auth","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"None","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"None":{"DisplayName":"","Description":"无身份验证"},"Individual":{"DisplayName":"","Description":"个人身份验证"},"IndividualB2C":{"DisplayName":"","Description":"使用 Azure AD B2C 进行个人身份验证"},"SingleOrg":{"DisplayName":"","Description":"单个租户的组织身份验证"}},"Description":"要使用的身份验证类型","DisplayName":"","AllowMultipleValues":false},{"Documentation":"OIDC 提供程序的颁发机构(与独立个人身份验证一起使用)。","Name":"Authority","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"https://login.microsoftonline.com/","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"OIDC 提供程序的颁发机构(与独立个人身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要连接到的 Azure Active Directory B2C 实例(与 IndividualB2C 身份验证一起使用)。","Name":"AAdB2CInstance","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"https:////aadB2CInstance.b2clogin.com/","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要连接到的 Azure Active Directory B2C 实例(与 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"此项目的登录和注册策略 ID (与 IndividualB2C 身份验证一起使用)。","Name":"SignUpSignInPolicyId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"b2c_1_susi","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"此项目的登录和注册策略 ID (与 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要连接到的 Azure Active Directory 实例(与 SingleOrg 身份验证一起使用)。","Name":"AADInstance","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"https://login.microsoftonline.com/","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要连接到的 Azure Active Directory 实例(与 SingleOrg 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"此项目的客户端 ID (在独立方案中与 IndividualB2C、SingleOrg 或个人身份验证一起使用)。","Name":"ClientId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"33333333-3333-3333-33333333333333333","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"此项目的客户端 ID (在独立方案中与 IndividualB2C、SingleOrg 或个人身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"目录租户的域(与 SingleOrg 或 IndividualB2C 身份验证一起使用)。","Name":"Domain","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"qualified.domain.name","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"目录租户的域(与 SingleOrg 或 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要调用的服务器 API 的应用 ID URI (与 SingleOrg 或 IndividualB2C 身份验证一起使用)。","Name":"AppIDUri","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"api.id.uri","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要调用的服务器 API 的应用 ID URI (与 SingleOrg 或 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"服务器托管的 API 的客户端 ID (与 IndividualB2C、SingleOrg 一起使用)。","Name":"APIClientId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"11111111-1111-1111-11111111111111111","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"服务器托管的 API 的客户端 ID (与 IndividualB2C、SingleOrg 一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"客户端预配访问令牌需要请求的 API 范围。(与 IndividualB2C、SingleOrg 一起使用)。","Name":"DefaultScope","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"access_as_user","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"客户端预配访问令牌需要请求的 API 范围。(与 IndividualB2C、SingleOrg 一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要连接到的目录的 TenantId ID (与 SingleOrg 身份验证一起使用)。","Name":"TenantId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"22222222-2222-2222-2222-222222222222","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要连接到的目录的 TenantId ID (与 SingleOrg 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否允许此应用程序对目录进行读取访问(仅适用于 SingleOrg)。","Name":"OrgReadAccess","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否允许此应用程序对目录进行读取访问(仅适用于 SingleOrg)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"用于机密的 ID (与 OrgReadAccess 或个人身份验证一起使用)。","Name":"UserSecretsId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"aspnet-BlazorServerWeb-CSharp-53bc9b9d-9d6a-45d4-8429-2a2761773502","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"用于机密的 ID (与 OrgReadAccess 或个人身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否从生成的模板中排除 launchSettings.json。","Name":"ExcludeLaunchSettings","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否从生成的模板中排除 launchSettings.json。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 HTTP 终结点的端口号。","Name":"kestrelHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 HTTP 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。","Name":"kestrelHttpsPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。","Name":"iisHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。","Name":"iisHttpsPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"如果指定,则生成支持安装和脱机使用的渐进式 Web 应用程序(PWA)。","Name":"PWA","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则生成支持安装和脱机使用的渐进式 Web 应用程序(PWA)。","DisplayName":"渐进式 Web 应用程序(_P)","AllowMultipleValues":false},{"Documentation":"配置是否添加示例页和样式以演示基本使用模式。","Name":"IncludeSampleContent","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"配置是否添加示例页和样式以演示基本使用模式。","DisplayName":"包含示例页(_I)","AllowMultipleValues":false},{"Documentation":"配置是否忽略演示基本使用模式的示例页和样式。","Name":"Empty","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"配置是否忽略演示基本使用模式的示例页和样式。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否禁用 HTTPS。仅当 Individual、IndividualB2C、SingleOrg 或 MultiOrg 不用于 --auth 时,此选项才适用。","Name":"NoHttps","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否禁用 HTTPS。仅当 Individual、IndividualB2C、SingleOrg 或 MultiOrg 不用于 --auth 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否使用 LocalDB 而不是 SQLite。仅当指定了 --auth Individual 或 --auth IndividualB2C 时,此选项才适用。","Name":"UseLocalDB","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否使用 LocalDB 而不是 SQLite。仅当指定了 --auth Individual 或 --auth IndividualB2C 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要从 Web 应用调用的 API 的 URL。仅当指定了 --auth SingleOrg、--auth MultiOrg 或不带 ASP.NET Core 主机的 --auth IndividualB2C 时,此选项才适用。","Name":"CalledApiUrl","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"https://graph.microsoft.com/v1.0","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要从 Web 应用调用的 API 的 URL。仅当指定了 --auth SingleOrg、--auth MultiOrg 或不带 ASP.NET Core 主机的 --auth IndividualB2C 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"请求从 Web 应用调用 API 的范围。仅当指定了 --auth SingleOrg、--auth MultiOrg 或不带 ASP.NET Core 主机的 --auth IndividualB2C 时,此选项才适用。","Name":"CalledApiScopes","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"user.read","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"请求从 Web 应用调用 API 的范围。仅当指定了 --auth SingleOrg、--auth MultiOrg 或不带 ASP.NET Core 主机的 --auth IndividualB2C 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否生成显式程序类和主方法,而不是顶级语句。","Name":"UseProgramMain","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否生成显式程序类和主方法,而不是顶级语句。","DisplayName":"不使用顶级语句(_T)","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.web.projecttemplates.9.0.9.0.1.nupkg","Author":"Microsoft","Classifications":["Web","Blazor","WebAssembly","PWA"],"DefaultName":"BlazorApp","Description":"用于创建在 WebAssembly 上运行的 Blazor 应用的项目模板。此模板可用于具有丰富动态用户界面(UI)的 Web 应用。","Identity":"Microsoft.Web.Blazor.Wasm.CSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Web.Blazor.Wasm","Precedence":9900,"Name":"Blazor WebAssembly 独立应用","ShortNameList":["blazorwasm"],"PreferDefaultName":false,"ConfigPlace":"/content/ComponentsWebAssembly-CSharp/.template.config/template.json","LocaleConfigPlace":"/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/ComponentsWebAssembly-CSharp/.template.config/ide.host.json","ThirdPartyNotices":"https://aka.ms/aspnetcore/9.0-third-party-notices","BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"https://json.schemastore.org/ide.host\",\"order\":610,\"icon\":\"ide/icon.ico\",\"disableHttpsSymbol\":\"NoHttps\",\"symbolInfo\":[{\"id\":\"PWA\",\"isVisible\":true,\"persistenceScope\":\"templateGroup\"},{\"id\":\"UseProgramMain\",\"isVisible\":true,\"persistenceScope\":\"shared\",\"persistenceScopeName\":\"Microsoft\"},{\"id\":\"IncludeSampleContent\",\"isVisible\":true,\"persistenceScope\":\"shared\",\"persistenceScopeName\":\"Microsoft\"}]}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.WebApplication1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"是否从生成的模板中排除 launchSettings.json。","Name":"ExcludeLaunchSettings","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否从生成的模板中排除 launchSettings.json。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 HTTP 终结点的端口号。","Name":"kestrelHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 HTTP 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。","Name":"kestrelHttpsPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。","Name":"iisHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。","Name":"iisHttpsPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net9.0":{"DisplayName":"","Description":"Target net9.0"}},"Description":"项目的目标框架。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否禁用 HTTPS。仅当 Individual、IndividualB2C、SingleOrg 或 MultiOrg 不用于 --auth 时,此选项才适用。","Name":"NoHttps","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否禁用 HTTPS。仅当 Individual、IndividualB2C、SingleOrg 或 MultiOrg 不用于 --auth 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否生成显式程序类和主方法,而不是顶级语句。","Name":"UseProgramMain","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否生成显式程序类和主方法,而不是顶级语句。","DisplayName":"不使用顶级语句(_T)","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.web.projecttemplates.9.0.9.0.1.nupkg","Author":"Microsoft","Classifications":["Web","Empty"],"DefaultName":"WebApplication","Description":"用于创建 ASP.NET Core 应用程序的空项目模板。此模板中没有任何内容。","Identity":"Microsoft.Web.Empty.CSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Web.Empty","Precedence":9900,"Name":"ASP.NET Core 空","ShortNameList":["web"],"PreferDefaultName":false,"ConfigPlace":"/content/EmptyWeb-CSharp/.template.config/template.json","LocaleConfigPlace":"/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/EmptyWeb-CSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"https://json.schemastore.org/ide.host\",\"order\":100,\"icon\":\"ide/icon.ico\",\"supportsDocker\":true,\"symbolInfo\":[{\"id\":\"UseProgramMain\",\"isVisible\":true,\"persistenceScope\":\"shared\",\"persistenceScopeName\":\"Microsoft\"}],\"disableHttpsSymbol\":\"NoHttps\"}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.WebApplication1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"F#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"F#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"是否从生成的模板中排除 launchSettings.json。","Name":"ExcludeLaunchSettings","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否从生成的模板中排除 launchSettings.json。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 HTTP 终结点的端口号。","Name":"kestrelHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 HTTP 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。","Name":"kestrelHttpsPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。","Name":"iisHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。","Name":"iisHttpsPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net9.0":{"DisplayName":"","Description":"Target net9.0"}},"Description":"项目的目标框架。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否禁用 HTTPS。仅当 Individual、IndividualB2C、SingleOrg 或 MultiOrg 不用于 --auth 时,此选项才适用。","Name":"NoHttps","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否禁用 HTTPS。仅当 Individual、IndividualB2C、SingleOrg 或 MultiOrg 不用于 --auth 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.web.projecttemplates.9.0.9.0.1.nupkg","Author":"Microsoft","Classifications":["Web","Empty"],"DefaultName":"WebApplication","Description":"用于创建 ASP.NET Core 应用程序的空项目模板。此模板中没有任何内容。","Identity":"Microsoft.Web.Empty.FSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Web.Empty","Precedence":9900,"Name":"ASP.NET Core 空","ShortNameList":["web"],"PreferDefaultName":false,"ConfigPlace":"/content/EmptyWeb-FSharp/.template.config/template.json","LocaleConfigPlace":"/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/EmptyWeb-FSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"F#","type":"project"},"HostData":"{\"$schema\":\"https://json.schemastore.org/ide.host\",\"order\":101,\"icon\":\"ide/icon.ico\",\"supportsDocker\":true,\"disableHttpsSymbol\":\"NoHttps\"}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"GrpcService-CSharp","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net9.0":{"DisplayName":"","Description":"Target net9.0"}},"Description":"项目的目标框架。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否从生成的模板中排除 launchSettings.json。","Name":"ExcludeLaunchSettings","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否从生成的模板中排除 launchSettings.json。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 HTTP 终结点的端口号。","Name":"kestrelHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 HTTP 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。","Name":"kestrelHttpsPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否生成显式程序类和主方法,而不是顶级语句。","Name":"UseProgramMain","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否生成显式程序类和主方法,而不是顶级语句。","DisplayName":"不使用顶级语句(_T)","AllowMultipleValues":false},{"Documentation":"是否启用将项目以 native AOT 发布。","Name":"NativeAot","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否启用将项目以 native AOT 发布。","DisplayName":"启用 native AOT 发布(_N)","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.web.projecttemplates.9.0.9.0.1.nupkg","Author":"Microsoft","Classifications":["Web","gRPC","API","Service"],"DefaultName":"GrpcService","Description":"用于使用 ASP.NET Core 创建 gRPC 服务的项目模板,可选择支持发布为 native AOT。","Identity":"Microsoft.Grpc.Service.CSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Web.Grpc","Precedence":9900,"Name":"ASP.NET Core gRPC 服务","ShortNameList":["grpc"],"PreferDefaultName":false,"ConfigPlace":"/content/GrpcService-CSharp/.template.config/template.json","LocaleConfigPlace":"/content/GrpcService-CSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/GrpcService-CSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"https://json.schemastore.org/ide.host\",\"order\":500,\"icon\":\"ide/icon.ico\",\"supportsDocker\":true,\"symbolInfo\":[{\"id\":\"UseProgramMain\",\"isVisible\":true,\"persistenceScope\":\"shared\",\"persistenceScopeName\":\"Microsoft\"},{\"id\":\"NativeAot\",\"isVisible\":true}]}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.RazorClassLibrary1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net9.0":{"DisplayName":"","Description":"Target net9.0"}},"Description":"项目的目标框架。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否支持将传统的 Razor Pages 和视图添加到此库。","Name":"SupportPagesAndViews","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否支持将传统的 Razor Pages 和视图添加到此库。","DisplayName":"支持页面和视图","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.web.projecttemplates.9.0.9.0.1.nupkg","Author":"Microsoft","Classifications":["Web","Razor","Library"],"DefaultName":"RazorClassLibrary","Description":"用于创建目标为 .NET 的 Razor 类库的项目","Identity":"Microsoft.Web.Razor.Library.CSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Web.Razor","Precedence":9900,"Name":"Razor 类库","ShortNameList":["razorclasslib"],"PreferDefaultName":false,"ConfigPlace":"/content/RazorClassLibrary-CSharp/.template.config/template.json","LocaleConfigPlace":"/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/RazorClassLibrary-CSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"https://json.schemastore.org/ide.host\",\"order\":700,\"icon\":\"ide/RazorClassLibrary.ico\",\"symbolInfo\":[{\"id\":\"SupportPagesAndViews\",\"isVisible\":true,\"persistenceScope\":\"templateGroup\"}]}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025","84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.WebApplication1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"要使用的身份验证类型","Name":"auth","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"None","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"None":{"DisplayName":"","Description":"无身份验证"},"Individual":{"DisplayName":"","Description":"个人身份验证"},"IndividualB2C":{"DisplayName":"","Description":"使用 Azure AD B2C 进行个人身份验证"},"SingleOrg":{"DisplayName":"","Description":"单个租户的组织身份验证"},"MultiOrg":{"DisplayName":"","Description":"多个租户的组织身份验证"},"Windows":{"DisplayName":"","Description":"Windows 身份验证"}},"Description":"要使用的身份验证类型","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要连接到的 Azure Active Directory B2C 实例(与 IndividualB2C 身份验证一起使用)。","Name":"AAdB2CInstance","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"https://login.microsoftonline.com/tfp/","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要连接到的 Azure Active Directory B2C 实例(与 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"此项目的登录和注册策略 ID (与 IndividualB2C 身份验证一起使用)。","Name":"SignUpSignInPolicyId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"b2c_1_susi","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"此项目的登录和注册策略 ID (与 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"全局注销回调(与 IndividualB2C 身份验证一起使用)。","Name":"SignedOutCallbackPath","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"/signout/B2C_1_susi","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"全局注销回调(与 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"此项目的重置密码策略 ID (与 IndividualB2C 身份验证一起使用)。","Name":"ResetPasswordPolicyId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"b2c_1_reset","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"此项目的重置密码策略 ID (与 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"此项目的编辑配置文件策略 ID (与 IndividualB2C 身份验证一起使用)。","Name":"EditProfilePolicyId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"b2c_1_edit_profile","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"此项目的编辑配置文件策略 ID (与 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要连接到的 Azure Active Directory 实例(与 SingleOrg 或 MultiOrg 身份验证一起使用)。","Name":"AADInstance","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"https://login.microsoftonline.com/","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要连接到的 Azure Active Directory 实例(与 SingleOrg 或 MultiOrg 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"此项目的客户端 ID (与 IndividualB2C、SingleOrg 或 MultiOrg 身份验证一起使用)。","Name":"ClientId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"11111111-1111-1111-11111111111111111","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"此项目的客户端 ID (与 IndividualB2C、SingleOrg 或 MultiOrg 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"目录租户的域(与 SingleOrg 或 IndividualB2C 身份验证一起使用)。","Name":"Domain","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"qualified.domain.name","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"目录租户的域(与 SingleOrg 或 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要连接到的目录的 TenantId ID (与 SingleOrg 身份验证一起使用)。","Name":"TenantId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"22222222-2222-2222-2222-222222222222","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要连接到的目录的 TenantId ID (与 SingleOrg 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"重定向 URI 的应用程序基路径内的请求路径(与 SingleOrg 或 IndividualB2C 身份验证一起使用)。","Name":"CallbackPath","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"/signin-oidc","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"重定向 URI 的应用程序基路径内的请求路径(与 SingleOrg 或 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否允许此应用程序对目录进行读取访问(仅适用于 SingleOrg 或 MultiOrg 身份验证)。","Name":"OrgReadAccess","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否允许此应用程序对目录进行读取访问(仅适用于 SingleOrg 或 MultiOrg 身份验证)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"用于机密的 ID (与 OrgReadAccess 或个人身份验证一起使用)。","Name":"UserSecretsId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"aspnet-Company.WebApplication1-53bc9b9d-9d6a-45d4-8429-2a2761773502","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"用于机密的 ID (与 OrgReadAccess 或个人身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否在生成的模板中排除 launchSettings.json。","Name":"ExcludeLaunchSettings","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否在生成的模板中排除 launchSettings.json。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 HTTP 终结点的端口号。","Name":"kestrelHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 HTTP 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualB2C 或 OrganizationalAuth,则将忽略 no-https)。","Name":"kestrelHttpsPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualB2C 或 OrganizationalAuth,则将忽略 no-https)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。","Name":"iisHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualB2C 或 OrganizationalAuth,则将忽略 no-https)。","Name":"iisHttpsPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualB2C 或 OrganizationalAuth,则将忽略 no-https)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否禁用 HTTPS。仅当 IndividualB2C、SingleOrg 或 MultiOrg 不用于 --auth 时,此选项才适用。","Name":"NoHttps","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否禁用 HTTPS。仅当 IndividualB2C、SingleOrg 或 MultiOrg 不用于 --auth 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否使用 LocalDB 而不是 SQLite。仅当指定了 --auth Individual 或 --auth IndividualB2C 时,此选项才适用。","Name":"UseLocalDB","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否使用 LocalDB 而不是 SQLite。仅当指定了 --auth Individual 或 --auth IndividualB2C 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net9.0":{"DisplayName":"","Description":"Target net9.0"}},"Description":"项目的目标框架。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要从 Web 应用调用的 API 的 URL。仅当指定了 --auth SingleOrg、--auth MultiOrg 或 --auth IndividualB2C 时,此选项才适用。","Name":"CalledApiUrl","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"https://graph.microsoft.com/v1.0","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要从 Web 应用调用的 API 的 URL。仅当指定了 --auth SingleOrg、--auth MultiOrg 或 --auth IndividualB2C 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"指定 Web 应用是否调用 Microsoft Graph。仅当指定了 --auth SingleOrg 或 --auth MultiOrg 时,此选项才适用。","Name":"CallsMicrosoftGraph","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"指定 Web 应用是否调用 Microsoft Graph。仅当指定了 --auth SingleOrg 或 --auth MultiOrg 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"请求从 Web 应用调用 API 的范围。仅当指定了 --auth SingleOrg、--auth MultiOrg 或 --auth IndividualB2C 时,此选项才适用。","Name":"CalledApiScopes","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"user.read","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"请求从 Web 应用调用 API 的范围。仅当指定了 --auth SingleOrg、--auth MultiOrg 或 --auth IndividualB2C 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否生成显式程序类和主方法,而不是顶级语句。","Name":"UseProgramMain","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否生成显式程序类和主方法,而不是顶级语句。","DisplayName":"不使用顶级语句(_T)","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.web.projecttemplates.9.0.9.0.1.nupkg","Author":"Microsoft","Classifications":["Web","MVC","Razor Pages"],"DefaultName":"WebApplication","Description":"用于创建包含示例 ASP.NET Core Razor Pages 内容的 ASP.NET Core 应用程序的项目模板","Identity":"Microsoft.Web.RazorPages.CSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Web.RazorPages","Precedence":9900,"Name":"ASP.NET Core Web 应用","ShortNameList":["webapp","razor"],"PreferDefaultName":false,"ConfigPlace":"/content/RazorPagesWeb-CSharp/.template.config/template.json","LocaleConfigPlace":"/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/RazorPagesWeb-CSharp/.template.config/ide.host.json","ThirdPartyNotices":"https://aka.ms/aspnetcore/9.0-third-party-notices","BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"https://json.schemastore.org/ide.host\",\"order\":400,\"icon\":\"ide/icon.ico\",\"supportsDocker\":true,\"symbolInfo\":[{\"id\":\"UseProgramMain\",\"isVisible\":true,\"persistenceScope\":\"shared\",\"persistenceScopeName\":\"Microsoft\"}],\"disableHttpsSymbol\":\"NoHttps\"}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.WebApplication1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"要使用的身份验证类型","Name":"auth","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"None","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"None":{"DisplayName":"","Description":"无身份验证"},"Individual":{"DisplayName":"","Description":"个人身份验证"},"IndividualB2C":{"DisplayName":"","Description":"使用 Azure AD B2C 进行个人身份验证"},"SingleOrg":{"DisplayName":"","Description":"单个租户的组织身份验证"},"MultiOrg":{"DisplayName":"","Description":"多个租户的组织身份验证"},"Windows":{"DisplayName":"","Description":"Windows 身份验证"}},"Description":"要使用的身份验证类型","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要连接到的 Azure Active Directory B2C 实例(与 IndividualB2C 身份验证一起使用)。","Name":"AAdB2CInstance","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"https://login.microsoftonline.com/tfp/","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要连接到的 Azure Active Directory B2C 实例(与 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"此项目的登录和注册策略 ID (与 IndividualB2C 身份验证一起使用)。","Name":"SignUpSignInPolicyId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"b2c_1_susi","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"此项目的登录和注册策略 ID (与 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"全局注销回调(与 IndividualB2C 身份验证一起使用)。","Name":"SignedOutCallbackPath","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"/signout/B2C_1_susi","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"全局注销回调(与 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"此项目的重置密码策略 ID (与 IndividualB2C 身份验证一起使用)。","Name":"ResetPasswordPolicyId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"b2c_1_reset","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"此项目的重置密码策略 ID (与 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"此项目的编辑配置文件策略 ID (与 IndividualB2C 身份验证一起使用)。","Name":"EditProfilePolicyId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"b2c_1_edit_profile","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"此项目的编辑配置文件策略 ID (与 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要连接到的 Azure Active Directory 实例(与 SingleOrg 或 MultiOrg 身份验证一起使用)。","Name":"AADInstance","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"https://login.microsoftonline.com/","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要连接到的 Azure Active Directory 实例(与 SingleOrg 或 MultiOrg 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"此项目的客户端 ID (与 IndividualB2C、SingleOrg 或 MultiOrg 身份验证一起使用)。","Name":"ClientId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"11111111-1111-1111-11111111111111111","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"此项目的客户端 ID (与 IndividualB2C、SingleOrg 或 MultiOrg 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"目录租户的域(与 SingleOrg 或 IndividualB2C 身份验证一起使用)。","Name":"Domain","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"qualified.domain.name","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"目录租户的域(与 SingleOrg 或 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要连接到的目录的 TenantId ID (与 SingleOrg 身份验证一起使用)。","Name":"TenantId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"22222222-2222-2222-2222-222222222222","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要连接到的目录的 TenantId ID (与 SingleOrg 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"重定向 URI 的应用程序基路径内的请求路径(与 SingleOrg 或 IndividualB2C 身份验证一起使用)。","Name":"CallbackPath","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"/signin-oidc","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"重定向 URI 的应用程序基路径内的请求路径(与 SingleOrg 或 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否允许此应用程序对目录进行读取访问(仅适用于 SingleOrg 或 MultiOrg 身份验证)。","Name":"OrgReadAccess","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否允许此应用程序对目录进行读取访问(仅适用于 SingleOrg 或 MultiOrg 身份验证)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"用于机密的 ID (与 OrgReadAccess 或个人身份验证一起使用)。","Name":"UserSecretsId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"aspnet-Company.WebApplication1-53bc9b9d-9d6a-45d4-8429-2a2761773502","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"用于机密的 ID (与 OrgReadAccess 或个人身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否从生成的模板中排除 launchSettings.json。","Name":"ExcludeLaunchSettings","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否从生成的模板中排除 launchSettings.json。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 HTTP 终结点的端口号。","Name":"kestrelHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 HTTP 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualB2C 或 OrganizationalAuth,则将忽略 no-https)。","Name":"kestrelHttpsPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualB2C 或 OrganizationalAuth,则将忽略 no-https)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。","Name":"iisHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualB2C 或 OrganizationalAuth,则将忽略 no-https)。","Name":"iisHttpsPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualB2C 或 OrganizationalAuth,则将忽略 no-https)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否禁用 HTTPS。仅当 IndividualB2C、SingleOrg 或 MultiOrg 不用于 --auth 时,此选项才适用。","Name":"NoHttps","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否禁用 HTTPS。仅当 IndividualB2C、SingleOrg 或 MultiOrg 不用于 --auth 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否使用 LocalDB 而不是 SQLite。仅当指定了 --auth Individual 或 --auth IndividualB2C 时,此选项才适用。","Name":"UseLocalDB","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否使用 LocalDB 而不是 SQLite。仅当指定了 --auth Individual 或 --auth IndividualB2C 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net9.0":{"DisplayName":"","Description":"Target net9.0"}},"Description":"项目的目标框架。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要从 Web 应用调用的 API 的 URL。仅当指定了 --auth SingleOrg、--auth MultiOrg 或 --auth IndividualB2C 时,此选项才适用。","Name":"CalledApiUrl","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"https://graph.microsoft.com/v1.0","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要从 Web 应用调用的 API 的 URL。仅当指定了 --auth SingleOrg、--auth MultiOrg 或 --auth IndividualB2C 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"指定 Web 应用是否调用 Microsoft Graph。仅当指定了 --auth SingleOrg 或 --auth MultiOrg 时,此选项才适用。","Name":"CallsMicrosoftGraph","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"指定 Web 应用是否调用 Microsoft Graph。仅当指定了 --auth SingleOrg 或 --auth MultiOrg 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"请求从 Web 应用调用 API 的范围。仅当指定了 --auth SingleOrg、--auth MultiOrg 或 --auth IndividualB2C 时,此选项才适用。","Name":"CalledApiScopes","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"user.read","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"请求从 Web 应用调用 API 的范围。仅当指定了 --auth SingleOrg、--auth MultiOrg 或 --auth IndividualB2C 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否生成显式程序类和主方法,而不是顶级语句。","Name":"UseProgramMain","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否生成显式程序类和主方法,而不是顶级语句。","DisplayName":"不使用顶级语句(_T)","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.web.projecttemplates.9.0.9.0.1.nupkg","Author":"Microsoft","Classifications":["Web","MVC"],"DefaultName":"WebApplication","Description":"用于创建包含示例 ASP.NET Core MVC 视图和控制器的 ASP.NET Core 应用程序的项目模板。此模板还可以用于 RESTful HTTP 服务。","Identity":"Microsoft.Web.Mvc.CSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Web.Mvc","Precedence":9900,"Name":"ASP.NET Core Web 应用(模型-视图-控制器)","ShortNameList":["mvc"],"PreferDefaultName":false,"ConfigPlace":"/content/StarterWeb-CSharp/.template.config/template.json","LocaleConfigPlace":"/content/StarterWeb-CSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/StarterWeb-CSharp/.template.config/ide.host.json","ThirdPartyNotices":"https://aka.ms/aspnetcore/9.0-third-party-notices","BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"https://json.schemastore.org/ide.host\",\"order\":410,\"icon\":\"ide/icon.ico\",\"supportsDocker\":true,\"symbolInfo\":[{\"id\":\"UseProgramMain\",\"isVisible\":true,\"persistenceScope\":\"shared\",\"persistenceScopeName\":\"Microsoft\"}],\"disableHttpsSymbol\":\"NoHttps\"}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.WebApplication1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"F#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"F#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"是否从生成的模板中排除 launchSettings.json。","Name":"ExcludeLaunchSettings","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否从生成的模板中排除 launchSettings.json。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 HTTP 终结点的端口号。","Name":"kestrelHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 HTTP 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。","Name":"kestrelHttpsPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。","Name":"iisHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。","Name":"iisHttpsPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net9.0":{"DisplayName":"","Description":"Target net9.0"}},"Description":"项目的目标框架。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否禁用 HTTPS。仅当 Individual、IndividualB2C、SingleOrg 或 MultiOrg 不用于 --auth 时,此选项才适用。","Name":"NoHttps","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否禁用 HTTPS。仅当 Individual、IndividualB2C、SingleOrg 或 MultiOrg 不用于 --auth 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.web.projecttemplates.9.0.9.0.1.nupkg","Author":"Microsoft","Classifications":["Web","MVC"],"DefaultName":"WebApplication","Description":"用于创建包含示例 ASP.NET Core MVC 视图和控制器的 ASP.NET Core 应用程序的项目模板。此模板还可以用于 RESTful HTTP 服务。","Identity":"Microsoft.Web.Mvc.FSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Web.Mvc","Precedence":9900,"Name":"ASP.NET Core Web 应用(模型-视图-控制器)","ShortNameList":["mvc"],"PreferDefaultName":false,"ConfigPlace":"/content/StarterWeb-FSharp/.template.config/template.json","LocaleConfigPlace":"/content/StarterWeb-FSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":"https://aka.ms/aspnetcore/9.0-third-party-notices","BaselineInfo":{},"TagsCollection":{"language":"F#","type":"project"},"HostData":null,"PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.WebApplication1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"要使用的身份验证类型","Name":"auth","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"None","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"None":{"DisplayName":"","Description":"无身份验证"},"IndividualB2C":{"DisplayName":"","Description":"使用 Azure AD B2C 进行个人身份验证"},"SingleOrg":{"DisplayName":"","Description":"单个租户的组织身份验证"},"Windows":{"DisplayName":"","Description":"Windows 身份验证"}},"Description":"要使用的身份验证类型","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要连接到的 Azure Active Directory B2C 实例(与 IndividualB2C 身份验证一起使用)。","Name":"AAdB2CInstance","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"https://qualified.domain.name.b2clogin.com/","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要连接到的 Azure Active Directory B2C 实例(与 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"此项目的登录和注册策略 ID (与 IndividualB2C 身份验证一起使用)。","Name":"SignUpSignInPolicyId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"b2c_1_susi","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"此项目的登录和注册策略 ID (与 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要连接到的 Azure Active Directory 实例(与 SingleOrg 身份验证一起使用)。","Name":"AADInstance","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"https://login.microsoftonline.com/","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要连接到的 Azure Active Directory 实例(与 SingleOrg 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"此项目的客户端 ID (与 SingleOrg 或 IndividualB2C 身份验证一起使用)。","Name":"ClientId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"11111111-1111-1111-11111111111111111","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"此项目的客户端 ID (与 SingleOrg 或 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"目录租户的域(与 SingleOrg 或 IndividualB2C 身份验证一起使用)。","Name":"Domain","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"qualified.domain.name","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"目录租户的域(与 SingleOrg 或 IndividualB2C 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"客户端预配访问令牌需要请求的 API 范围。(与 IndividualB2C、SingleOrg 一起使用)。","Name":"DefaultScope","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"access_as_user","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"客户端预配访问令牌需要请求的 API 范围。(与 IndividualB2C、SingleOrg 一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要连接到的目录的 TenantId ID (与 SingleOrg 身份验证一起使用)。","Name":"TenantId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"22222222-2222-2222-2222-222222222222","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要连接到的目录的 TenantId ID (与 SingleOrg 身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否允许此应用程序对目录进行读取访问(仅适用于 SingleOrg 身份验证)。","Name":"OrgReadAccess","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否允许此应用程序对目录进行读取访问(仅适用于 SingleOrg 身份验证)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"用于机密的 ID (与 OrgReadAccess 或个人身份验证一起使用)。","Name":"UserSecretsId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"aspnet-Company.WebApplication1-53bc9b9d-9d6a-45d4-8429-2a2761773502","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"用于机密的 ID (与 OrgReadAccess 或个人身份验证一起使用)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否在生成的模板中排除 launchSettings.json。","Name":"ExcludeLaunchSettings","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否在生成的模板中排除 launchSettings.json。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 HTTP 终结点的端口号。","Name":"kestrelHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 HTTP 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualB2C 或 OrganizationalAuth,则将忽略 no-https)。","Name":"kestrelHttpsPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualB2C 或 OrganizationalAuth,则将忽略 no-https)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。","Name":"iisHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualB2C 或 OrganizationalAuth,则将忽略 no-https)。","Name":"iisHttpsPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualB2C 或 OrganizationalAuth,则将忽略 no-https)。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否禁用 HTTPS。仅当 IndividualB2C、SingleOrg 或 MultiOrg 不用于 --auth 时,此选项才适用。","Name":"NoHttps","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否禁用 HTTPS。仅当 IndividualB2C、SingleOrg 或 MultiOrg 不用于 --auth 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否使用 LocalDB 而不是 SQLite。仅当指定了 --auth Individual 或 --auth IndividualB2C 时,此选项才适用。","Name":"UseLocalDB","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否使用 LocalDB 而不是 SQLite。仅当指定了 --auth Individual 或 --auth IndividualB2C 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net9.0":{"DisplayName":"","Description":"Target net9.0"}},"Description":"项目的目标框架。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要从 Web 应用调用的 API 的 URL。仅当指定了 --auth SingleOrg 或 --auth IndividualB2C 时,此选项才适用。","Name":"CalledApiUrl","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"https://graph.microsoft.com/v1.0","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要从 Web 应用调用的 API 的 URL。仅当指定了 --auth SingleOrg 或 --auth IndividualB2C 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"指定 Web 应用是否调用 Microsoft Graph。仅当指定了 --auth SingleOrg 时,此选项才适用。","Name":"CallsMicrosoftGraph","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"指定 Web 应用是否调用 Microsoft Graph。仅当指定了 --auth SingleOrg 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"请求从 Web 应用调用 API 的范围。仅当指定了 --auth SingleOrg 或 --auth IndividualB2C 时,此选项才适用。","Name":"CalledApiScopes","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"user.read","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"请求从 Web 应用调用 API 的范围。仅当指定了 --auth SingleOrg 或 --auth IndividualB2C 时,此选项才适用。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"禁用 OpenAI (Swagger)支持","Name":"DisableOpenAPI","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"禁用 OpenAI (Swagger)支持","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否生成显式程序类和主方法,而不是顶级语句。","Name":"UseProgramMain","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否生成显式程序类和主方法,而不是顶级语句。","DisplayName":"不使用顶级语句(_T)","AllowMultipleValues":false},{"Documentation":"是否使用最小 API 而不是控制器。","Name":"UseMinimalAPIs","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否使用最小 API 而不是控制器。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否使用控制器而不是最小 API。此选项替代指定的值,即“最小”。","Name":"UseControllers","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否使用控制器而不是最小 API。此选项替代指定的值,即“最小”。","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.web.projecttemplates.9.0.9.0.1.nupkg","Author":"Microsoft","Classifications":["Web","Web API","API","Service"],"DefaultName":"WebApplication","Description":"用于使用 ASP.NET Core 控制器或最小 API 创建 RESTful Web API 的项目模板,可选择支持 OpenAPI 和身份验证。","Identity":"Microsoft.Web.WebApi.CSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Web.WebApi","Precedence":9900,"Name":"ASP.NET Core Web API","ShortNameList":["webapi"],"PreferDefaultName":false,"ConfigPlace":"/content/WebApi-CSharp/.template.config/template.json","LocaleConfigPlace":"/content/WebApi-CSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/WebApi-CSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"https://json.schemastore.org/ide.host\",\"order\":200,\"icon\":\"ide/icon.ico\",\"supportsDocker\":true,\"symbolInfo\":[{\"id\":\"DisableOpenAPI\",\"name\":{\"text\":\"Enable _OpenAPI support\",\"overrideDefaultText\":true},\"description\":{\"text\":\"Enables OpenAPI (Swagger) support\",\"overrideDefaultText\":true},\"invertBoolean\":true,\"isVisible\":true,\"defaultValue\":\"true\",\"persistenceScope\":\"templateGroup\"},{\"id\":\"UseProgramMain\",\"isVisible\":true,\"persistenceScope\":\"shared\",\"persistenceScopeName\":\"Microsoft\"},{\"id\":\"UseMinimalAPIs\",\"name\":{\"text\":\"Use controllers\",\"overrideDefaultText\":true},\"description\":{\"text\":\"Use controllers instead of minimal APIs.\",\"overrideDefaultText\":true},\"invertBoolean\":true,\"isVisible\":true,\"persistenceScope\":\"templateGroup\"}],\"disableHttpsSymbol\":\"NoHttps\"}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.WebApplication1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"F#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"F#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"是否从生成的模板中排除 launchSettings.json。","Name":"ExcludeLaunchSettings","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否从生成的模板中排除 launchSettings.json。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 HTTP 终结点的端口号。","Name":"kestrelHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 HTTP 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 HTTPS 终结点的端口号。","Name":"kestrelHttpsPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 HTTPS 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。","Name":"iisHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。","Name":"iisHttpsPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net9.0":{"DisplayName":"","Description":"Target net9.0"}},"Description":"项目的目标框架。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否禁用 HTTPS。","Name":"NoHttps","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否禁用 HTTPS。","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.web.projecttemplates.9.0.9.0.1.nupkg","Author":"Microsoft","Classifications":["Web","Web API"],"DefaultName":"WebApplication","Description":"用于创建包含 RESTful HTTP 服务示例控制器的 ASP.NET Core 应用程序的项目模板。此模板还可以用于 ASP.NET Core MVC 视图和控制器。","Identity":"Microsoft.Web.WebApi.FSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Web.WebApi","Precedence":9900,"Name":"ASP.NET Core Web API","ShortNameList":["webapi"],"PreferDefaultName":false,"ConfigPlace":"/content/WebApi-FSharp/.template.config/template.json","LocaleConfigPlace":"/content/WebApi-FSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/WebApi-FSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"F#","type":"project"},"HostData":"{\"$schema\":\"https://json.schemastore.org/ide.host\",\"order\":201,\"icon\":\"ide/icon.ico\",\"supportsDocker\":true,\"disableHttpsSymbol\":\"NoHttps\"}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.WebApplication1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"是否从生成的模板中排除 launchSettings.json。","Name":"ExcludeLaunchSettings","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否从生成的模板中排除 launchSettings.json。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 HTTP 终结点的端口号。","Name":"kestrelHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 HTTP 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。","Name":"iisHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net9.0":{"DisplayName":"","Description":"Target net9.0"}},"Description":"项目的目标框架。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否生成显式程序类和主方法,而不是顶级语句。","Name":"UseProgramMain","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否生成显式程序类和主方法,而不是顶级语句。","DisplayName":"不使用顶级语句(_T)","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.web.projecttemplates.9.0.9.0.1.nupkg","Author":"Microsoft","Classifications":["Web","Web API","API","Service"],"DefaultName":"WebApplication","Description":"用于使用发布为 native AOT 的 ASP.NET Core 最小 API 的 RESTful Web API 的项目模板。","Identity":"Microsoft.Web.WebApiAot.CSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Web.WebApiAot","Precedence":9900,"Name":"ASP.NET Core Web API (native AOT)","ShortNameList":["webapiaot"],"PreferDefaultName":false,"ConfigPlace":"/content/WebApiAot-CSharp/.template.config/template.json","LocaleConfigPlace":"/content/WebApiAot-CSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/WebApiAot-CSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"https://json.schemastore.org/ide.host\",\"order\":100,\"icon\":\"ide/icon.ico\",\"supportsDocker\":true,\"symbolInfo\":[{\"id\":\"UseProgramMain\",\"isVisible\":true,\"persistenceScope\":\"shared\",\"persistenceScopeName\":\"Microsoft\"}]}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Company.Application1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"是否从生成的模板中排除 launchSettings.json。","Name":"ExcludeLaunchSettings","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否从生成的模板中排除 launchSettings.json。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"项目的目标框架。","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net9.0":{"DisplayName":"","Description":"Target net9.0"}},"Description":"项目的目标框架。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"如果指定,则在创建时跳过项目的自动还原。","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"如果指定,则在创建时跳过项目的自动还原。","DisplayName":"","AllowMultipleValues":false},{"Documentation":"是否生成显式程序类和主方法,而不是顶级语句。","Name":"UseProgramMain","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否生成显式程序类和主方法,而不是顶级语句。","DisplayName":"不使用顶级语句(_T)","AllowMultipleValues":false},{"Documentation":"是否启用将项目以 native AOT 发布。","Name":"NativeAot","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"是否启用将项目以 native AOT 发布。","DisplayName":"启用 native AOT 发布(_N)","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.web.projecttemplates.9.0.9.0.1.nupkg","Author":"Microsoft","Classifications":["Common","Worker","Web"],"DefaultName":"WorkerService","Description":"用于创建 worker service 的空项目模板。","Identity":"Microsoft.Worker.Empty.CSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Worker.Empty","Precedence":9900,"Name":"辅助角色服务","ShortNameList":["worker"],"PreferDefaultName":false,"ConfigPlace":"/content/Worker-CSharp/.template.config/template.json","LocaleConfigPlace":"/content/Worker-CSharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/Worker-CSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"https://json.schemastore.org/ide.host\",\"order\":300,\"icon\":\"ide/icon.ico\",\"supportsDocker\":true,\"symbolInfo\":[{\"id\":\"UseProgramMain\",\"isVisible\":true,\"persistenceScope\":\"shared\",\"persistenceScopeName\":\"Microsoft\"},{\"id\":\"NativeAot\",\"isVisible\":true}]}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"AndroidApp1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"重写 AndroidManifest.xml 中的包名称","Name":"packageName","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"com.companyname.AndroidApp1","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"重写 AndroidManifest.xml 中的包名称","DisplayName":"","AllowMultipleValues":false},{"Documentation":"替代项目中的 $(SupportedOSPlatformVersion)","Name":"supportedOSVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"23","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代项目中的 $(SupportedOSPlatformVersion)","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.android.templates.35.0.24.nupkg","Author":"Microsoft","Classifications":["Android","Mobile"],"DefaultName":"AndroidApp1","Description":"A project for creating a Wear OS app using .NET for Android","Identity":"Microsoft.Android.AndroidWearApp","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":null,"Precedence":0,"Name":"Android Wear 应用程序","ShortNameList":["androidwear"],"PreferDefaultName":false,"ConfigPlace":"/content/android-wear/.template.config/template.json","LocaleConfigPlace":"/content/android-wear/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/android-wear/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"icon\":\"ide/icon.ico\",\"appliesTo\":\"Android\",\"defaultItemExtension\":\"cs\",\"itemHierarchyPaths\":[\"Android\"]}","PostActions":[],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"AndroidLib1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"替代项目中的 $(SupportedOSPlatformVersion)","Name":"supportedOSVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"21","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代项目中的 $(SupportedOSPlatformVersion)","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.android.templates.35.0.24.nupkg","Author":"Microsoft","Classifications":["Android","Mobile"],"DefaultName":"AndroidLib1","Description":"用于创建 .NET for Android 类库的项目","Identity":"Microsoft.Android.AndroidLib","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":null,"Precedence":0,"Name":"Android 类库","ShortNameList":["androidlib"],"PreferDefaultName":false,"ConfigPlace":"/content/androidlib/.template.config/template.json","LocaleConfigPlace":"/content/androidlib/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/androidlib/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"icon\":\"ide/icon.ico\",\"appliesTo\":\"Android\",\"defaultItemExtension\":\"cs\",\"itemHierarchyPaths\":[\"Android\"]}","PostActions":[],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"AndroidBinding1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"替代项目中的 $(SupportedOSPlatformVersion)","Name":"supportedOSVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"21","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代项目中的 $(SupportedOSPlatformVersion)","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.android.templates.35.0.24.nupkg","Author":"Microsoft","Classifications":["Android","Mobile"],"DefaultName":"AndroidBinding1","Description":"用于创建绑定到本机 Java 库的 .NET for Android 类库的项目","Identity":"Microsoft.Android.AndroidBinding","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":null,"Precedence":0,"Name":"Android Java 库绑定","ShortNameList":["android-bindinglib"],"PreferDefaultName":false,"ConfigPlace":"/content/android-bindinglib/.template.config/template.json","LocaleConfigPlace":"/content/android-bindinglib/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/android-bindinglib/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"icon\":\"ide/icon.ico\",\"appliesTo\":\"Android\",\"defaultItemExtension\":\"cs\",\"itemHierarchyPaths\":[\"Android\"]}","PostActions":[],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Layout1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.android.templates.35.0.24.nupkg","Author":"Microsoft","Classifications":["Android","Mobile"],"DefaultName":"Layout1","Description":"Android 布局 (XML) 文件","Identity":"Microsoft.Android.AndroidLayout","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":null,"Precedence":0,"Name":"Android 布局","ShortNameList":["android-layout"],"PreferDefaultName":false,"ConfigPlace":"/content/android-layout/.template.config/template.json","LocaleConfigPlace":"/content/android-layout/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/android-layout/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"icon\":\"ide/icon.ico\",\"appliesTo\":\"Android\",\"defaultItemExtension\":\"xml\",\"itemHierarchyPaths\":[\"Android\"]}","PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Activity1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"生成的代码的命名空间","Name":"namespace","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"AndroidApp1","DataType":null,"DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"生成的代码的命名空间","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.android.templates.35.0.24.nupkg","Author":"Microsoft","Classifications":["Android","Mobile"],"DefaultName":"Activity1","Description":"Android 活动类","Identity":"Microsoft.Android.AndroidActivity","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":null,"Precedence":0,"Name":"Android 活动","ShortNameList":["android-activity"],"PreferDefaultName":false,"ConfigPlace":"/content/android-activity/.template.config/template.json","LocaleConfigPlace":"/content/android-activity/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/android-activity/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"icon\":\"ide/icon.ico\",\"appliesTo\":\"Android\",\"defaultItemExtension\":\"cs\",\"itemHierarchyPaths\":[\"Android\"]}","PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"AndroidApp1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"重写 AndroidManifest.xml 中的包名称","Name":"packageName","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"com.companyname.AndroidApp1","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"重写 AndroidManifest.xml 中的包名称","DisplayName":"","AllowMultipleValues":false},{"Documentation":"替代项目中的 $(SupportedOSPlatformVersion)","Name":"supportedOSVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"21","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代项目中的 $(SupportedOSPlatformVersion)","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.android.templates.35.0.24.nupkg","Author":"Microsoft","Classifications":["Android","Mobile"],"DefaultName":"AndroidApp1","Description":"用于创建 .NET for Android 应用程序的项目","Identity":"Microsoft.Android.AndroidApp","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":null,"Precedence":0,"Name":"Android 应用程序","ShortNameList":["android"],"PreferDefaultName":false,"ConfigPlace":"/content/android/.template.config/template.json","LocaleConfigPlace":"/content/android/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/android/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"icon\":\"ide/icon.ico\",\"appliesTo\":\"Android\",\"defaultItemExtension\":\"cs\",\"itemHierarchyPaths\":[\"Android\"]}","PostActions":[],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"ViewController1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"生成的代码的命名空间","Name":"namespace","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"iOSApp1","DataType":null,"DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"生成的代码的命名空间","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.ios.templates.18.1.9163.nupkg","Author":"Microsoft","Classifications":["iOS","Mobile"],"DefaultName":"ViewController1","Description":"iOS 视图控制器类和 xib","Identity":"Microsoft.iOS.ViewController","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":null,"Precedence":0,"Name":"iOS 视图控制器","ShortNameList":["ios-viewcontroller"],"PreferDefaultName":false,"ConfigPlace":"/ios-viewcontroller/.template.config/template.json","LocaleConfigPlace":"/ios-viewcontroller/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/ios-viewcontroller/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"appliesTo\":\"IOSApplication | IOSAppExtension | IOSBinding | IOSClassLibary\",\"defaultItemExtension\":\"cs\",\"itemHierarchyPaths\":[\"iOS\"]}","PostActions":[],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"iOSLib1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.ios.templates.18.1.9163.nupkg","Author":"Microsoft","Classifications":["iOS","Mobile"],"DefaultName":"iOSLib1","Description":"用于创建 .NET iOS 类库的项目","Identity":"Microsoft.iOS.iOSLib.CSharp","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.iOS.iOSLib","Precedence":0,"Name":"iOS 类库","ShortNameList":["ioslib"],"PreferDefaultName":false,"ConfigPlace":"/ioslib/csharp/.template.config/template.json","LocaleConfigPlace":"/ioslib/csharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":null,"PostActions":[],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Controller1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"生成的代码的命名空间","Name":"namespace","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"iOSApp1","DataType":null,"DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"生成的代码的命名空间","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.ios.templates.18.1.9163.nupkg","Author":"Microsoft","Classifications":["iOS","Mobile"],"DefaultName":"Controller1","Description":"iOS 控制器类","Identity":"Microsoft.iOS.Controller","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":null,"Precedence":0,"Name":"iOS 控制器","ShortNameList":["ios-controller"],"PreferDefaultName":false,"ConfigPlace":"/ios-controller/.template.config/template.json","LocaleConfigPlace":"/ios-controller/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/ios-controller/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"appliesTo\":\"IOSApplication | IOSAppExtension | IOSBinding | IOSClassLibary\",\"defaultItemExtension\":\"cs\",\"itemHierarchyPaths\":[\"iOS\"]}","PostActions":[],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"iOSApp1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"在 Info.plist 中替代 CFBundleIdentifier","Name":"bundleId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"com.companyname.iOSApp1","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"在 Info.plist 中替代 CFBundleIdentifier","DisplayName":"","AllowMultipleValues":false},{"Documentation":"替代项目文件中的 SupportedOSPlatformVersion","Name":"minOSVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"13.0","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代项目文件中的 SupportedOSPlatformVersion","DisplayName":"","AllowMultipleValues":false},{"Documentation":"","Name":"deviceFamily","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"universal","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"universal":{"DisplayName":"","Description":"同时支持 iPhone 和 iPad 设备"},"iphone":{"DisplayName":"","Description":"仅支持 iPhone 设备"},"ipad":{"DisplayName":"","Description":"仅支持 iPad 设备"}},"Description":"","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.ios.templates.18.1.9163.nupkg","Author":"Microsoft","Classifications":["iOS","Mobile"],"DefaultName":"iOSApp1","Description":"用于创建 .NET iOS 应用程序的项目","Identity":"Microsoft.iOS.iOSApp.CSharp","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.iOS.iOSApp","Precedence":0,"Name":"iOS 应用程序","ShortNameList":["ios"],"PreferDefaultName":false,"ConfigPlace":"/ios/csharp/.template.config/template.json","LocaleConfigPlace":"/ios/csharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":null,"PostActions":[],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"iOSApp1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"F#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"F#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"在 Info.plist 中替代 CFBundleIdentifier","Name":"bundleId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"com.companyname.iOSApp1","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"在 Info.plist 中替代 CFBundleIdentifier","DisplayName":"","AllowMultipleValues":false},{"Documentation":"替代项目文件中的 SupportedOSPlatformVersion","Name":"minOSVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"13.0","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代项目文件中的 SupportedOSPlatformVersion","DisplayName":"","AllowMultipleValues":false},{"Documentation":"","Name":"deviceFamily","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"universal","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"universal":{"DisplayName":"","Description":"同时支持 iPhone 和 iPad 设备"},"iphone":{"DisplayName":"","Description":"仅支持 iPhone 设备"},"ipad":{"DisplayName":"","Description":"仅支持 iPad 设备"}},"Description":"","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.ios.templates.18.1.9163.nupkg","Author":"Microsoft","Classifications":["iOS","Mobile"],"DefaultName":"iOSApp1","Description":"用于创建 .NET iOS 应用程序的项目","Identity":"Microsoft.iOS.iOSApp.FSharp","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.iOS.iOSApp","Precedence":0,"Name":"iOS 应用程序","ShortNameList":["ios"],"PreferDefaultName":false,"ConfigPlace":"/ios/fsharp/.template.config/template.json","LocaleConfigPlace":"/ios/fsharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"F#","type":"project"},"HostData":null,"PostActions":[],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"iOSApp1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"VB":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"VB","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"在 Info.plist 中替代 CFBundleIdentifier","Name":"bundleId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"com.companyname.iOSApp1","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"在 Info.plist 中替代 CFBundleIdentifier","DisplayName":"","AllowMultipleValues":false},{"Documentation":"替代项目文件中的 SupportedOSPlatformVersion","Name":"minOSVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"13.0","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代项目文件中的 SupportedOSPlatformVersion","DisplayName":"","AllowMultipleValues":false},{"Documentation":"","Name":"deviceFamily","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"universal","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"universal":{"DisplayName":"","Description":"同时支持 iPhone 和 iPad 设备"},"iphone":{"DisplayName":"","Description":"仅支持 iPhone 设备"},"ipad":{"DisplayName":"","Description":"仅支持 iPad 设备"}},"Description":"","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.ios.templates.18.1.9163.nupkg","Author":"Microsoft","Classifications":["iOS","Mobile"],"DefaultName":"iOSApp1","Description":"用于创建 .NET iOS 应用程序的项目","Identity":"Microsoft.iOS.iOSApp.VisualBasic","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.iOS.iOSApp","Precedence":0,"Name":"iOS 应用程序","ShortNameList":["ios"],"PreferDefaultName":false,"ConfigPlace":"/ios/visualbasic/.template.config/template.json","LocaleConfigPlace":"/ios/visualbasic/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"project"},"HostData":null,"PostActions":[],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"iOSTabbedApp1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"在 Info.plist 中替代 CFBundleIdentifier","Name":"bundleId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"com.companyname.iOSTabbedApp1","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"在 Info.plist 中替代 CFBundleIdentifier","DisplayName":"","AllowMultipleValues":false},{"Documentation":"替代项目文件中的 SupportedOSPlatformVersion","Name":"minOSVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"15.0","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代项目文件中的 SupportedOSPlatformVersion","DisplayName":"","AllowMultipleValues":false},{"Documentation":"","Name":"deviceFamily","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"universal","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"universal":{"DisplayName":"","Description":"同时支持 iPhone 和 iPad 设备"},"iphone":{"DisplayName":"","Description":"仅支持 iPhone 设备"},"ipad":{"DisplayName":"","Description":"仅支持 iPad 设备"}},"Description":"","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.ios.templates.18.1.9163.nupkg","Author":"Microsoft","Classifications":["iOS","Mobile"],"DefaultName":"iOSTabbedApp1","Description":"用于创建 .NET iOS 选项卡式应用程序的项目","Identity":"Microsoft.iOS.iOSTabbedApp","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":null,"Precedence":0,"Name":"iOS 选项卡式应用程序","ShortNameList":["ios-tabbed"],"PreferDefaultName":false,"ConfigPlace":"/ios-tabbed/.template.config/template.json","LocaleConfigPlace":"/ios-tabbed/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":null,"PostActions":[],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"View1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"生成的代码的命名空间","Name":"namespace","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"iOSApp1","DataType":null,"DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"生成的代码的命名空间","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.ios.templates.18.1.9163.nupkg","Author":"Microsoft","Classifications":["iOS","Mobile"],"DefaultName":"View1","Description":"iOS 视图","Identity":"Microsoft.iOS.View","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":null,"Precedence":0,"Name":"iOS 视图","ShortNameList":["ios-view"],"PreferDefaultName":false,"ConfigPlace":"/ios-view/.template.config/template.json","LocaleConfigPlace":"/ios-view/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/ios-view/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"appliesTo\":\"IOSApplication | IOSAppExtension | IOSBinding | IOSClassLibary\",\"defaultItemExtension\":\"cs\",\"itemHierarchyPaths\":[\"iOS\"]}","PostActions":[],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"iOSLib1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"VB":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"VB","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.ios.templates.18.1.9163.nupkg","Author":"Microsoft","Classifications":["iOS","Mobile"],"DefaultName":"iOSLib1","Description":"用于创建 .NET iOS 类库的项目","Identity":"Microsoft.iOS.iOSLib.VisualBasic","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.iOS.iOSLib","Precedence":0,"Name":"iOS 类库","ShortNameList":["ioslib"],"PreferDefaultName":false,"ConfigPlace":"/ioslib/visualbasic/.template.config/template.json","LocaleConfigPlace":"/ioslib/visualbasic/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"project"},"HostData":null,"PostActions":[],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"iOSBinding1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.ios.templates.18.1.9163.nupkg","Author":"Microsoft","Classifications":["iOS","Mobile"],"DefaultName":"iOSBinding1","Description":"用于创建 .NET iOS 绑定库的项目","Identity":"Microsoft.iOS.iOSBinding.CSharp","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.iOS.iOSBinding","Precedence":0,"Name":"iOS 绑定库","ShortNameList":["iosbinding"],"PreferDefaultName":false,"ConfigPlace":"/iosbinding/csharp/.template.config/template.json","LocaleConfigPlace":"/iosbinding/csharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":null,"PostActions":[],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Storyboard1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.ios.templates.18.1.9163.nupkg","Author":"Microsoft","Classifications":["iOS","Mobile"],"DefaultName":"Storyboard1","Description":"iOS Storyboard","Identity":"Microsoft.iOS.Storyboard","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":null,"Precedence":0,"Name":"iOS Storyboard","ShortNameList":["ios-storyboard"],"PreferDefaultName":false,"ConfigPlace":"/ios-storyboard/.template.config/template.json","LocaleConfigPlace":"/ios-storyboard/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/ios-storyboard/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"appliesTo\":\"IOSApplication | IOSAppExtension | IOSBinding | IOSClassLibary\",\"defaultItemExtension\":\"cs\",\"itemHierarchyPaths\":[\"iOS\"]}","PostActions":[],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"ViewController1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"生成的代码的命名空间","Name":"namespace","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"MacCatalystApp1","DataType":null,"DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"生成的代码的命名空间","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.maccatalyst.templates.18.1.9163.nupkg","Author":"Microsoft","Classifications":["macOS","Mac Catalyst"],"DefaultName":"ViewController1","Description":"MacCatalyst 视图控制器类和 xib","Identity":"Microsoft.MacCatalyst.ViewController","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":null,"Precedence":0,"Name":"Mac Catalyst 视图控制器","ShortNameList":["maccatalyst-viewcontroller"],"PreferDefaultName":false,"ConfigPlace":"/maccatalyst-viewcontroller/.template.config/template.json","LocaleConfigPlace":"/maccatalyst-viewcontroller/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/maccatalyst-viewcontroller/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"appliesTo\":\"MacCatalystApplication | MacCatalystAppExtension | MacCatalystBinding | MacCatalystClassLibary\",\"defaultItemExtension\":\"cs\",\"itemHierarchyPaths\":[\"Mac Catalyst\"]}","PostActions":[],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"View1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"生成的代码的命名空间","Name":"namespace","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"MacCatalystApp1","DataType":null,"DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"生成的代码的命名空间","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.maccatalyst.templates.18.1.9163.nupkg","Author":"Microsoft","Classifications":["macOS","Mac Catalyst"],"DefaultName":"View1","Description":"MacCatalyst 视图","Identity":"Microsoft.MacCatalyst.View","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":null,"Precedence":0,"Name":"Mac Catalyst 视图","ShortNameList":["maccatalyst-view"],"PreferDefaultName":false,"ConfigPlace":"/maccatalyst-view/.template.config/template.json","LocaleConfigPlace":"/maccatalyst-view/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/maccatalyst-view/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"appliesTo\":\"MacCatalystApplication | MacCatalystAppExtension | MacCatalystBinding | MacCatalystClassLibary\",\"defaultItemExtension\":\"cs\",\"itemHierarchyPaths\":[\"Mac Catalyst\"]}","PostActions":[],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"MacCatalystApp1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"在 Info.plist 中替代 CFBundleIdentifier","Name":"bundleId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"com.companyname.MacCatalystApp1","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"在 Info.plist 中替代 CFBundleIdentifier","DisplayName":"","AllowMultipleValues":false},{"Documentation":"替代项目文件中的 SupportedOSPlatformVersion","Name":"minOSVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"15.0","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代项目文件中的 SupportedOSPlatformVersion","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.maccatalyst.templates.18.1.9163.nupkg","Author":"Microsoft","Classifications":["macOS","Mac Catalyst"],"DefaultName":"MacCatalystApp1","Description":"用于创建 .NET Mac Catalyst 应用程序的项目","Identity":"Microsoft.MacCatalyst.MacCatalystApp.CSharp","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.MacCatalyst.MacCatalystApp","Precedence":0,"Name":"Mac Catalyst 应用程序","ShortNameList":["maccatalyst"],"PreferDefaultName":false,"ConfigPlace":"/maccatalyst/csharp/.template.config/template.json","LocaleConfigPlace":"/maccatalyst/csharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":null,"PostActions":[],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"MacCatalystLib1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"VB":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"VB","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.maccatalyst.templates.18.1.9163.nupkg","Author":"Microsoft","Classifications":["macOS","Mac Catalyst"],"DefaultName":"MacCatalystLib1","Description":"用于创建 .NET Mac Catalyst 类库的项目","Identity":"Microsoft.MacCatalyst.MacCatalystLib.VisualBasic","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.MacCatalyst.MacCatalystLib","Precedence":0,"Name":"Mac Catalyst 类库","ShortNameList":["maccatalystlib"],"PreferDefaultName":false,"ConfigPlace":"/maccatalystlib/visualbasic/.template.config/template.json","LocaleConfigPlace":"/maccatalystlib/visualbasic/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"project"},"HostData":null,"PostActions":[],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Storyboard1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.maccatalyst.templates.18.1.9163.nupkg","Author":"Microsoft","Classifications":["macOS","Mac Catalyst"],"DefaultName":"Storyboard1","Description":"MacCatalyst Storyboard","Identity":"Microsoft.MacCatalyst.Storyboard","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":null,"Precedence":0,"Name":"Mac Catalyst Storyboard","ShortNameList":["maccatalyst-storyboard"],"PreferDefaultName":false,"ConfigPlace":"/maccatalyst-storyboard/.template.config/template.json","LocaleConfigPlace":"/maccatalyst-storyboard/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/maccatalyst-storyboard/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"appliesTo\":\"MacCatalystApplication | MacCatalystAppExtension | MacCatalystBinding | MacCatalystClassLibary\",\"defaultItemExtension\":\"cs\",\"itemHierarchyPaths\":[\"Mac Catalyst\"]}","PostActions":[],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"MacCatalystLib1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.maccatalyst.templates.18.1.9163.nupkg","Author":"Microsoft","Classifications":["macOS","Mac Catalyst"],"DefaultName":"MacCatalystLib1","Description":"用于创建 .NET Mac Catalyst 类库的项目","Identity":"Microsoft.MacCatalyst.MacCatalystLib.CSharp","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.MacCatalyst.MacCatalystLib","Precedence":0,"Name":"Mac Catalyst 类库","ShortNameList":["maccatalystlib"],"PreferDefaultName":false,"ConfigPlace":"/maccatalystlib/csharp/.template.config/template.json","LocaleConfigPlace":"/maccatalystlib/csharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":null,"PostActions":[],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"MacCatalystApp1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"VB":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"VB","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"在 Info.plist 中替代 CFBundleIdentifier","Name":"bundleId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"com.companyname.MacCatalystApp1","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"在 Info.plist 中替代 CFBundleIdentifier","DisplayName":"","AllowMultipleValues":false},{"Documentation":"替代项目文件中的 SupportedOSPlatformVersion","Name":"minOSVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"15.0","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代项目文件中的 SupportedOSPlatformVersion","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.maccatalyst.templates.18.1.9163.nupkg","Author":"Microsoft","Classifications":["macOS","Mac Catalyst"],"DefaultName":"MacCatalystApp1","Description":"用于创建 .NET Mac Catalyst 应用程序的项目","Identity":"Microsoft.MacCatalyst.MacCatalystApp.VisualBasic","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.MacCatalyst.MacCatalystApp","Precedence":0,"Name":"Mac Catalyst 应用程序","ShortNameList":["maccatalyst"],"PreferDefaultName":false,"ConfigPlace":"/maccatalyst/visualbasic/.template.config/template.json","LocaleConfigPlace":"/maccatalyst/visualbasic/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"project"},"HostData":null,"PostActions":[],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Controller1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"生成的代码的命名空间","Name":"namespace","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"MacCatalystApp1","DataType":null,"DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"生成的代码的命名空间","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.maccatalyst.templates.18.1.9163.nupkg","Author":"Microsoft","Classifications":["macOS","Mac Catalyst"],"DefaultName":"Controller1","Description":"MacCatalyst Controller 类","Identity":"Microsoft.MacCatalyst.Controller","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":null,"Precedence":0,"Name":"Mac Catalyst 控制器","ShortNameList":["maccatalyst-controller"],"PreferDefaultName":false,"ConfigPlace":"/maccatalyst-controller/.template.config/template.json","LocaleConfigPlace":"/maccatalyst-controller/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/maccatalyst-controller/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"appliesTo\":\"MacCatalystApplication | MacCatalystAppExtension | MacCatalystBinding | MacCatalystClassLibary\",\"defaultItemExtension\":\"cs\",\"itemHierarchyPaths\":[\"Mac Catalyst\"]}","PostActions":[],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"MacCatalystBinding1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.maccatalyst.templates.18.1.9163.nupkg","Author":"Microsoft","Classifications":["macOS","Mac Catalyst"],"DefaultName":"MacCatalystBinding1","Description":"用于创建 .NET Mac Catalyst 绑定库的项目","Identity":"Microsoft.MacCatalyst.MacCatalystBinding.CSharp","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.MacCatalyst.MacCatalystBinding","Precedence":0,"Name":"Mac Catalyst 绑定库","ShortNameList":["maccatalystbinding"],"PreferDefaultName":false,"ConfigPlace":"/maccatalystbinding/csharp/.template.config/template.json","LocaleConfigPlace":"/maccatalystbinding/csharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":null,"PostActions":[],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"ViewController1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"生成的代码的命名空间","Name":"namespace","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"macOSApp1","DataType":null,"DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"生成的代码的命名空间","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.macos.templates.15.1.9163.nupkg","Author":"Microsoft","Classifications":["macOS"],"DefaultName":"ViewController1","Description":"在 Xcode 的 Interface Builder (XIB 文件)中实现的具有 UI 的 macOS 视图控制器","Identity":"Microsoft.macOS.ViewController","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":null,"Precedence":0,"Name":"macOS 视图控制器","ShortNameList":["macos-viewcontroller"],"PreferDefaultName":false,"ConfigPlace":"/macos-viewcontroller/.template.config/template.json","LocaleConfigPlace":"/macos-viewcontroller/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/macos-viewcontroller/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"appliesTo\":\"MacOSApplication | MacOSAppExtension | MacOSBinding | MacOSClassLibary\",\"defaultItemExtension\":\"cs\",\"itemHierarchyPaths\":[\"macOS\"]}","PostActions":[],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"View1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"生成的代码的命名空间","Name":"namespace","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"macOSApp1","DataType":null,"DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"生成的代码的命名空间","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.macos.templates.15.1.9163.nupkg","Author":"Microsoft","Classifications":["macOS"],"DefaultName":"View1","Description":"在 Xcode 的 Interface Builder (XIB 文件)中实现的具有 UI 的 macOS 视图","Identity":"Microsoft.macOS.View","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":null,"Precedence":0,"Name":"macOS 视图","ShortNameList":["macos-view"],"PreferDefaultName":false,"ConfigPlace":"/macos-view/.template.config/template.json","LocaleConfigPlace":"/macos-view/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/macos-view/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"appliesTo\":\"MacOSApplication | MacOSAppExtension | MacOSBinding | MacOSClassLibary\",\"defaultItemExtension\":\"cs\",\"itemHierarchyPaths\":[\"macOS\"]}","PostActions":[],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"macOSLib1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"VB":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"VB","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.macos.templates.15.1.9163.nupkg","Author":"Microsoft","Classifications":["macOS"],"DefaultName":"macOSLib1","Description":"用于创建 .NET macOS 类库的项目","Identity":"Microsoft.macOS.macOSLib.VisualBasic","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.macOS.macOSLib","Precedence":0,"Name":"macOS 类库","ShortNameList":["macoslib"],"PreferDefaultName":false,"ConfigPlace":"/macoslib/visualbasic/.template.config/template.json","LocaleConfigPlace":"/macoslib/visualbasic/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"project"},"HostData":null,"PostActions":[],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"macOSApp1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"在 Info.plist 中替代 CFBundleIdentifier","Name":"bundleId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"com.companyname.macOSApp1","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"在 Info.plist 中替代 CFBundleIdentifier","DisplayName":"","AllowMultipleValues":false},{"Documentation":"替代项目文件中的 SupportedOSPlatformVersion","Name":"minOSVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"12.0","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代项目文件中的 SupportedOSPlatformVersion","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.macos.templates.15.1.9163.nupkg","Author":"Microsoft","Classifications":["macOS"],"DefaultName":"macOSApp1","Description":"用于创建 .NET macOS 应用程序的项目","Identity":"Microsoft.macOS.macOSApp.CSharp","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.macOS.macOSApp","Precedence":0,"Name":"macOS 应用程序","ShortNameList":["macos"],"PreferDefaultName":false,"ConfigPlace":"/macos/csharp/.template.config/template.json","LocaleConfigPlace":"/macos/csharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":null,"PostActions":[],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Storyboard1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.macos.templates.15.1.9163.nupkg","Author":"Microsoft","Classifications":["macOS"],"DefaultName":"Storyboard1","Description":"macOS Storyboard","Identity":"Microsoft.macOS.Storyboard","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":null,"Precedence":0,"Name":"macOS Storyboard","ShortNameList":["macos-storyboard"],"PreferDefaultName":false,"ConfigPlace":"/macos-storyboard/.template.config/template.json","LocaleConfigPlace":"/macos-storyboard/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/macos-storyboard/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"appliesTo\":\"MacOSApplication | MacOSAppExtension | MacOSBinding | MacOSClassLibary\",\"defaultItemExtension\":\"cs\",\"itemHierarchyPaths\":[\"macOS\"]}","PostActions":[],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"macOSLib1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.macos.templates.15.1.9163.nupkg","Author":"Microsoft","Classifications":["macOS"],"DefaultName":"macOSLib1","Description":"用于创建 .NET macOS 类库的项目","Identity":"Microsoft.macOS.macOSLib.CSharp","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.macOS.macOSLib","Precedence":0,"Name":"macOS 类库","ShortNameList":["macoslib"],"PreferDefaultName":false,"ConfigPlace":"/macoslib/csharp/.template.config/template.json","LocaleConfigPlace":"/macoslib/csharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":null,"PostActions":[],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"macOSApp1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"VB":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"VB","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"在 Info.plist 中替代 CFBundleIdentifier","Name":"bundleId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"com.companyname.macOSApp1","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"在 Info.plist 中替代 CFBundleIdentifier","DisplayName":"","AllowMultipleValues":false},{"Documentation":"替代项目文件中的 SupportedOSPlatformVersion","Name":"minOSVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"12.0","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代项目文件中的 SupportedOSPlatformVersion","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.macos.templates.15.1.9163.nupkg","Author":"Microsoft","Classifications":["macOS"],"DefaultName":"macOSApp1","Description":"用于创建 .NET macOS 应用程序的项目","Identity":"Microsoft.macOS.macOSApp.VisualBasic","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.macOS.macOSApp","Precedence":0,"Name":"macOS 应用程序","ShortNameList":["macos"],"PreferDefaultName":false,"ConfigPlace":"/macos/visualbasic/.template.config/template.json","LocaleConfigPlace":"/macos/visualbasic/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"project"},"HostData":null,"PostActions":[],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Controller1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"生成的代码的命名空间","Name":"namespace","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"macOSApp1","DataType":null,"DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"生成的代码的命名空间","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.macos.templates.15.1.9163.nupkg","Author":"Microsoft","Classifications":["macOS"],"DefaultName":"Controller1","Description":"在代码中实现的具有 UI 的 macOS 视图控制器","Identity":"Microsoft.macOS.Controller","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":null,"Precedence":0,"Name":"macOS 控制器","ShortNameList":["macos-controller"],"PreferDefaultName":false,"ConfigPlace":"/macos-controller/.template.config/template.json","LocaleConfigPlace":"/macos-controller/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/macos-controller/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"appliesTo\":\"MacOSApplication | MacOSAppExtension | MacOSBinding | MacOSClassLibary\",\"defaultItemExtension\":\"cs\",\"itemHierarchyPaths\":[\"macOS\"]}","PostActions":[],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"macOSBinding1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.macos.templates.15.1.9163.nupkg","Author":"Microsoft","Classifications":["macOS"],"DefaultName":"macOSBinding1","Description":"用于创建 .NET macOS 绑定库的项目","Identity":"Microsoft.macOS.macOSBinding.CSharp","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.macOS.macOSBinding","Precedence":0,"Name":"macOS 绑定库","ShortNameList":["macosbinding"],"PreferDefaultName":false,"ConfigPlace":"/macosbinding/csharp/.template.config/template.json","LocaleConfigPlace":"/macosbinding/csharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":null,"ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":null,"PostActions":[],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"MauiApp.1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"solution":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"solution","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"Overrides the $(ApplicationId) in the project","Name":"applicationId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":null,"DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"Overrides the $(ApplicationId) in the project","DisplayName":"","AllowMultipleValues":false},{"Choices":{},"Documentation":"","Description":"","DefaultValue":"9.0.0","Name":"msExtensionsLoggingDebugVersion","DisplayName":"","IsName":false,"Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{},"Documentation":"","Description":"","DefaultValue":"9.0.0","Name":"componentsWebVersion","DisplayName":"","IsName":false,"Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{},"Documentation":"","Description":"","DefaultValue":"9.0.0","Name":"componentsWebAssemblyVersion","DisplayName":"","IsName":false,"Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{},"Documentation":"","Description":"","DefaultValue":"9.0.0","Name":"componentsWebAssemblyServerVersion","DisplayName":"","IsName":false,"Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"The target framework for the project.","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net9.0":{"DisplayName":"","Description":"Target net9.0"}},"Description":"The target framework for the project.","DisplayName":"","AllowMultipleValues":false},{"Choices":{},"Documentation":"","Description":"","DefaultValue":"net9.0","Name":"FrameworkAspNet","DisplayName":"","IsName":false,"Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"The ID to use for secrets (use with Individual auth).","Name":"UserSecretsId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"aspnet-MauiApp.1-53bc9b9d-9d6a-45d4-8429-2a2761773502","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The ID to use for secrets (use with Individual auth).","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Whether to exclude launchSettings.json from the generated template.","Name":"ExcludeLaunchSettings","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Whether to exclude launchSettings.json from the generated template.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Port number to use for the HTTP endpoint in launchSettings.json.","Name":"kestrelHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"Port number to use for the HTTP endpoint in launchSettings.json.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if Individual auth is used).","Name":"kestrelHttpsPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if Individual auth is used).","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Port number to use for the IIS Express HTTP endpoint in launchSettings.json.","Name":"iisHttpPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"Port number to use for the IIS Express HTTP endpoint in launchSettings.json.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if Individual auth is used).","Name":"iisHttpsPort","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"0","DataType":"integer","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if Individual auth is used).","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Chooses which interactive render mode to use for interactive components","Name":"InteractivityPlatform","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"Server","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"None":{"DisplayName":"None","Description":"No interactivity (static server rendering only)"},"Server":{"DisplayName":"Server","Description":"Runs on the server"},"WebAssembly":{"DisplayName":"WebAssembly","Description":"Runs in the browser using WebAssembly"},"Auto":{"DisplayName":"Auto (Server and WebAssembly)","Description":"Uses Server while downloading WebAssembly assets, then uses WebAssembly"}},"Description":"Chooses which interactive render mode to use for interactive components","DisplayName":"_Interactive render mode","AllowMultipleValues":false},{"Documentation":"Configures whether to add sample pages and styling to demonstrate basic usage patterns.","Name":"IncludeSampleContent","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Configures whether to add sample pages and styling to demonstrate basic usage patterns.","DisplayName":"_Include sample pages","AllowMultipleValues":false},{"Documentation":"Configures whether to omit sample pages and styling that demonstrate basic usage patterns.","Name":"Empty","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Configures whether to omit sample pages and styling that demonstrate basic usage patterns.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Configures whether to make every page interactive by applying an interactive render mode at the top level. If false, pages will use static server rendering by default, and can be marked interactive on a per-page or per-component basis.","Name":"AllInteractive","Priority":2,"Precedence":{"PrecedenceDefinition":4,"IsRequiredCondition":null,"IsEnabledCondition":"(InteractivityPlatform != \"None\")","IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Configures whether to make every page interactive by applying an interactive render mode at the top level. If false, pages will use static server rendering by default, and can be marked interactive on a per-page or per-component basis.","DisplayName":"_Enable interactive rendering globally throughout the site","AllowMultipleValues":false},{"Documentation":"Whether to turn off HTTPS. This option only applies if Individual isn't used for --auth.","Name":"NoHttps","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Whether to turn off HTTPS. This option only applies if Individual isn't used for --auth.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Whether to generate an explicit Program class and Main method instead of top-level statements.","Name":"UseProgramMain","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Whether to generate an explicit Program class and Main method instead of top-level statements.","DisplayName":"Do not use _top-level statements","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.maui.templates.net9.9.0.0.nupkg","Author":"Microsoft","Classifications":["MAUI","Android","iOS","macOS","Mac Catalyst","Windows","Tizen","Blazor","Blazor Hybrid","Mobile"],"DefaultName":"MauiApp1","Description":"A multi-project app for creating a .NET MAUI Blazor Hybrid application with a Blazor Web project with a shared user interface.","Identity":"Microsoft.Maui.BlazorSolution.CSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Maui.BlazorSolution","Precedence":9000,"Name":".NET MAUI Blazor Hybrid and Web App","ShortNameList":["maui-blazor-web"],"PreferDefaultName":false,"ConfigPlace":"/content/templates/maui-blazor-solution/.template.config/template.json","LocaleConfigPlace":"/content/templates/maui-blazor-solution/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/templates/maui-blazor-solution/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"solution"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"icon\":\"ide/icon.ico\",\"disableHttpsSymbol\":\"NoHttps\",\"unsupportedHosts\":[{\"id\":\"vs\",\"version\":\"(,17.3)\"}],\"requiredComponents\":[{\"id\":\"Microsoft.VisualStudio.ComponentGroup.Maui.All\",\"hostId\":\"vs\",\"componentType\":\"SetupComponent\"}],\"symbolInfo\":[{\"id\":\"InteractivityPlatform\",\"isVisible\":true,\"persistenceScope\":\"templateGroup\"},{\"id\":\"IncludeSampleContent\",\"isVisible\":true,\"persistenceScope\":\"shared\",\"persistenceScopeName\":\"Microsoft\"},{\"id\":\"UseProgramMain\",\"isVisible\":true,\"persistenceScope\":\"shared\",\"persistenceScopeName\":\"Microsoft\"}]}","PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"NewContent1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"生成的代码的命名空间。","Name":"namespace","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"MauiApp1","DataType":null,"DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"生成的代码的命名空间。","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.maui.templates.net9.9.0.0.nupkg","Author":"Microsoft","Classifications":["MAUI","Android","iOS","macOS","Mac Catalyst","WinUI","Tizen","Xaml","Code"],"DefaultName":"NewContent1","Description":"A view for displaying content using XAML. This is very suitable for creating your own custom and reusable controls.","Identity":"Microsoft.Maui.XamlContentView.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Maui.XamlContentView","Precedence":9000,"Name":".NET MAUI ContentView (XAML)","ShortNameList":["maui-view-xaml"],"PreferDefaultName":false,"ConfigPlace":"/content/templates/maui-contentview-xaml/.template.config/template.json","LocaleConfigPlace":"/content/templates/maui-contentview-xaml/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/templates/maui-contentview-xaml/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"appliesTo\":\"UseMaui\",\"defaultItemExtension\":\"xaml\",\"itemHierarchyPaths\":[\".NET MAUI\"],\"icon\":\"ide/MauiContentViewXamlFile.ico\",\"unsupportedHosts\":[{\"id\":\"vs\",\"version\":\"(,17.3)\"}],\"requiredComponents\":[{\"id\":\"Microsoft.VisualStudio.ComponentGroup.Maui.All\",\"hostId\":\"vs\",\"componentType\":\"SetupComponent\"}]}","PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"MauiApp.1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"替代项目中的 $(ApplicationId)","Name":"applicationId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":null,"DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代项目中的 $(ApplicationId)","DisplayName":"","AllowMultipleValues":false},{"Choices":{},"Documentation":"","Description":"","DefaultValue":"9.0.0","Name":"msExtensionsLoggingDebugVersion","DisplayName":"","IsName":false,"Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"The target framework for the project.","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net9.0":{"DisplayName":"","Description":"Target net9.0"}},"Description":"The target framework for the project.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Configures whether to add sample pages and styling to demonstrate basic usage patterns.","Name":"IncludeSampleContent","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Configures whether to add sample pages and styling to demonstrate basic usage patterns.","DisplayName":"_Include sample pages","AllowMultipleValues":false},{"Documentation":"Configures whether to omit sample pages and styling that demonstrate basic usage patterns.","Name":"Empty","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Configures whether to omit sample pages and styling that demonstrate basic usage patterns.","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.maui.templates.net9.9.0.0.nupkg","Author":"Microsoft","Classifications":["MAUI","Android","iOS","macOS","Mac Catalyst","Windows","Tizen","Blazor","Blazor Hybrid","Mobile"],"DefaultName":"MauiApp1","Description":"用于使用 Blazor 创建适用于 iOS、Android、Mac Catalyst、Tizen 和 WinUI 的 .NET MAUI 应用程序的项目","Identity":"Microsoft.Maui.BlazorApp.CSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Maui.BlazorApp","Precedence":9000,"Name":".NET MAUI Blazor 应用","ShortNameList":["maui-blazor"],"PreferDefaultName":false,"ConfigPlace":"/content/templates/maui-blazor/.template.config/template.json","LocaleConfigPlace":"/content/templates/maui-blazor/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/templates/maui-blazor/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"icon\":\"ide/icon.ico\",\"unsupportedHosts\":[{\"id\":\"vs\",\"version\":\"(,17.3)\"}],\"requiredComponents\":[{\"id\":\"Microsoft.VisualStudio.ComponentGroup.Maui.Blazor\",\"hostId\":\"vs\",\"componentType\":\"SetupComponent\"}],\"symbolInfo\":[{\"id\":\"Framework\",\"persistenceScope\":\"shared\",\"persistenceScopeName\":\"maui\"},{\"id\":\"IncludeSampleContent\",\"isVisible\":true,\"persistenceScope\":\"shared\",\"persistenceScopeName\":\"Microsoft\"}]}","PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Dictionary1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"Namespace for the generated code.","Name":"namespace","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"MauiApp1","DataType":null,"DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"Namespace for the generated code.","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.maui.templates.net9.9.0.0.nupkg","Author":"Microsoft","Classifications":["MAUI","Android","iOS","macOS","Mac Catalyst","WinUI","Xaml","Code"],"DefaultName":"Dictionary1","Description":"A repository for resources that are used by a .NET MAUI app. Typical resources that are stored in a ResourceDictionary include styles, control templates, data templates, converters, and colors.","Identity":"Microsoft.Maui.XamlResourceDictionary.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Maui.XamlResourceDictionary","Precedence":9000,"Name":".NET MAUI ResourceDictionary (XAML)","ShortNameList":["maui-dict-xaml"],"PreferDefaultName":false,"ConfigPlace":"/content/templates/maui-resourcedictionary-xaml/.template.config/template.json","LocaleConfigPlace":"/content/templates/maui-resourcedictionary-xaml/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/templates/maui-resourcedictionary-xaml/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"appliesTo\":\"UseMaui\",\"defaultItemExtension\":\"xaml\",\"itemHierarchyPaths\":[\".NET MAUI\"],\"icon\":\"ide/MauiResourceDictionaryXamlFile.ico\",\"unsupportedHosts\":[{\"id\":\"vs\",\"version\":\"(,17.3)\"}],\"requiredComponents\":[{\"id\":\"Microsoft.VisualStudio.ComponentGroup.Maui.All\",\"hostId\":\"vs\",\"componentType\":\"SetupComponent\"}]}","PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"NewPage1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"生成的代码的命名空间。","Name":"namespace","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"MauiApp1","DataType":null,"DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"生成的代码的命名空间。","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.maui.templates.net9.9.0.0.nupkg","Author":"Microsoft","Classifications":["MAUI","Android","iOS","macOS","Mac Catalyst","WinUI","Tizen","Xaml","Code"],"DefaultName":"NewPage1","Description":"A page for displaying content using C#.","Identity":"Microsoft.Maui.CSharpContentPage.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Maui.CSharpContentPage","Precedence":9000,"Name":".NET MAUI ContentPage (C#)","ShortNameList":["maui-page-csharp"],"PreferDefaultName":false,"ConfigPlace":"/content/templates/maui-contentpage-csharp/.template.config/template.json","LocaleConfigPlace":"/content/templates/maui-contentpage-csharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/templates/maui-contentpage-csharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"appliesTo\":\"UseMaui\",\"defaultItemExtension\":\"cs\",\"itemHierarchyPaths\":[\".NET MAUI\"],\"icon\":\"ide/MauiPageCSFile.ico\",\"unsupportedHosts\":[{\"id\":\"vs\",\"version\":\"(,17.3)\"}],\"requiredComponents\":[{\"id\":\"Microsoft.VisualStudio.ComponentGroup.Maui.All\",\"hostId\":\"vs\",\"componentType\":\"SetupComponent\"}]}","PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"MauiApp.1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"solution":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"solution","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"Overrides the $(ApplicationId) in the project","Name":"applicationId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":null,"DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"Overrides the $(ApplicationId) in the project","DisplayName":"","AllowMultipleValues":false},{"Choices":{},"Documentation":"","Description":"","DefaultValue":"9.0.0","Name":"msExtensionsLoggingDebugVersion","DisplayName":"","IsName":false,"Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"The target framework for the project.","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net9.0":{"DisplayName":"","Description":"Target net9.0"}},"Description":"The target framework for the project.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Include the Android app head project","Name":"android","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Include the Android app head project","DisplayName":"Android","AllowMultipleValues":false},{"Documentation":"Include the iOS app head project","Name":"ios","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Include the iOS app head project","DisplayName":"iOS","AllowMultipleValues":false},{"Documentation":"Include the macOS app head project (using Mac Catalyst)","Name":"maccatalyst","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Include the macOS app head project (using Mac Catalyst)","DisplayName":"macOS using Mac Catalyst","AllowMultipleValues":false},{"Documentation":"Include the Windows app head project (using WinUI 3)","Name":"winui","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Include the Windows app head project (using WinUI 3)","DisplayName":"Windows using WinUI 3","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.maui.templates.net9.9.0.0.nupkg","Author":"Microsoft","Classifications":["MAUI","Android","iOS","macOS","Mac Catalyst","Windows","Mobile"],"DefaultName":"MauiApp1","Description":"A project for creating a .NET MAUI application for iOS, Android, Mac Catalyst and WinUI with multiple, separate app projects.","Identity":"Microsoft.Maui.MultiProjectApp.CSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Maui.MultiProjectApp","Precedence":9000,"Name":".NET MAUI Multi-Project App","ShortNameList":["maui-multiproject"],"PreferDefaultName":false,"ConfigPlace":"/content/templates/maui-multiproject/.template.config/template.json","LocaleConfigPlace":"/content/templates/maui-multiproject/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/templates/maui-multiproject/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"solution"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"icon\":\"ide/icon.ico\",\"unsupportedHosts\":[{\"id\":\"vs\",\"version\":\"(,17.3)\"}],\"requiredComponents\":[{\"id\":\"Microsoft.VisualStudio.ComponentGroup.Maui.All\",\"hostId\":\"vs\",\"componentType\":\"SetupComponent\"}],\"symbolInfo\":[{\"id\":\"Framework\",\"persistenceScope\":\"shared\",\"persistenceScopeName\":\"maui\"},{\"id\":\"android\",\"isVisible\":true,\"defaultValue\":\"true\"},{\"id\":\"ios\",\"isVisible\":true,\"defaultValue\":\"true\"},{\"id\":\"maccatalyst\",\"isVisible\":true,\"defaultValue\":\"true\"},{\"id\":\"winui\",\"isVisible\":true,\"defaultValue\":\"true\"}]}","PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"MauiLib1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"The target framework for the project.","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net9.0":{"DisplayName":"","Description":"Target net9.0"}},"Description":"The target framework for the project.","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.maui.templates.net9.9.0.0.nupkg","Author":"Microsoft","Classifications":["MAUI","Android","iOS","macOS","Mac Catalyst","Windows","Tizen","Mobile"],"DefaultName":"MauiLib1","Description":"用于创建 .NET MAUI 类库的项目","Identity":"Microsoft.Maui.MauiLib.CSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Maui.Library","Precedence":9000,"Name":".NET MAUI类库","ShortNameList":["mauilib"],"PreferDefaultName":false,"ConfigPlace":"/content/templates/maui-lib/.template.config/template.json","LocaleConfigPlace":"/content/templates/maui-lib/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/templates/maui-lib/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"icon\":\"ide/icon.ico\",\"unsupportedHosts\":[{\"id\":\"vs\",\"version\":\"(,17.3)\"}],\"requiredComponents\":[{\"id\":\"Microsoft.VisualStudio.ComponentGroup.Maui.All\",\"hostId\":\"vs\",\"componentType\":\"SetupComponent\"}],\"symbolInfo\":[{\"id\":\"Framework\",\"persistenceScope\":\"shared\",\"persistenceScopeName\":\"maui\"}]}","PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"NewWindow1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"生成的代码的命名空间。","Name":"namespace","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"MauiApp1","DataType":null,"DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"生成的代码的命名空间。","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.maui.templates.net9.9.0.0.nupkg","Author":"Microsoft","Classifications":["MAUI","Android","iOS","macOS","Mac Catalyst","WinUI","Tizen","Xaml","Code"],"DefaultName":"NewWindow1","Description":"A window for displaying a page using C#.","Identity":"Microsoft.Maui.CSharpWindow.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Maui.CSharpWindow","Precedence":9000,"Name":".NET MAUI Window (C#)","ShortNameList":["maui-window-csharp"],"PreferDefaultName":false,"ConfigPlace":"/content/templates/maui-window-csharp/.template.config/template.json","LocaleConfigPlace":"/content/templates/maui-window-csharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/templates/maui-window-csharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"appliesTo\":\"UseMaui\",\"defaultItemExtension\":\"cs\",\"itemHierarchyPaths\":[\".NET MAUI\"],\"icon\":\"ide/MauiWindowCSFile.ico\",\"unsupportedHosts\":[{\"id\":\"vs\",\"version\":\"(,17.3)\"}],\"requiredComponents\":[{\"id\":\"Microsoft.VisualStudio.ComponentGroup.Maui.All\",\"hostId\":\"vs\",\"componentType\":\"SetupComponent\"}]}","PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"NewPage1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"生成的代码的命名空间","Name":"namespace","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"MauiApp1","DataType":null,"DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"生成的代码的命名空间","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.maui.templates.net9.9.0.0.nupkg","Author":"Microsoft","Classifications":["MAUI","Android","iOS","macOS","Mac Catalyst","WinUI","Tizen","Xaml","Code"],"DefaultName":"NewPage1","Description":"A page for displaying content using XAML.","Identity":"Microsoft.Maui.XamlContentPage.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Maui.XamlContentPage","Precedence":9000,"Name":".NET MAUI ContentPage (XAML)","ShortNameList":["maui-page-xaml"],"PreferDefaultName":false,"ConfigPlace":"/content/templates/maui-contentpage-xaml/.template.config/template.json","LocaleConfigPlace":"/content/templates/maui-contentpage-xaml/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/templates/maui-contentpage-xaml/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"appliesTo\":\"UseMaui\",\"defaultItemExtension\":\"xaml\",\"itemHierarchyPaths\":[\".NET MAUI\"],\"icon\":\"ide/MauiPageXamlFile.ico\",\"unsupportedHosts\":[{\"id\":\"vs\",\"version\":\"(,17.3)\"}],\"requiredComponents\":[{\"id\":\"Microsoft.VisualStudio.ComponentGroup.Maui.All\",\"hostId\":\"vs\",\"componentType\":\"SetupComponent\"}]}","PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"NewWindow1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"生成的代码的命名空间","Name":"namespace","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"MauiApp1","DataType":null,"DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"生成的代码的命名空间","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.maui.templates.net9.9.0.0.nupkg","Author":"Microsoft","Classifications":["MAUI","Android","iOS","macOS","Mac Catalyst","WinUI","Tizen","Xaml","Code"],"DefaultName":"NewWindow1","Description":"A window for displaying a page using XAML.","Identity":"Microsoft.Maui.XamlWindow.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Maui.XamlWindow","Precedence":9000,"Name":".NET MAUI Window (XAML)","ShortNameList":["maui-window-xaml"],"PreferDefaultName":false,"ConfigPlace":"/content/templates/maui-window-xaml/.template.config/template.json","LocaleConfigPlace":"/content/templates/maui-window-xaml/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/templates/maui-window-xaml/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"appliesTo\":\"UseMaui\",\"defaultItemExtension\":\"xaml\",\"itemHierarchyPaths\":[\".NET MAUI\"],\"icon\":\"ide/MauiWindowXamlFile.ico\",\"unsupportedHosts\":[{\"id\":\"vs\",\"version\":\"(,17.3)\"}],\"requiredComponents\":[{\"id\":\"Microsoft.VisualStudio.ComponentGroup.Maui.All\",\"hostId\":\"vs\",\"componentType\":\"SetupComponent\"}]}","PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"NewContent1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"生成的代码的命名空间。","Name":"namespace","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"MauiApp1","DataType":null,"DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"生成的代码的命名空间。","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.maui.templates.net9.9.0.0.nupkg","Author":"Microsoft","Classifications":["MAUI","Android","iOS","macOS","Mac Catalyst","WinUI","Tizen","Xaml","Code"],"DefaultName":"NewContent1","Description":"A view for displaying content using C#. This is very suitable for creating your own custom and reusable controls.","Identity":"Microsoft.Maui.CSharpContentView.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Maui.CSharpContentView","Precedence":9000,"Name":".NET MAUI ContentView (C#)","ShortNameList":["maui-view-csharp"],"PreferDefaultName":false,"ConfigPlace":"/content/templates/maui-contentview-csharp/.template.config/template.json","LocaleConfigPlace":"/content/templates/maui-contentview-csharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/templates/maui-contentview-csharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"appliesTo\":\"UseMaui\",\"defaultItemExtension\":\"cs\",\"itemHierarchyPaths\":[\".NET MAUI\"],\"icon\":\"ide/MauiContentViewCSFile.ico\",\"unsupportedHosts\":[{\"id\":\"vs\",\"version\":\"(,17.3)\"}],\"requiredComponents\":[{\"id\":\"Microsoft.VisualStudio.ComponentGroup.Maui.All\",\"hostId\":\"vs\",\"componentType\":\"SetupComponent\"}]}","PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"MauiApp.1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"替代项目中的 $(ApplicationId)","Name":"applicationId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":null,"DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代项目中的 $(ApplicationId)","DisplayName":"","AllowMultipleValues":false},{"Choices":{},"Documentation":"","Description":"","DefaultValue":"9.0.0","Name":"msExtensionsLoggingDebugVersion","DisplayName":"","IsName":false,"Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"The target framework for the project.","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net9.0":{"DisplayName":"","Description":"Target net9.0"}},"Description":"The target framework for the project.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Configures whether to add sample pages and functionality to demonstrate basic usage patterns.","Name":"IncludeSampleContent","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Configures whether to add sample pages and functionality to demonstrate basic usage patterns.","DisplayName":"_Include sample content","AllowMultipleValues":false},{"Documentation":"If specified, skips the automatic restore of the project on create.","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"If specified, skips the automatic restore of the project on create.","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.maui.templates.net9.9.0.0.nupkg","Author":"Microsoft","Classifications":["MAUI","Android","iOS","macOS","Mac Catalyst","Windows","Tizen","Mobile"],"DefaultName":"MauiApp1","Description":"用于创建适用于 iOS、Android、Mac Catalyst、Tizen 和 WinUI 的 .NET MAUI 应用程序的项目","Identity":"Microsoft.Maui.MauiApp.CSharp.9.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Maui.App","Precedence":9000,"Name":".NET MAUI应用","ShortNameList":["maui"],"PreferDefaultName":false,"ConfigPlace":"/content/templates/maui-mobile/.template.config/template.json","LocaleConfigPlace":"/content/templates/maui-mobile/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/templates/maui-mobile/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"icon\":\"ide/icon.ico\",\"unsupportedHosts\":[{\"id\":\"vs\",\"version\":\"(,17.3)\"}],\"requiredComponents\":[{\"id\":\"Microsoft.VisualStudio.ComponentGroup.Maui.All\",\"hostId\":\"vs\",\"componentType\":\"SetupComponent\"}],\"symbolInfo\":[{\"id\":\"Framework\",\"persistenceScope\":\"shared\",\"persistenceScopeName\":\"maui\"},{\"id\":\"IncludeSampleContent\",\"isVisible\":true,\"persistenceScope\":\"shared\",\"persistenceScopeName\":\"maui\"}]}","PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6","210d431b-a78b-4d2f-b762-4ed3e3ea9025"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"MauiLib1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"The target framework for the project.","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net8.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net8.0":{"DisplayName":"","Description":"Target net8.0"}},"Description":"The target framework for the project.","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.maui.templates.net8.8.0.83.nupkg","Author":"Microsoft","Classifications":["MAUI","Android","iOS","macOS","Mac Catalyst","Windows","Tizen","Mobile"],"DefaultName":"MauiLib1","Description":"用于创建 .NET MAUI 类库的项目","Identity":"Microsoft.Maui.MauiLib.CSharp.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Maui.Library","Precedence":8000,"Name":".NET MAUI类库","ShortNameList":["mauilib"],"PreferDefaultName":false,"ConfigPlace":"/content/templates/maui-lib/.template.config/template.json","LocaleConfigPlace":"/content/templates/maui-lib/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/templates/maui-lib/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"icon\":\"ide/icon.ico\",\"unsupportedHosts\":[{\"id\":\"vs\",\"version\":\"(,17.3)\"}],\"requiredComponents\":[{\"id\":\"Microsoft.VisualStudio.ComponentGroup.Maui.All\",\"hostId\":\"vs\",\"componentType\":\"SetupComponent\"}],\"symbolInfo\":[{\"id\":\"Framework\",\"persistenceScope\":\"shared\",\"persistenceScopeName\":\"maui\"}]}","PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"MauiApp.1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"替代项目中的 $(ApplicationId)","Name":"applicationId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":null,"DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代项目中的 $(ApplicationId)","DisplayName":"","AllowMultipleValues":false},{"Choices":{},"Documentation":"","Description":"","DefaultValue":"8.0.1","Name":"msExtensionsLoggingDebugVersion","DisplayName":"","IsName":false,"Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"The target framework for the project.","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net8.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net8.0":{"DisplayName":"","Description":"Target net8.0"}},"Description":"The target framework for the project.","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.maui.templates.net8.8.0.83.nupkg","Author":"Microsoft","Classifications":["MAUI","Android","iOS","macOS","Mac Catalyst","Windows","Tizen","Blazor","Blazor Hybrid","Mobile"],"DefaultName":"MauiApp1","Description":"用于使用 Blazor 创建适用于 iOS、Android、Mac Catalyst、Tizen 和 WinUI 的 .NET MAUI 应用程序的项目","Identity":"Microsoft.Maui.BlazorApp.CSharp.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Maui.BlazorApp","Precedence":8000,"Name":".NET MAUI Blazor 应用","ShortNameList":["maui-blazor"],"PreferDefaultName":false,"ConfigPlace":"/content/templates/maui-blazor/.template.config/template.json","LocaleConfigPlace":"/content/templates/maui-blazor/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/templates/maui-blazor/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"icon\":\"ide/icon.ico\",\"unsupportedHosts\":[{\"id\":\"vs\",\"version\":\"(,17.3)\"}],\"requiredComponents\":[{\"id\":\"Microsoft.VisualStudio.ComponentGroup.Maui.Blazor\",\"hostId\":\"vs\",\"componentType\":\"SetupComponent\"}],\"symbolInfo\":[{\"id\":\"Framework\",\"persistenceScope\":\"shared\",\"persistenceScopeName\":\"maui\"}]}","PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"NewContent1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"生成的代码的命名空间。","Name":"namespace","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"MauiApp1","DataType":null,"DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"生成的代码的命名空间。","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.maui.templates.net8.8.0.83.nupkg","Author":"Microsoft","Classifications":["MAUI","Android","iOS","macOS","Mac Catalyst","WinUI","Tizen","Xaml","Code"],"DefaultName":"NewContent1","Description":"A view for displaying content using C#. This is very suitable for creating your own custom and reusable controls.","Identity":"Microsoft.Maui.CSharpContentView.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Maui.CSharpContentView","Precedence":8000,"Name":".NET MAUI ContentView (C#)","ShortNameList":["maui-view-csharp"],"PreferDefaultName":false,"ConfigPlace":"/content/templates/maui-contentview-csharp/.template.config/template.json","LocaleConfigPlace":"/content/templates/maui-contentview-csharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/templates/maui-contentview-csharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"appliesTo\":\"UseMaui\",\"defaultItemExtension\":\"cs\",\"itemHierarchyPaths\":[\".NET MAUI\"],\"icon\":\"ide/MauiContentViewCSFile.ico\",\"unsupportedHosts\":[{\"id\":\"vs\",\"version\":\"(,17.3)\"}],\"requiredComponents\":[{\"id\":\"Microsoft.VisualStudio.ComponentGroup.Maui.All\",\"hostId\":\"vs\",\"componentType\":\"SetupComponent\"}]}","PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"NewPage1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"生成的代码的命名空间。","Name":"namespace","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"MauiApp1","DataType":null,"DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"生成的代码的命名空间。","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.maui.templates.net8.8.0.83.nupkg","Author":"Microsoft","Classifications":["MAUI","Android","iOS","macOS","Mac Catalyst","WinUI","Tizen","Xaml","Code"],"DefaultName":"NewPage1","Description":"A page for displaying content using C#.","Identity":"Microsoft.Maui.CSharpContentPage.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Maui.CSharpContentPage","Precedence":8000,"Name":".NET MAUI ContentPage (C#)","ShortNameList":["maui-page-csharp"],"PreferDefaultName":false,"ConfigPlace":"/content/templates/maui-contentpage-csharp/.template.config/template.json","LocaleConfigPlace":"/content/templates/maui-contentpage-csharp/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/templates/maui-contentpage-csharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"appliesTo\":\"UseMaui\",\"defaultItemExtension\":\"cs\",\"itemHierarchyPaths\":[\".NET MAUI\"],\"icon\":\"ide/MauiPageCSFile.ico\",\"unsupportedHosts\":[{\"id\":\"vs\",\"version\":\"(,17.3)\"}],\"requiredComponents\":[{\"id\":\"Microsoft.VisualStudio.ComponentGroup.Maui.All\",\"hostId\":\"vs\",\"componentType\":\"SetupComponent\"}]}","PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"Dictionary1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"Namespace for the generated code.","Name":"namespace","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"MauiApp1","DataType":null,"DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"Namespace for the generated code.","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.maui.templates.net8.8.0.83.nupkg","Author":"Microsoft","Classifications":["MAUI","Android","iOS","macOS","Mac Catalyst","WinUI","Xaml","Code"],"DefaultName":"Dictionary1","Description":"A repository for resources that are used by a .NET MAUI app. Typical resources that are stored in a ResourceDictionary include styles, control templates, data templates, converters, and colors.","Identity":"Microsoft.Maui.XamlResourceDictionary.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Maui.XamlResourceDictionary","Precedence":8000,"Name":".NET MAUI ResourceDictionary (XAML)","ShortNameList":["maui-dict-xaml"],"PreferDefaultName":false,"ConfigPlace":"/content/templates/maui-resourcedictionary-xaml/.template.config/template.json","LocaleConfigPlace":"/content/templates/maui-resourcedictionary-xaml/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/templates/maui-resourcedictionary-xaml/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"appliesTo\":\"UseMaui\",\"defaultItemExtension\":\"xaml\",\"itemHierarchyPaths\":[\".NET MAUI\"],\"icon\":\"ide/MauiResourceDictionaryXamlFile.ico\",\"unsupportedHosts\":[{\"id\":\"vs\",\"version\":\"(,17.3)\"}],\"requiredComponents\":[{\"id\":\"Microsoft.VisualStudio.ComponentGroup.Maui.All\",\"hostId\":\"vs\",\"componentType\":\"SetupComponent\"}]}","PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"NewContent1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"生成的代码的命名空间。","Name":"namespace","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"MauiApp1","DataType":null,"DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"生成的代码的命名空间。","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.maui.templates.net8.8.0.83.nupkg","Author":"Microsoft","Classifications":["MAUI","Android","iOS","macOS","Mac Catalyst","WinUI","Tizen","Xaml","Code"],"DefaultName":"NewContent1","Description":"A view for displaying content using XAML. This is very suitable for creating your own custom and reusable controls.","Identity":"Microsoft.Maui.XamlContentView.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Maui.XamlContentView","Precedence":8000,"Name":".NET MAUI ContentView (XAML)","ShortNameList":["maui-view-xaml"],"PreferDefaultName":false,"ConfigPlace":"/content/templates/maui-contentview-xaml/.template.config/template.json","LocaleConfigPlace":"/content/templates/maui-contentview-xaml/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/templates/maui-contentview-xaml/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"appliesTo\":\"UseMaui\",\"defaultItemExtension\":\"xaml\",\"itemHierarchyPaths\":[\".NET MAUI\"],\"icon\":\"ide/MauiContentViewXamlFile.ico\",\"unsupportedHosts\":[{\"id\":\"vs\",\"version\":\"(,17.3)\"}],\"requiredComponents\":[{\"id\":\"Microsoft.VisualStudio.ComponentGroup.Maui.All\",\"hostId\":\"vs\",\"componentType\":\"SetupComponent\"}]}","PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"MauiApp.1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"project":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"project","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"替代项目中的 $(ApplicationId)","Name":"applicationId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":null,"DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"替代项目中的 $(ApplicationId)","DisplayName":"","AllowMultipleValues":false},{"Choices":{},"Documentation":"","Description":"","DefaultValue":"8.0.1","Name":"msExtensionsLoggingDebugVersion","DisplayName":"","IsName":false,"Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"The target framework for the project.","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net8.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net8.0":{"DisplayName":"","Description":"Target net8.0"}},"Description":"The target framework for the project.","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.maui.templates.net8.8.0.83.nupkg","Author":"Microsoft","Classifications":["MAUI","Android","iOS","macOS","Mac Catalyst","Windows","Tizen","Mobile"],"DefaultName":"MauiApp1","Description":"用于创建适用于 iOS、Android、Mac Catalyst、Tizen 和 WinUI 的 .NET MAUI 应用程序的项目","Identity":"Microsoft.Maui.MauiApp.CSharp.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Maui.App","Precedence":8000,"Name":".NET MAUI应用","ShortNameList":["maui"],"PreferDefaultName":false,"ConfigPlace":"/content/templates/maui-mobile/.template.config/template.json","LocaleConfigPlace":"/content/templates/maui-mobile/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/templates/maui-mobile/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"icon\":\"ide/icon.ico\",\"unsupportedHosts\":[{\"id\":\"vs\",\"version\":\"(,17.3)\"}],\"requiredComponents\":[{\"id\":\"Microsoft.VisualStudio.ComponentGroup.Maui.All\",\"hostId\":\"vs\",\"componentType\":\"SetupComponent\"}],\"symbolInfo\":[{\"id\":\"Framework\",\"persistenceScope\":\"shared\",\"persistenceScopeName\":\"maui\"}]}","PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"MauiApp.1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"solution":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"solution","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"Overrides the $(ApplicationId) in the project","Name":"applicationId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":null,"DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"Overrides the $(ApplicationId) in the project","DisplayName":"","AllowMultipleValues":false},{"Choices":{},"Documentation":"","Description":"","DefaultValue":"8.0.1","Name":"msExtensionsLoggingDebugVersion","DisplayName":"","IsName":false,"Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"The target framework for the project.","Name":"Framework","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net8.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net8.0":{"DisplayName":"","Description":"Target net8.0"}},"Description":"The target framework for the project.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Include the Android app head project","Name":"android","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Include the Android app head project","DisplayName":"Android","AllowMultipleValues":false},{"Documentation":"Include the iOS app head project","Name":"ios","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Include the iOS app head project","DisplayName":"iOS","AllowMultipleValues":false},{"Documentation":"Include the macOS app head project (using Mac Catalyst)","Name":"maccatalyst","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Include the macOS app head project (using Mac Catalyst)","DisplayName":"macOS using Mac Catalyst","AllowMultipleValues":false},{"Documentation":"Include the Windows app head project (using WinUI 3)","Name":"winui","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Include the Windows app head project (using WinUI 3)","DisplayName":"Windows using WinUI 3","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.maui.templates.net8.8.0.83.nupkg","Author":"Microsoft","Classifications":["MAUI","Android","iOS","macOS","Mac Catalyst","Windows","Mobile"],"DefaultName":"MauiApp1","Description":"A project for creating a .NET MAUI application for iOS, Android, Mac Catalyst and WinUI with multiple, separate app projects.","Identity":"Microsoft.Maui.MultiProjectApp.CSharp.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Maui.MultiProjectApp","Precedence":8000,"Name":".NET MAUI Multi-Project App","ShortNameList":["maui-multiproject"],"PreferDefaultName":false,"ConfigPlace":"/content/templates/maui-multiproject/.template.config/template.json","LocaleConfigPlace":"/content/templates/maui-multiproject/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/templates/maui-multiproject/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"solution"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"icon\":\"ide/icon.ico\",\"unsupportedHosts\":[{\"id\":\"vs\",\"version\":\"(,17.3)\"}],\"requiredComponents\":[{\"id\":\"Microsoft.VisualStudio.ComponentGroup.Maui.All\",\"hostId\":\"vs\",\"componentType\":\"SetupComponent\"}],\"symbolInfo\":[{\"id\":\"Framework\",\"persistenceScope\":\"shared\",\"persistenceScopeName\":\"maui\"},{\"id\":\"android\",\"isVisible\":true,\"defaultValue\":\"true\"},{\"id\":\"ios\",\"isVisible\":true,\"defaultValue\":\"true\"},{\"id\":\"maccatalyst\",\"isVisible\":true,\"defaultValue\":\"true\"},{\"id\":\"winui\",\"isVisible\":true,\"defaultValue\":\"true\"}]}","PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Choices":null,"Documentation":"The default name symbol","Description":"The default name symbol","DefaultValue":"NewPage1","Name":"name","DisplayName":null,"IsName":true,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"string","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"C#":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"C#","Name":"language","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Choices":{"item":{"DisplayName":"","Description":""}},"Documentation":null,"Description":null,"DefaultValue":"item","Name":"type","DisplayName":null,"IsName":false,"Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","DataType":"choice","DefaultIfOptionWithoutValue":null,"AllowMultipleValues":false,"EnableQuotelessLiterals":false},{"Documentation":"生成的代码的命名空间","Name":"namespace","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"MauiApp1","DataType":null,"DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"生成的代码的命名空间","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Program Files\\dotnet\\template-packs\\microsoft.maui.templates.net8.8.0.83.nupkg","Author":"Microsoft","Classifications":["MAUI","Android","iOS","macOS","Mac Catalyst","WinUI","Tizen","Xaml","Code"],"DefaultName":"NewPage1","Description":"A page for displaying content using XAML.","Identity":"Microsoft.Maui.XamlContentPage.8.0","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Maui.XamlContentPage","Precedence":8000,"Name":".NET MAUI ContentPage (XAML)","ShortNameList":["maui-page-xaml"],"PreferDefaultName":false,"ConfigPlace":"/content/templates/maui-contentpage-xaml/.template.config/template.json","LocaleConfigPlace":"/content/templates/maui-contentpage-xaml/.template.config/localize/templatestrings.zh-Hans.json","HostConfigPlace":"/content/templates/maui-contentpage-xaml/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"item"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"appliesTo\":\"UseMaui\",\"defaultItemExtension\":\"xaml\",\"itemHierarchyPaths\":[\".NET MAUI\"],\"icon\":\"ide/MauiPageXamlFile.ico\",\"unsupportedHosts\":[{\"id\":\"vs\",\"version\":\"(,17.3)\"}],\"requiredComponents\":[{\"id\":\"Microsoft.VisualStudio.ComponentGroup.Maui.All\",\"hostId\":\"vs\",\"componentType\":\"SetupComponent\"}]}","PostActions":["84c0da21-51c8-4541-9940-6ca19af04ee6"],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"unused","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"C#","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"C#":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"isFallback","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"true":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false}],"MountPointUri":"c:\\program files\\microsoft visual studio\\2022\\community\\common7\\ide\\extensions\\microsoft\\templateengine\\Microsoft.VisualStudio.TemplateEngine.FallbackHostData.17.12.178.nupkg","Author":"Microsoft","Classifications":["Common","Console"],"DefaultName":null,"Description":"","Identity":"Microsoft.Common.Console.CSharp.Fallback","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.Console","Precedence":6500,"Name":"Console Application","ShortNameList":["console"],"PreferDefaultName":false,"ConfigPlace":"/content/Microsoft.Common.Console.CSharp/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/Microsoft.Common.Console.CSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project","isFallback":"true"},"HostData":"{\"$schema\":\"http://json.schemastore.org/vs-2017.3.host\",\"icon\":\"ide/ConsoleApplicationCS.ico\",\"order\":10,\"tags\":[{\"type\":\"projectType\",\"add\":[],\"remove\":[\"Common\"]}],\"isFallback\":\"true\"}","PostActions":[],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"unused","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"F#","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"F#":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"isFallback","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"true":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false}],"MountPointUri":"c:\\program files\\microsoft visual studio\\2022\\community\\common7\\ide\\extensions\\microsoft\\templateengine\\Microsoft.VisualStudio.TemplateEngine.FallbackHostData.17.12.178.nupkg","Author":"Microsoft","Classifications":["Common","Console"],"DefaultName":null,"Description":"","Identity":"Microsoft.Common.Console.FSharp.Fallback","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.Console","Precedence":6500,"Name":"Console Application","ShortNameList":["console"],"PreferDefaultName":false,"ConfigPlace":"/content/Microsoft.Common.Console.FSharp/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/Microsoft.Common.Console.FSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"F#","type":"project","isFallback":"true"},"HostData":"{\"$schema\":\"http://json.schemastore.org/vs-2017.3.host\",\"icon\":\"ide/FSharpApplication_32.ico\",\"order\":10,\"tags\":[{\"type\":\"projectType\",\"add\":[],\"remove\":[\"Common\"]}],\"isFallback\":\"true\"}","PostActions":[],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"unused","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"VB","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"VB":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"isFallback","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"true":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false}],"MountPointUri":"c:\\program files\\microsoft visual studio\\2022\\community\\common7\\ide\\extensions\\microsoft\\templateengine\\Microsoft.VisualStudio.TemplateEngine.FallbackHostData.17.12.178.nupkg","Author":"Microsoft","Classifications":["Common","Console"],"DefaultName":null,"Description":"","Identity":"Microsoft.Common.Console.VisualBasic.Fallback","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.Console","Precedence":6500,"Name":"Console Application","ShortNameList":["console"],"PreferDefaultName":false,"ConfigPlace":"/content/Microsoft.Common.Console.VisualBasic/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/Microsoft.Common.Console.VisualBasic/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"project","isFallback":"true"},"HostData":"{\"$schema\":\"http://json.schemastore.org/vs-2017.3.host\",\"icon\":\"ide/ConsoleApplicationVB.ico\",\"order\":10,\"tags\":[{\"type\":\"projectType\",\"add\":[],\"remove\":[\"Common\"]}],\"isFallback\":\"true\"}","PostActions":[],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"unused","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"C#","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"C#":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"isFallback","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"true":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false}],"MountPointUri":"c:\\program files\\microsoft visual studio\\2022\\community\\common7\\ide\\extensions\\microsoft\\templateengine\\Microsoft.VisualStudio.TemplateEngine.FallbackHostData.17.12.178.nupkg","Author":"Microsoft","Classifications":["Common","Library"],"DefaultName":null,"Description":"","Identity":"Microsoft.Common.Library.CSharp.Fallback","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.Library","Precedence":6500,"Name":"Class library","ShortNameList":["library"],"PreferDefaultName":false,"ConfigPlace":"/content/Microsoft.Common.Library.CSharp/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/Microsoft.Common.Library.CSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project","isFallback":"true"},"HostData":"{\"$schema\":\"http://json.schemastore.org/vs-2017.3.host\",\"icon\":\"ide/ClassLibraryCS.ico\",\"order\":20,\"tags\":[{\"type\":\"projectType\",\"add\":[],\"remove\":[\"Common\"]}],\"isFallback\":\"true\"}","PostActions":[],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"unused","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"F#","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"F#":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"isFallback","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"true":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false}],"MountPointUri":"c:\\program files\\microsoft visual studio\\2022\\community\\common7\\ide\\extensions\\microsoft\\templateengine\\Microsoft.VisualStudio.TemplateEngine.FallbackHostData.17.12.178.nupkg","Author":"Microsoft","Classifications":["Common","Library"],"DefaultName":null,"Description":"","Identity":"Microsoft.Common.Library.FSharp.Fallback","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.Library","Precedence":6500,"Name":"Class library","ShortNameList":["library"],"PreferDefaultName":false,"ConfigPlace":"/content/Microsoft.Common.Library.FSharp/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/Microsoft.Common.Library.FSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"F#","type":"project","isFallback":"true"},"HostData":"{\"$schema\":\"http://json.schemastore.org/vs-2017.3.host\",\"icon\":\"ide/FSharpLibrary.ico\",\"order\":20,\"tags\":[{\"type\":\"projectType\",\"add\":[],\"remove\":[\"Common\"]}],\"isFallback\":\"true\"}","PostActions":[],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"unused","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"VB","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"VB":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"isFallback","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"true":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false}],"MountPointUri":"c:\\program files\\microsoft visual studio\\2022\\community\\common7\\ide\\extensions\\microsoft\\templateengine\\Microsoft.VisualStudio.TemplateEngine.FallbackHostData.17.12.178.nupkg","Author":"Microsoft","Classifications":["Common","Library"],"DefaultName":null,"Description":"","Identity":"Microsoft.Common.Library.VisualBasic.Fallback","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.Library","Precedence":6500,"Name":"Class library","ShortNameList":["library"],"PreferDefaultName":false,"ConfigPlace":"/content/Microsoft.Common.Library.VisualBasic/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/Microsoft.Common.Library.VisualBasic/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"project","isFallback":"true"},"HostData":"{\"$schema\":\"http://json.schemastore.org/vs-2017.3.host\",\"icon\":\"ide/ClassLibraryVB.ico\",\"order\":20,\"tags\":[{\"type\":\"projectType\",\"add\":[],\"remove\":[\"Common\"]}],\"isFallback\":\"true\"}","PostActions":[],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"unused","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"C#","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"C#":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"isFallback","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"true":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false}],"MountPointUri":"c:\\program files\\microsoft visual studio\\2022\\community\\common7\\ide\\extensions\\microsoft\\templateengine\\Microsoft.VisualStudio.TemplateEngine.FallbackHostData.17.12.178.nupkg","Author":"Microsoft","Classifications":["Common","WinForms"],"DefaultName":null,"Description":"","Identity":"Microsoft.Common.WinForms.ControlLibrary.CSharp.Fallback","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.WinForms.ControlLibrary","Precedence":6500,"Name":"Windows Forms (WinForms) Control library","ShortNameList":["winformscontrollib"],"PreferDefaultName":false,"ConfigPlace":"/content/Microsoft.Common.WinForms.ControlLibrary.CSharp/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/Microsoft.Common.WinForms.ControlLibrary.CSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project","isFallback":"true"},"HostData":"{\"$schema\":\"http://json.schemastore.org/vs-2017.3.host\",\"icon\":\"ide/WinControlCS.ico\",\"tags\":[{\"type\":\"projectType\",\"add\":[\"Desktop\",\"Library\"],\"remove\":[\"Common\",\"WinForms\"]}],\"isFallback\":\"true\"}","PostActions":[],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"unused","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"VB","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"VB":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"isFallback","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"true":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false}],"MountPointUri":"c:\\program files\\microsoft visual studio\\2022\\community\\common7\\ide\\extensions\\microsoft\\templateengine\\Microsoft.VisualStudio.TemplateEngine.FallbackHostData.17.12.178.nupkg","Author":"Microsoft","Classifications":["Common","WinForms"],"DefaultName":null,"Description":"","Identity":"Microsoft.Common.WinForms.ControlLibrary.VisualBasic.Fallback","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.WinForms.ControlLibrary","Precedence":6500,"Name":"Windows Forms (WinForms) Control library","ShortNameList":["winformscontrollib"],"PreferDefaultName":false,"ConfigPlace":"/content/Microsoft.Common.WinForms.ControlLibrary.VisualBasic/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/Microsoft.Common.WinForms.ControlLibrary.VisualBasic/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"project","isFallback":"true"},"HostData":"{\"$schema\":\"http://json.schemastore.org/vs-2017.3.host\",\"icon\":\"ide/WinControlVB.ico\",\"tags\":[{\"type\":\"projectType\",\"add\":[\"Desktop\",\"Library\"],\"remove\":[\"Common\",\"WinForms\"]}],\"isFallback\":\"true\"}","PostActions":[],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"unused","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"C#","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"C#":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"isFallback","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"true":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false}],"MountPointUri":"c:\\program files\\microsoft visual studio\\2022\\community\\common7\\ide\\extensions\\microsoft\\templateengine\\Microsoft.VisualStudio.TemplateEngine.FallbackHostData.17.12.178.nupkg","Author":"Microsoft","Classifications":["Common","WinForms"],"DefaultName":null,"Description":"","Identity":"Microsoft.Common.WinForms.CSharp.Fallback","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.WinForms","Precedence":6500,"Name":"Windows Forms (WinForms) Application","ShortNameList":["winforms"],"PreferDefaultName":false,"ConfigPlace":"/content/Microsoft.Common.WinForms.CSharp/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/Microsoft.Common.WinForms.CSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project","isFallback":"true"},"HostData":"{\"$schema\":\"http://json.schemastore.org/vs-2017.3.host\",\"icon\":\"ide/WinApplicationCS.ico\",\"tags\":[{\"type\":\"projectType\",\"add\":[\"Desktop\"],\"remove\":[\"Common\",\"WinForms\"]}],\"isFallback\":\"true\"}","PostActions":[],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"unused","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"C#","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"C#":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"isFallback","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"true":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false}],"MountPointUri":"c:\\program files\\microsoft visual studio\\2022\\community\\common7\\ide\\extensions\\microsoft\\templateengine\\Microsoft.VisualStudio.TemplateEngine.FallbackHostData.17.12.178.nupkg","Author":"Microsoft","Classifications":["Common","WinForms"],"DefaultName":null,"Description":"","Identity":"Microsoft.Common.WinForms.Library.CSharp.Fallback","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.WinForms.Library","Precedence":6500,"Name":"Windows Forms (WinForms) Class library","ShortNameList":["winformslib"],"PreferDefaultName":false,"ConfigPlace":"/content/Microsoft.Common.WinForms.Library.CSharp/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/Microsoft.Common.WinForms.Library.CSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project","isFallback":"true"},"HostData":"{\"$schema\":\"http://json.schemastore.org/vs-2017.3.host\",\"icon\":\"ide/WinControlCS.ico\",\"tags\":[{\"type\":\"projectType\",\"add\":[\"Desktop\",\"Library\"],\"remove\":[\"Common\",\"WinForms\"]}],\"isFallback\":\"true\"}","PostActions":[],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"unused","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"VB","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"VB":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"isFallback","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"true":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false}],"MountPointUri":"c:\\program files\\microsoft visual studio\\2022\\community\\common7\\ide\\extensions\\microsoft\\templateengine\\Microsoft.VisualStudio.TemplateEngine.FallbackHostData.17.12.178.nupkg","Author":"Microsoft","Classifications":["Common","WinForms"],"DefaultName":null,"Description":"","Identity":"Microsoft.Common.WinForms.Library.VisualBasic.Fallback","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.WinForms.Library","Precedence":6500,"Name":"Windows Forms (WinForms) Class library","ShortNameList":["winformslib"],"PreferDefaultName":false,"ConfigPlace":"/content/Microsoft.Common.WinForms.Library.VisualBasic/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/Microsoft.Common.WinForms.Library.VisualBasic/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"project","isFallback":"true"},"HostData":"{\"$schema\":\"http://json.schemastore.org/vs-2017.3.host\",\"icon\":\"ide/WinControlVB.ico\",\"tags\":[{\"type\":\"projectType\",\"add\":[\"Desktop\",\"Library\"],\"remove\":[\"Common\",\"WinForms\"]}],\"isFallback\":\"true\"}","PostActions":[],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"unused","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"VB","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"VB":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"isFallback","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"true":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false}],"MountPointUri":"c:\\program files\\microsoft visual studio\\2022\\community\\common7\\ide\\extensions\\microsoft\\templateengine\\Microsoft.VisualStudio.TemplateEngine.FallbackHostData.17.12.178.nupkg","Author":"Microsoft","Classifications":["Common","WinForms"],"DefaultName":null,"Description":"","Identity":"Microsoft.Common.WinForms.VisualBasic.Fallback","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.WinForms","Precedence":6500,"Name":"Windows Forms (WinForms) Application","ShortNameList":["winforms"],"PreferDefaultName":false,"ConfigPlace":"/content/Microsoft.Common.WinForms.VisualBasic/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/Microsoft.Common.WinForms.VisualBasic/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"project","isFallback":"true"},"HostData":"{\"$schema\":\"http://json.schemastore.org/vs-2017.3.host\",\"icon\":\"ide/WinApplicationVB.ico\",\"tags\":[{\"type\":\"projectType\",\"add\":[\"Desktop\"],\"remove\":[\"Common\",\"WinForms\"]}],\"isFallback\":\"true\"}","PostActions":[],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"unused","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"C#","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"C#":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"isFallback","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"true":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false}],"MountPointUri":"c:\\program files\\microsoft visual studio\\2022\\community\\common7\\ide\\extensions\\microsoft\\templateengine\\Microsoft.VisualStudio.TemplateEngine.FallbackHostData.17.12.178.nupkg","Author":"Microsoft","Classifications":["Common","WPF"],"DefaultName":null,"Description":"","Identity":"Microsoft.Common.WPF.Control.CSharp.Fallback","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.WPF.Control","Precedence":6500,"Name":"WPF User Control Library","ShortNameList":["wpfusercontrollib"],"PreferDefaultName":false,"ConfigPlace":"/content/Microsoft.Common.WPF.Control.CSharp/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/Microsoft.Common.WPF.Control.CSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project","isFallback":"true"},"HostData":"{\"$schema\":\"http://json.schemastore.org/vs-2017.3.host\",\"icon\":\"ide/WPFUserControlCSharp.ico\",\"tags\":[{\"type\":\"projectType\",\"add\":[\"Desktop\",\"Library\"],\"remove\":[\"Common\",\"WPF\"]}],\"isFallback\":\"true\"}","PostActions":[],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"unused","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"VB","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"VB":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"isFallback","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"true":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false}],"MountPointUri":"c:\\program files\\microsoft visual studio\\2022\\community\\common7\\ide\\extensions\\microsoft\\templateengine\\Microsoft.VisualStudio.TemplateEngine.FallbackHostData.17.12.178.nupkg","Author":"Microsoft","Classifications":["Common","WPF"],"DefaultName":null,"Description":"","Identity":"Microsoft.Common.WPF.Control.VisualBasic.Fallback","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.WPF.Control","Precedence":6500,"Name":"WPF User Control Library","ShortNameList":["wpfusercontrollib"],"PreferDefaultName":false,"ConfigPlace":"/content/Microsoft.Common.WPF.Control.VisualBasic/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/Microsoft.Common.WPF.Control.VisualBasic/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"project","isFallback":"true"},"HostData":"{\"$schema\":\"http://json.schemastore.org/vs-2017.3.host\",\"icon\":\"ide/WPFUserControlVB.ico\",\"tags\":[{\"type\":\"projectType\",\"add\":[\"Desktop\",\"Library\"],\"remove\":[\"Common\",\"WPF\"]}],\"isFallback\":\"true\"}","PostActions":[],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"unused","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"C#","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"C#":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"isFallback","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"true":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false}],"MountPointUri":"c:\\program files\\microsoft visual studio\\2022\\community\\common7\\ide\\extensions\\microsoft\\templateengine\\Microsoft.VisualStudio.TemplateEngine.FallbackHostData.17.12.178.nupkg","Author":"Microsoft","Classifications":["Common","WPF"],"DefaultName":null,"Description":"","Identity":"Microsoft.Common.WPF.CSharp.Fallback","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.WPF","Precedence":6500,"Name":"WPF Application","ShortNameList":["wpf"],"PreferDefaultName":false,"ConfigPlace":"/content/Microsoft.Common.WPF.CSharp/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/Microsoft.Common.WPF.CSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project","isFallback":"true"},"HostData":"{\"$schema\":\"http://json.schemastore.org/vs-2017.3.host\",\"icon\":\"ide/WPFAppCSharp.ico\",\"tags\":[{\"type\":\"projectType\",\"add\":[\"Desktop\"],\"remove\":[\"Common\",\"WPF\"]}],\"isFallback\":\"true\"}","PostActions":[],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"unused","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"C#","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"C#":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"isFallback","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"true":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false}],"MountPointUri":"c:\\program files\\microsoft visual studio\\2022\\community\\common7\\ide\\extensions\\microsoft\\templateengine\\Microsoft.VisualStudio.TemplateEngine.FallbackHostData.17.12.178.nupkg","Author":"Microsoft","Classifications":["Common","WPF"],"DefaultName":null,"Description":"","Identity":"Microsoft.Common.WPF.CustomControl.CSharp.Fallback","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.WPF.CustomControl","Precedence":6500,"Name":"WPF Custom Control Library","ShortNameList":["wpfcustomcontrollib"],"PreferDefaultName":false,"ConfigPlace":"/content/Microsoft.Common.WPF.CustomControl.CSharp/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/Microsoft.Common.WPF.CustomControl.CSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project","isFallback":"true"},"HostData":"{\"$schema\":\"http://json.schemastore.org/vs-2017.3.host\",\"icon\":\"ide/WPFCustomControlCSharp.ico\",\"tags\":[{\"type\":\"projectType\",\"add\":[\"Desktop\",\"Library\"],\"remove\":[\"Common\",\"WPF\"]}],\"isFallback\":\"true\"}","PostActions":[],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"unused","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"VB","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"VB":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"isFallback","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"true":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false}],"MountPointUri":"c:\\program files\\microsoft visual studio\\2022\\community\\common7\\ide\\extensions\\microsoft\\templateengine\\Microsoft.VisualStudio.TemplateEngine.FallbackHostData.17.12.178.nupkg","Author":"Microsoft","Classifications":["Common","WPF"],"DefaultName":null,"Description":"","Identity":"Microsoft.Common.WPF.CustomControl.VisualBasic.Fallback","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.WPF.CustomControl","Precedence":6500,"Name":"WPF Custom Control Library","ShortNameList":["wpfcustomcontrollib"],"PreferDefaultName":false,"ConfigPlace":"/content/Microsoft.Common.WPF.CustomControl.VisualBasic/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/Microsoft.Common.WPF.CustomControl.VisualBasic/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"project","isFallback":"true"},"HostData":"{\"$schema\":\"http://json.schemastore.org/vs-2017.3.host\",\"icon\":\"ide/WPFCustomControlVB.ico\",\"tags\":[{\"type\":\"projectType\",\"add\":[\"Desktop\",\"Library\"],\"remove\":[\"Common\",\"WPF\"]}],\"isFallback\":\"true\"}","PostActions":[],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"unused","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"C#","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"C#":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"isFallback","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"true":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false}],"MountPointUri":"c:\\program files\\microsoft visual studio\\2022\\community\\common7\\ide\\extensions\\microsoft\\templateengine\\Microsoft.VisualStudio.TemplateEngine.FallbackHostData.17.12.178.nupkg","Author":"Microsoft","Classifications":["Common","WPF"],"DefaultName":null,"Description":"","Identity":"Microsoft.Common.WPF.Library.CSharp.Fallback","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.WPF.Library","Precedence":6500,"Name":"WPF Class library","ShortNameList":["wpflib"],"PreferDefaultName":false,"ConfigPlace":"/content/Microsoft.Common.WPF.Library.CSharp/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/Microsoft.Common.WPF.Library.CSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project","isFallback":"true"},"HostData":"{\"$schema\":\"http://json.schemastore.org/vs-2017.3.host\",\"icon\":\"ide/WPFAppCSharp.ico\",\"tags\":[{\"type\":\"projectType\",\"add\":[\"Desktop\",\"Library\"],\"remove\":[\"Common\",\"WPF\"]}],\"isFallback\":\"true\"}","PostActions":[],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"unused","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"VB","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"VB":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"isFallback","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"true":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false}],"MountPointUri":"c:\\program files\\microsoft visual studio\\2022\\community\\common7\\ide\\extensions\\microsoft\\templateengine\\Microsoft.VisualStudio.TemplateEngine.FallbackHostData.17.12.178.nupkg","Author":"Microsoft","Classifications":["Common","WPF"],"DefaultName":null,"Description":"","Identity":"Microsoft.Common.WPF.Library.VisualBasic.Fallback","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.WPF.Library","Precedence":6500,"Name":"WPF Class library","ShortNameList":["wpflib"],"PreferDefaultName":false,"ConfigPlace":"/content/Microsoft.Common.WPF.Library.VisualBasic/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/Microsoft.Common.WPF.Library.VisualBasic/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"project","isFallback":"true"},"HostData":"{\"$schema\":\"http://json.schemastore.org/vs-2017.3.host\",\"icon\":\"ide/WPFAppVB.ico\",\"tags\":[{\"type\":\"projectType\",\"add\":[\"Desktop\",\"Library\"],\"remove\":[\"Common\",\"WPF\"]}],\"isFallback\":\"true\"}","PostActions":[],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"unused","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"VB","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"VB":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"isFallback","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"true":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false}],"MountPointUri":"c:\\program files\\microsoft visual studio\\2022\\community\\common7\\ide\\extensions\\microsoft\\templateengine\\Microsoft.VisualStudio.TemplateEngine.FallbackHostData.17.12.178.nupkg","Author":"Microsoft","Classifications":["Common","WPF"],"DefaultName":null,"Description":"","Identity":"Microsoft.Common.WPF.VisualBasic.Fallback","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Common.WPF","Precedence":6500,"Name":"WPF Application","ShortNameList":["wpf"],"PreferDefaultName":false,"ConfigPlace":"/content/Microsoft.Common.WPF.VisualBasic/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/Microsoft.Common.WPF.VisualBasic/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"project","isFallback":"true"},"HostData":"{\"$schema\":\"http://json.schemastore.org/vs-2017.3.host\",\"icon\":\"ide/WPFAppVB.ico\",\"tags\":[{\"type\":\"projectType\",\"add\":[\"Desktop\"],\"remove\":[\"Common\",\"WPF\"]}],\"isFallback\":\"true\"}","PostActions":[],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"unused","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"C#","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"C#":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"isFallback","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"true":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false}],"MountPointUri":"c:\\program files\\microsoft visual studio\\2022\\community\\common7\\ide\\extensions\\microsoft\\templateengine\\Microsoft.VisualStudio.TemplateEngine.FallbackHostData.17.12.178.nupkg","Author":"Microsoft","Classifications":["Test","MSTest"],"DefaultName":null,"Description":"","Identity":"Microsoft.Test.MSTest.CSharp.Fallback","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Test.MSTest","Precedence":6500,"Name":"Unit Test Project","ShortNameList":["mstest"],"PreferDefaultName":false,"ConfigPlace":"/content/Microsoft.Test.MSTest.CSharp/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/Microsoft.Test.MSTest.CSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project","isFallback":"true"},"HostData":"{\"$schema\":\"http://json.schemastore.org/vs-2017.3.host\",\"icon\":\"ide/CS_NonEmpty_16X16_32X32.ico\",\"tags\":[{\"type\":\"projectType\",\"add\":[],\"remove\":[\"MSTest\"]}],\"isFallback\":\"true\"}","PostActions":[],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"unused","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"F#","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"F#":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"isFallback","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"true":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false}],"MountPointUri":"c:\\program files\\microsoft visual studio\\2022\\community\\common7\\ide\\extensions\\microsoft\\templateengine\\Microsoft.VisualStudio.TemplateEngine.FallbackHostData.17.12.178.nupkg","Author":"Microsoft","Classifications":["Test","MSTest"],"DefaultName":null,"Description":"","Identity":"Microsoft.Test.MSTest.FSharp.Fallback","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Test.MSTest","Precedence":6500,"Name":"Unit Test Project","ShortNameList":["mstest"],"PreferDefaultName":false,"ConfigPlace":"/content/Microsoft.Test.MSTest.FSharp/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/Microsoft.Test.MSTest.FSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"F#","type":"project","isFallback":"true"},"HostData":"{\"$schema\":\"http://json.schemastore.org/vs-2017.3.host\",\"icon\":\"ide/FSharpTestLibrary.ico\",\"tags\":[{\"type\":\"projectType\",\"add\":[],\"remove\":[\"MSTest\"]}],\"isFallback\":\"true\"}","PostActions":[],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"unused","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"VB","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"VB":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"isFallback","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"true":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false}],"MountPointUri":"c:\\program files\\microsoft visual studio\\2022\\community\\common7\\ide\\extensions\\microsoft\\templateengine\\Microsoft.VisualStudio.TemplateEngine.FallbackHostData.17.12.178.nupkg","Author":"Microsoft","Classifications":["Test","MSTest"],"DefaultName":null,"Description":"","Identity":"Microsoft.Test.MSTest.VisualBasic.Fallback","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Test.MSTest","Precedence":6500,"Name":"Unit Test Project","ShortNameList":["mstest"],"PreferDefaultName":false,"ConfigPlace":"/content/Microsoft.Test.MSTest.VisualBasic/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/Microsoft.Test.MSTest.VisualBasic/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"project","isFallback":"true"},"HostData":"{\"$schema\":\"http://json.schemastore.org/vs-2017.3.host\",\"icon\":\"ide/VB_NonEmpty_16X16_32X32.ico\",\"tags\":[{\"type\":\"projectType\",\"add\":[],\"remove\":[\"MSTest\"]}],\"isFallback\":\"true\"}","PostActions":[],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"unused","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"C#","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"C#":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"isFallback","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"true":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false}],"MountPointUri":"c:\\program files\\microsoft visual studio\\2022\\community\\common7\\ide\\extensions\\microsoft\\templateengine\\Microsoft.VisualStudio.TemplateEngine.FallbackHostData.17.12.178.nupkg","Author":"Microsoft","Classifications":["Test","xUnit"],"DefaultName":null,"Description":"","Identity":"Microsoft.Test.xUnit.CSharp.Fallback","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Test.xUnit","Precedence":6500,"Name":"xUnit Test Project","ShortNameList":["xunit"],"PreferDefaultName":false,"ConfigPlace":"/content/Microsoft.Test.xUnit.CSharp/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/Microsoft.Test.xUnit.CSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project","isFallback":"true"},"HostData":"{\"$schema\":\"http://json.schemastore.org/vs-2017.3.host\",\"icon\":\"ide/CS_NonEmpty_16X16_32X32.ico\",\"tags\":[{\"type\":\"projectType\",\"add\":[],\"remove\":[\"xUnit\"]}],\"isFallback\":\"true\"}","PostActions":[],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"unused","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"F#","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"F#":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"isFallback","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"true":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false}],"MountPointUri":"c:\\program files\\microsoft visual studio\\2022\\community\\common7\\ide\\extensions\\microsoft\\templateengine\\Microsoft.VisualStudio.TemplateEngine.FallbackHostData.17.12.178.nupkg","Author":"Microsoft","Classifications":["Test","xUnit"],"DefaultName":null,"Description":"","Identity":"Microsoft.Test.xUnit.FSharp.Fallback","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Test.xUnit","Precedence":6500,"Name":"xUnit Test Project","ShortNameList":["xunit"],"PreferDefaultName":false,"ConfigPlace":"/content/Microsoft.Test.xUnit.FSharp/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/Microsoft.Test.xUnit.FSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"F#","type":"project","isFallback":"true"},"HostData":"{\"$schema\":\"http://json.schemastore.org/vs-2017.3.host\",\"icon\":\"ide/FSharpTestLibrary.ico\",\"tags\":[{\"type\":\"projectType\",\"add\":[],\"remove\":[\"xUnit\"]}],\"isFallback\":\"true\"}","PostActions":[],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"unused","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"VB","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"VB":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"isFallback","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"true":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false}],"MountPointUri":"c:\\program files\\microsoft visual studio\\2022\\community\\common7\\ide\\extensions\\microsoft\\templateengine\\Microsoft.VisualStudio.TemplateEngine.FallbackHostData.17.12.178.nupkg","Author":"Microsoft","Classifications":["Test","xUnit"],"DefaultName":null,"Description":"","Identity":"Microsoft.Test.xUnit.VisualBasic.Fallback","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Test.xUnit","Precedence":6500,"Name":"xUnit Test Project","ShortNameList":["xunit"],"PreferDefaultName":false,"ConfigPlace":"/content/Microsoft.Test.xUnit.VisualBasic/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/Microsoft.Test.xUnit.VisualBasic/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"project","isFallback":"true"},"HostData":"{\"$schema\":\"http://json.schemastore.org/vs-2017.3.host\",\"icon\":\"ide/VB_NonEmpty_16X16_32X32.ico\",\"tags\":[{\"type\":\"projectType\",\"add\":[],\"remove\":[\"xUnit\"]}],\"isFallback\":\"true\"}","PostActions":[],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"unused","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"F#","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"F#":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"isFallback","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"true":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false}],"MountPointUri":"c:\\program files\\microsoft visual studio\\2022\\community\\common7\\ide\\extensions\\microsoft\\templateengine\\Microsoft.VisualStudio.TemplateEngine.FallbackHostData.17.12.178.nupkg","Author":"Microsoft","Classifications":["Web","MVC"],"DefaultName":null,"Description":"","Identity":"Microsoft.Web.Mvc.FSharp.Fallback","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Microsoft.Web.Mvc","Precedence":6500,"Name":"ASP.NET Core Web App (Model-View-Controller)","ShortNameList":["mvc"],"PreferDefaultName":false,"ConfigPlace":"/content/Microsoft.Web.Mvc.FSharp/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/Microsoft.Web.Mvc.FSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"F#","type":"project","isFallback":"true"},"HostData":"{\"$schema\":\"http://json.schemastore.org/vs-2017.3.host\",\"icon\":\"ide/WebApplication.png\",\"supportsDocker\":true,\"disableHttpsSymbol\":\"NoHttps\",\"isFallback\":\"true\"}","PostActions":[],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"unused","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"C#","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"C#":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"isFallback","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"true":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false}],"MountPointUri":"c:\\program files\\microsoft visual studio\\2022\\community\\common7\\ide\\extensions\\microsoft\\templateengine\\Microsoft.VisualStudio.TemplateEngine.FallbackHostData.17.12.178.nupkg","Author":"Microsoft","Classifications":["Test","NUnit"],"DefaultName":null,"Description":"","Identity":"NUnit3.DotNetNew.Template.CSharp.Fallback","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"NUnit3.DotNetNew.Template","Precedence":6500,"Name":"NUnit 3 Test Project","ShortNameList":["nunit"],"PreferDefaultName":false,"ConfigPlace":"/content/NUnit3.DotNetNew.Template.CSharp/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/NUnit3.DotNetNew.Template.CSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project","isFallback":"true"},"HostData":"{\"$schema\":\"http://json.schemastore.org/vs-2017.3.host\",\"icon\":\"ide/CS_NonEmpty_16X16_32X32.ico\",\"tags\":[{\"type\":\"projectType\",\"add\":[\"Desktop\",\"Web\"],\"remove\":[\"NUnit\"]}],\"isFallback\":\"true\"}","PostActions":[],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"unused","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"F#","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"F#":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"isFallback","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"true":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false}],"MountPointUri":"c:\\program files\\microsoft visual studio\\2022\\community\\common7\\ide\\extensions\\microsoft\\templateengine\\Microsoft.VisualStudio.TemplateEngine.FallbackHostData.17.12.178.nupkg","Author":"Microsoft","Classifications":["Test","NUnit"],"DefaultName":null,"Description":"","Identity":"NUnit3.DotNetNew.Template.FSharp.Fallback","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"NUnit3.DotNetNew.Template","Precedence":6500,"Name":"NUnit 3 Test Project","ShortNameList":["nunit"],"PreferDefaultName":false,"ConfigPlace":"/content/NUnit3.DotNetNew.Template.FSharp/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/NUnit3.DotNetNew.Template.FSharp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"F#","type":"project","isFallback":"true"},"HostData":"{\"$schema\":\"http://json.schemastore.org/vs-2017.3.host\",\"icon\":\"ide/FSharpTestLibrary.ico\",\"tags\":[{\"type\":\"projectType\",\"add\":[\"Desktop\",\"Web\"],\"remove\":[\"NUnit\"]}],\"isFallback\":\"true\"}","PostActions":[],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"unused","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"VB","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"VB":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"isFallback","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"true":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false}],"MountPointUri":"c:\\program files\\microsoft visual studio\\2022\\community\\common7\\ide\\extensions\\microsoft\\templateengine\\Microsoft.VisualStudio.TemplateEngine.FallbackHostData.17.12.178.nupkg","Author":"Microsoft","Classifications":["Test","NUnit"],"DefaultName":null,"Description":"","Identity":"NUnit3.DotNetNew.Template.VisualBasic.Fallback","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"NUnit3.DotNetNew.Template","Precedence":6500,"Name":"NUnit 3 Test Project","ShortNameList":["nunit"],"PreferDefaultName":false,"ConfigPlace":"/content/NUnit3.DotNetNew.Template.VisualBasic/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/NUnit3.DotNetNew.Template.VisualBasic/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"VB","type":"project","isFallback":"true"},"HostData":"{\"$schema\":\"http://json.schemastore.org/vs-2017.3.host\",\"icon\":\"ide/VB_NonEmpty_16X16_32X32.ico\",\"tags\":[{\"type\":\"projectType\",\"add\":[\"Desktop\",\"Web\"],\"remove\":[\"NUnit\"]}],\"isFallback\":\"true\"}","PostActions":[],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"MyExtensionsApp.1","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"C#","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"C#":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"solution","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"solution":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"editorTreatAs","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"solution","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"solution":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":"Selects whether to use the recommended or blank app defaults for the template","Name":"preset","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"blank","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"recommended":{"DisplayName":"Recommended","Description":"Recommended set of options to create a production-ready app targeting multiple platforms"},"blank":{"DisplayName":"Blank","Description":"Smallest set of options, with no extra dependencies, to create an app targeting multiple platforms"}},"Description":"Selects whether to use the recommended or blank app defaults for the template","DisplayName":"Preset","AllowMultipleValues":false},{"Documentation":"The application identifier (e.g. com.mycompany.myapp), used by the Android, iOS, and Mac targets.","Name":"appId","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":null,"DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The application identifier (e.g. com.mycompany.myapp), used by the Android, iOS, and Mac targets.","DisplayName":"Application ID","AllowMultipleValues":false},{"Documentation":"This sets the Identity Publisher of the Package.appxmanifest file. This should match the subject of the signing certificate and will be used for the default development certificate. (e.g. O=Uno Platform)","Name":"publisher","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":null,"DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"This sets the Identity Publisher of the Package.appxmanifest file. This should match the subject of the signing certificate and will be used for the default development certificate. (e.g. O=Uno Platform)","DisplayName":"Publisher","AllowMultipleValues":false},{"Documentation":"Select the .NET version of your solution","Name":"tfm","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net8.0":{"DisplayName":".NET 8.0","Description":"Target .NET 8.0 (Long Term Support)"},"net9.0":{"DisplayName":".NET 9.0","Description":"Target .NET 9.0 (Standard Term Support)"}},"Description":"Select the .NET version of your solution","DisplayName":"Target Framework","AllowMultipleValues":false},{"Documentation":"Select the design pattern for your application","Name":"architecture","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"none":{"DisplayName":"None","Description":"No additional presentation framework"},"mvvm":{"DisplayName":"MVVM","Description":"Use the Model-View-ViewModel (MVVM) design pattern"},"mvux":{"DisplayName":"MVUX","Description":"Use the Model-View-Update eXtended (MVUX) design pattern"}},"Description":"Select the design pattern for your application","DisplayName":"Presentation","AllowMultipleValues":false},{"Documentation":"How would you like to code your UI","Name":"markup","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"xaml","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"xaml":{"DisplayName":"XAML","Description":"Use XAML for the UI"},"csharp":{"DisplayName":"C# Markup","Description":"Use C# Markup for the UI"}},"Description":"How would you like to code your UI","DisplayName":"UI Markup","AllowMultipleValues":false},{"Documentation":"Selects the theme design system for the application.","Name":"appTheme","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"material":{"DisplayName":"Material","Description":"Use the Material design theme"},"fluent":{"DisplayName":"Fluent","Description":"Use the Fluent design theme"},"cupertino":{"DisplayName":"Cupertino","Description":"Use the Cupertino design theme"}},"Description":"Selects the theme design system for the application.","DisplayName":"Theme","AllowMultipleValues":false},{"Documentation":"What platforms would you like to target","Name":"platforms","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"android|ios|maccatalyst|wasm|windows|desktop","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"android":{"DisplayName":"Android","Description":"Enables the Android target platform"},"ios":{"DisplayName":"iOS","Description":"Enables the iOS target platform"},"maccatalyst":{"DisplayName":"macOS (Catalyst)","Description":"Enables the macOS (Catalyst) target platform"},"windows":{"DisplayName":"Windows","Description":"Enables the Windows with WinAppSdk (WinUI 3) target platform"},"wasm":{"DisplayName":"WebAssembly","Description":"Enables the WebAssembly target platform"},"desktop":{"DisplayName":"Desktop","Description":"Enables Skia Desktop (Linux X11/Framebuffer, macOS, Windows)"}},"Description":"What platforms would you like to target","DisplayName":"Platforms","AllowMultipleValues":true},{"Documentation":"Decide on a testing strategy","Name":"tests","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"none":{"DisplayName":"None","Description":"Disable testing"},"unit":{"DisplayName":"Unit Tests","Description":"Include a project for authoring traditional unit tests"},"ui":{"DisplayName":"UI Tests","Description":"Include a project for authoring UI tests using the Uno.UITest framework"}},"Description":"Decide on a testing strategy","DisplayName":"Tests","AllowMultipleValues":true},{"Documentation":"Includes a Server project for an API & host for the WebAssembly project","Name":"server","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Includes a Server project for an API & host for the WebAssembly project","DisplayName":"Server","AllowMultipleValues":false},{"Documentation":"Includes Uno.Toolkit for additional controls and helper classes","Name":"toolkit","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"False","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Includes Uno.Toolkit for additional controls and helper classes","DisplayName":"Toolkit","AllowMultipleValues":false},{"Documentation":"Use dependency injection for registering and accessing services","Name":"dependencyInjection","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"False","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Use dependency injection for registering and accessing services","DisplayName":"Dependency Injection","AllowMultipleValues":false},{"Documentation":"Load configuration information from appsettings.json","Name":"configuration","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"False","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Load configuration information from appsettings.json","DisplayName":"Configuration","AllowMultipleValues":false},{"Documentation":"Register native handlers for http and setup Refit support","Name":"http","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"False","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Register native handlers for http and setup Refit support","DisplayName":"HTTP","AllowMultipleValues":false},{"Documentation":"Configures support for localizing resources throughout the application","Name":"localization","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"False","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Configures support for localizing resources throughout the application","DisplayName":"Localization","AllowMultipleValues":false},{"Documentation":"Adds support for additional locales","Name":"cultures","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"es|fr|pt-BR","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"ar":{"DisplayName":"Arabic","Description":"Arabic"},"cs":{"DisplayName":"Czech","Description":"Czech"},"da":{"DisplayName":"Danish","Description":"Danish"},"nl":{"DisplayName":"Dutch","Description":"Dutch"},"fr":{"DisplayName":"French","Description":"French"},"de":{"DisplayName":"German","Description":"German"},"es":{"DisplayName":"Spanish","Description":"Spanish"},"it":{"DisplayName":"Italian","Description":"Italian"},"ja":{"DisplayName":"Japanese","Description":"Japanese"},"ko":{"DisplayName":"Korean","Description":"Korean"},"pt-BR":{"DisplayName":"Portuguese (Brazil)","Description":"Portuguese (Brazil)"},"ru":{"DisplayName":"Russian","Description":"Russian"},"sv":{"DisplayName":"Swedish","Description":"Swedish"},"tr":{"DisplayName":"Turkish","Description":"Turkish"},"uk":{"DisplayName":"Ukrainian","Description":"Ukrainian"},"vi":{"DisplayName":"Vietnamese","Description":"Vietnamese"},"zh-Hans":{"DisplayName":"Chinese (Simplified)","Description":"Chinese (Simplified)"},"zh-Hant":{"DisplayName":"Chinese (Traditional)","Description":"Chinese (Traditional)"}},"Description":"Adds support for additional locales","DisplayName":"Locales","AllowMultipleValues":true},{"Documentation":"Configures logging support in the application","Name":"logging","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"none":{"DisplayName":"Console","Description":"Debug Logging for the Application Framework to the Console"},"default":{"DisplayName":"Default","Description":"Logging is accessible via dependency injection and writes output to Console"},"serilog":{"DisplayName":"Serilog","Description":"Logging is accessible via dependency injection and uses Serilog"}},"Description":"Configures logging support in the application","DisplayName":"Logging","AllowMultipleValues":false},{"Documentation":"Configures navigation in the application","Name":"navigation","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"regions":{"DisplayName":"Regions","Description":"Uses Uno.Extensions.Navigation to navigate using regions"},"blank":{"DisplayName":"Blank","Description":"Provides Blank App experience with default WinUI Frame Navigation"}},"Description":"Configures navigation in the application","DisplayName":"Navigation","AllowMultipleValues":false},{"Documentation":"Configures authentication support in the application","Name":"authentication","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"none","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"none":{"DisplayName":"None","Description":"No authentication"},"custom":{"DisplayName":"Custom","Description":"Application uses custom logic to authenticate user"},"msal":{"DisplayName":"MSAL","Description":"Application uses MSAL to authenticate user"},"oidc":{"DisplayName":"OIDC","Description":"Application uses OpenID Connect to authenticate user"},"Web":{"DisplayName":"Web","Description":"Application uses web based authentication to authenticate user"}},"Description":"Configures authentication support in the application","DisplayName":"Authentication","AllowMultipleValues":false},{"Documentation":"Include theme service for switching between Dark, Light and System themes","Name":"themeService","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"False","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Include theme service for switching between Dark, Light and System themes","DisplayName":"Theme Service","AllowMultipleValues":false},{"Documentation":"Include Uno.WinUI.Svg for SVG support","Name":"unoSvg","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Include Uno.WinUI.Svg for SVG support","DisplayName":"Uno.WinUI.Svg","AllowMultipleValues":false},{"Documentation":"Include Uno.WinUI.Lottie for Lottie support","Name":"unoLottie","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Include Uno.WinUI.Lottie for Lottie support","DisplayName":"Uno.WinUI.Lottie","AllowMultipleValues":false},{"Documentation":"Import a Uno DSP theme file to override Material colors","Name":"dspGenerator","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"False","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Import a Uno DSP theme file to override Material colors","DisplayName":"Import Uno DSP","AllowMultipleValues":false},{"Documentation":"Configures continuous integration support for the solution","Name":"continuousIntegration","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"none","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"none":{"DisplayName":"None","Description":"No continuous integration files generated"},"azure":{"DisplayName":"Azure Pipelines","Description":"Continuous integration files generated for Azure Pipelines"},"github":{"DisplayName":"GitHub Actions","Description":"Continuous integration files generated for GitHub Actions"}},"Description":"Configures continuous integration support for the solution","DisplayName":"Continuous Integration","AllowMultipleValues":false},{"Documentation":"The name of the default branch for the repository","Name":"defaultBranchName","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"main","DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The name of the default branch for the repository","DisplayName":"Default Branch Name","AllowMultipleValues":false},{"Documentation":"Sets up Visual Studio Code Debugging for WebAssembly and Skia Desktop","Name":"vscode","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Sets up Visual Studio Code Debugging for WebAssembly and Skia Desktop","DisplayName":"Visual Studio Code Debugging","AllowMultipleValues":false},{"Documentation":"Sets up Rider support for the solution","Name":"rider","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Sets up Rider support for the solution","DisplayName":"Rider Support","AllowMultipleValues":false},{"Documentation":"Includes a manifest in the WebAssembly project to make the application a PWA","Name":"wasmPwaManifest","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Includes a manifest in the WebAssembly project to make the application a PWA","DisplayName":"PWA Manifest","AllowMultipleValues":false},{"Documentation":"Configures application to embed .NET MAUI controls","Name":"mauiEmbedding","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Configures application to embed .NET MAUI controls","DisplayName":".NET MAUI Embedding","AllowMultipleValues":false},{"Documentation":"Configures application to use multi-threading in WebAssembly","Name":"wasmMultiThreading","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Configures application to use multi-threading in WebAssembly","DisplayName":"WASM Multi-Threading","AllowMultipleValues":false},{"Documentation":"Configures application to bundle native assets required for the MediaElement","Name":"mediaElement","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Configures application to bundle native assets required for the MediaElement","DisplayName":"Media Element","AllowMultipleValues":false},{"Documentation":"If specified, skips the automatic restore of the project on create.","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"If specified, skips the automatic restore of the project on create.","DisplayName":"Skip Restore","AllowMultipleValues":false},{"Documentation":"","Name":"unoSdkVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"5.6.30","DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"","DisplayName":"","AllowMultipleValues":false},{"Documentation":"","Name":"unoWasmBootstrapVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":null,"DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"","DisplayName":"","AllowMultipleValues":false},{"Documentation":"","Name":"unoUITestHelpersVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"1.1.0-dev.70","DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"","DisplayName":"","AllowMultipleValues":false},{"Documentation":"","Name":"enableDeveloperMode","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"","DisplayName":"","AllowMultipleValues":false},{"Documentation":"","Name":"isVsix","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"","DisplayName":"isVsix","AllowMultipleValues":false}],"MountPointUri":"C:\\Users\\stars\\.templateengine\\packages\\Uno.Templates.5.6.30.nupkg","Author":"Uno Platform","Classifications":["Multi-platform","Uno Platform","Android","iOS","macOS","Mac Catalyst","Windows","Linux","WebAssembly","WinUI"],"DefaultName":"UnoApp","Description":"Solution template for creating a multi-platform C# & XAML application targeting Windows App SDK, Android, iOS, macOS, WebAssembly, Skia Desktop.","Identity":"Uno.Platform.UnoApp.WinUI.netcoremobile.CSharp","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Uno.Platform.UnoApp.WinUI.netcoremobile","Precedence":99,"Name":"Uno Platform App","ShortNameList":["unoapp"],"PreferDefaultName":false,"ConfigPlace":"/content/unoapp/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/unoapp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"solution","editorTreatAs":"solution"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"unsupportedHosts\":[{\"id\":\"vs\"}]}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025"],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"UnoQuickStart","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"C#","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"C#":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"solution","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"solution":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"editorTreatAs","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"solution","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"solution":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":"Select the .NET version of your solution","Name":"tfm","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net8.0":{"DisplayName":".NET 8.0","Description":"Target .NET 8.0 (Long Term Support)"},"net9.0":{"DisplayName":".NET 9.0","Description":"Target .NET 9.0 (Standard Term Support)"}},"Description":"Select the .NET version of your solution","DisplayName":"Target Framework","AllowMultipleValues":false},{"Documentation":"Provides the value to use for the Windows head publisher","Name":"windowsPublisherName","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"O=MyCompany","DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"Provides the value to use for the Windows head publisher","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Enables the WebAssembly platform support project","Name":"WebAssembly","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Enables the WebAssembly platform support project","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Enables iOS, Android, Catalyst","Name":"Mobile","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Enables iOS, Android, Catalyst","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Enables the Skia/WPF platform support project","Name":"skia-wpf","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Enables the Skia/WPF platform support project","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Enables the Skia/GTK platform support project","Name":"skia-gtk","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Enables the Skia/GTK platform support project","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Enables the Skia/Linux Framebuffer platform support project","Name":"skia-linux-fb","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Enables the Skia/Linux Framebuffer platform support project","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Adds the Visual Studio Code Debugging support files","Name":"vscode","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Adds the Visual Studio Code Debugging support files","DisplayName":"","AllowMultipleValues":false},{"Documentation":"If specified, skips the automatic restore of the project on create.","Name":"skipRestore","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"If specified, skips the automatic restore of the project on create.","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Enables the generation of a PWA manifest for WebAssembly","Name":"wasm-pwa-manifest","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"false","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Enables the generation of a PWA manifest for WebAssembly","DisplayName":"","AllowMultipleValues":false},{"Documentation":"","Name":"unoWinUIVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"5.6.61","DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"","DisplayName":"","AllowMultipleValues":false},{"Documentation":"","Name":"unoUniversalImageLoaderVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"1.9.36","DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"","DisplayName":"","AllowMultipleValues":false},{"Documentation":"","Name":"unoExtensionsLoggingVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"1.7.0","DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"","DisplayName":"","AllowMultipleValues":false},{"Documentation":"","Name":"msftExtensionsLoggingConsoleVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"8.0.0","DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Users\\stars\\.templateengine\\packages\\Uno.Templates.5.6.30.nupkg","Author":"Uno Platform","Classifications":["Multi-platform","Uno Platform","Android","iOS","Windows","macOS","Linux","WebAssembly"],"DefaultName":"UnoApp","Description":"Template for creating a C# & XAML application that targets UWP, Android, iOS, macOS, WebAssembly, Skia/WPF and Skia/GTK for Linux.","Identity":"Uno.Platform.UnoApp.UWP.netcoremobile","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Uno.Platform.Blank.UWP.netcoremobile","Precedence":6001,"Name":"Uno Platform App (.NET 8, UWP)","ShortNameList":["unoapp-uwp"],"PreferDefaultName":false,"ConfigPlace":"/content/unoapp-uwp/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/unoapp-uwp/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"solution","editorTreatAs":"solution"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"unsupportedHosts\":[{\"id\":\"vs\"}]}","PostActions":["210d431b-a78b-4d2f-b762-4ed3e3ea9025"],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"CrossTargetedLibrary","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"C#","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"C#":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":"Select the .NET version of your solution","Name":"tfm","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net8.0":{"DisplayName":".NET 8.0","Description":"Target .NET 8.0 (Long Term Support)"},"net9.0":{"DisplayName":".NET 9.0","Description":"Target .NET 9.0 (Standard Term Support)"}},"Description":"Select the .NET version of your solution","DisplayName":"Target Framework","AllowMultipleValues":false},{"Documentation":"","Name":"unoSdkVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"5.6.30","DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"","DisplayName":"","AllowMultipleValues":false},{"Documentation":"","Name":"globalJson","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"","DisplayName":"","AllowMultipleValues":false}],"MountPointUri":"C:\\Users\\stars\\.templateengine\\packages\\Uno.Templates.5.6.30.nupkg","Author":"Uno Platform","Classifications":["Multi-platform","Uno Platform","Library","Android","iOS","Windows","macOS","Linux","WebAssembly"],"DefaultName":null,"Description":"Template for creating a class library for the Uno Platform that targets WinUI, Android, iOS, MacCatalyst, WebAssembly and Skia","Identity":"Uno.Platform.UnoLib","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Uno.Platform.BlankLibrary","Precedence":6001,"Name":"Uno Platform Class Library","ShortNameList":["unolib"],"PreferDefaultName":false,"ConfigPlace":"/content/unolib/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/unolib/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"unsupportedHosts\":[{\"id\":\"vs\"}]}","PostActions":[],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"UnoUITestsLibrary","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"C#","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"C#":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":"","Name":"unoUITestHelpersVersion","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"1.1.0-dev.70","DataType":"text","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"","DisplayName":"","AllowMultipleValues":false},{"Documentation":"Select the .NET version of your solution","Name":"tfm","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net8.0":{"DisplayName":".NET 8.0","Description":"Target .NET 8.0 (Long Term Support)"},"net9.0":{"DisplayName":".NET 9.0","Description":"Target .NET 9.0 (Standard Term Support)"}},"Description":"Select the .NET version of your solution","DisplayName":"Target Framework","AllowMultipleValues":false}],"MountPointUri":"C:\\Users\\stars\\.templateengine\\packages\\Uno.Templates.5.6.30.nupkg","Author":"Uno Platform","Classifications":["Multi-platform","Uno Platform","UITest","Android","iOS","macOS","WebAssembly"],"DefaultName":"UnoApp.UITests","Description":"Project template for creating UI Tests with the Uno Platform.","Identity":"Uno.Platform.UITestLibrary","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Uno.Platform.BlankUITestLibrary","Precedence":6001,"Name":"Uno Platform UI Tests Class Library","ShortNameList":["unoapp-uitest"],"PreferDefaultName":false,"ConfigPlace":"/content/unolib-uitest/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/unolib-uitest/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"unsupportedHosts\":[{\"id\":\"vs\"}]}","PostActions":["d396686c-de0e-4de6-906d-291cd29fc5de"],"Constraints":[]},{"Parameters":[{"Documentation":"The default name symbol","Name":"name","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"MyExtensionsApp.1","DataType":"string","DefaultIfOptionWithoutValue":null,"Choices":null,"Description":"The default name symbol","DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"language","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"C#","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"C#":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":null,"Name":"type","Priority":3,"Precedence":{"PrecedenceDefinition":3,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"project","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"project":{"DisplayName":"","Description":""}},"Description":null,"DisplayName":null,"AllowMultipleValues":false},{"Documentation":"Select the .NET version of your solution","Name":"tfm","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"net9.0","DataType":"choice","DefaultIfOptionWithoutValue":null,"Choices":{"net8.0":{"DisplayName":".NET 8.0","Description":"Target .NET 8.0 (Long Term Support)"},"net9.0":{"DisplayName":".NET 9.0","Description":"Target .NET 9.0 (Standard Term Support)"}},"Description":"Select the .NET version of your solution","DisplayName":"Target Framework","AllowMultipleValues":false},{"Documentation":"Include Android as a target platform","Name":"useAndroid","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Include Android as a target platform","DisplayName":"Android","AllowMultipleValues":false},{"Documentation":"Include iOS as a target platform","Name":"useIOS","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Include iOS as a target platform","DisplayName":"iOS","AllowMultipleValues":false},{"Documentation":"Include MacCatalyst as a target platform","Name":"useMacCatalyst","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Include MacCatalyst as a target platform","DisplayName":"MacCatalyst","AllowMultipleValues":false},{"Documentation":"Include WinUI as a target platform","Name":"useWinAppSdk","Priority":2,"Precedence":{"PrecedenceDefinition":2,"IsRequiredCondition":null,"IsEnabledCondition":null,"IsRequired":false,"CanBeRequired":false},"Type":"parameter","IsName":false,"DefaultValue":"true","DataType":"bool","DefaultIfOptionWithoutValue":"true","Choices":null,"Description":"Include WinUI as a target platform","DisplayName":"WinUI","AllowMultipleValues":false}],"MountPointUri":"C:\\Users\\stars\\.templateengine\\packages\\Uno.Templates.5.6.30.nupkg","Author":"Uno Platform","Classifications":["Multi-platform","Uno Platform","Android","iOS","Mac Catalyst","Windows","WinUI"],"DefaultName":"UnoMauiLibrary","Description":"Project template for creating .NET MAUI Controls to embed within your Uno Platform app.","Identity":"Uno.Platform.UnoApp.WinUI.mauiembeddingclasslibrary.CSharp","GeneratorId":"0c434df7-e2cb-4dee-b216-d7c58c8eb4b3","GroupIdentity":"Uno.Platform.UnoApp.WinUI.mauiembeddingclasslibrary","Precedence":99,"Name":"Uno Platform Maui Embedding Class Library","ShortNameList":["unomauilib"],"PreferDefaultName":false,"ConfigPlace":"/content/unomauilib/.template.config/template.json","LocaleConfigPlace":null,"HostConfigPlace":"/content/unomauilib/.template.config/ide.host.json","ThirdPartyNotices":null,"BaselineInfo":{},"TagsCollection":{"language":"C#","type":"project"},"HostData":"{\"$schema\":\"http://json.schemastore.org/ide.host\",\"unsupportedHosts\":[{\"id\":\"vs\"}]}","PostActions":[],"Constraints":[]}],"MountPointsInfo":{"C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.common.itemtemplates.9.0.102.nupkg":"2024-12-11T18:15:30+08:00","C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.common.projecttemplates.8.0.8.0.405.nupkg":"2024-12-04T19:27:00+08:00","C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.test.projecttemplates.8.0.1.1.0-rc.24059.1.nupkg":"2024-12-04T19:27:00+08:00","C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.web.itemtemplates.8.0.8.0.12.nupkg":"2024-12-04T19:27:00+08:00","C:\\Program Files\\dotnet\\templates\\8.0.12\\microsoft.dotnet.web.projecttemplates.8.0.8.0.12.nupkg":"2024-12-04T19:27:00+08:00","C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.winforms.projecttemplates.9.0.1-servicing.24610.6.nupkg":"2024-12-11T18:06:36+08:00","C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.wpf.projecttemplates.9.0.1-rtm.24610.3.nupkg":"2024-12-11T18:06:36+08:00","C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.common.projecttemplates.9.0.9.0.102.nupkg":"2024-12-11T18:15:48+08:00","C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.test.projecttemplates.9.0.1.1.0-rtm.24605.1.nupkg":"2024-12-11T18:06:36+08:00","C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.web.itemtemplates.9.0.9.0.1.nupkg":"2024-12-11T18:06:36+08:00","C:\\Program Files\\dotnet\\templates\\9.0.1\\microsoft.dotnet.web.projecttemplates.9.0.9.0.1.nupkg":"2024-12-11T18:06:36+08:00","C:\\Program Files\\dotnet\\template-packs\\microsoft.android.templates.35.0.24.nupkg":"2024-11-25T16:45:58+08:00","C:\\Program Files\\dotnet\\template-packs\\microsoft.ios.templates.18.1.9163.nupkg":"2024-11-21T01:19:56+08:00","C:\\Program Files\\dotnet\\template-packs\\microsoft.maccatalyst.templates.18.1.9163.nupkg":"2024-11-21T01:19:56+08:00","C:\\Program Files\\dotnet\\template-packs\\microsoft.macos.templates.15.1.9163.nupkg":"2024-11-21T01:19:56+08:00","C:\\Program Files\\dotnet\\template-packs\\microsoft.maui.templates.net9.9.0.0.nupkg":"2024-10-30T13:07:48+08:00","C:\\Program Files\\dotnet\\template-packs\\microsoft.maui.templates.net8.8.0.83.nupkg":"2024-10-29T22:46:40+08:00","c:\\program files\\microsoft visual studio\\2022\\community\\common7\\ide\\extensions\\microsoft\\templateengine\\Microsoft.VisualStudio.TemplateEngine.FallbackHostData.17.12.178.nupkg":"2025-02-08T14:45:24.6607126+08:00","C:\\Users\\stars\\.templateengine\\packages\\Uno.Templates.5.6.30.nupkg":"2025-02-17T09:33:06.6532851Z"}} \ No newline at end of file diff --git a/docs/README_enUS.md b/docs/README_enUS.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/Release.md b/docs/Release.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/assets/BadMC_Launcher_MainPage.png b/docs/assets/BadMC_Launcher_MainPage.png deleted file mode 100644 index 5c648b2fad827e1a3430ae10cc3f1c74bfcb340c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 703737 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