怎么使用DotNetCLI創(chuàng)建自定義的WPF項(xiàng)目模板-創(chuàng)新互聯(lián)

小編給大家分享一下怎么使用DotNet CLI創(chuàng)建自定義的WPF項(xiàng)目模板,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

為沙雅等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及沙雅網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè)、沙雅網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!

本文主要介紹了使用DotNet CLI創(chuàng)建自定義的WPF項(xiàng)目模板,分享給大家,具體如下:

怎么使用DotNet CLI創(chuàng)建自定義的WPF項(xiàng)目模板

描述

當(dāng)我們安裝完 DotNetCore 3.0 版本的 SDK 后,我們就可以創(chuàng)建基于 DotNetCore 的 WPF 項(xiàng)目模板,通過如下 CLI 可以方便快捷的創(chuàng)建并運(yùn)行我們的項(xiàng)目:

dotnet new wpf -n WpfApp
cd WpfApp
dotnet restore
dotnet run

做過 WPF 開發(fā)的朋友都知道,這個項(xiàng)目模板肯定不符合我們的預(yù)期,我們希望我們的項(xiàng)目模板能夠加入 MVVM 的默認(rèn)代碼段,并且能夠和 DotNetCore 緊密合作,這樣豈不是更加方便了嗎? 所以本文使用 MVVM 的一種實(shí)現(xiàn) MvvmLightStd10 來教大家如何創(chuàng)建一個我們理想的項(xiàng)目模板。

操作

首先,我們基于 DotNetCore 3.0 創(chuàng)建一個原始的 WPF 項(xiàng)目模板,然后引用如下庫:

  1. Microsoft.Extensions.DependencyInjection

  2. MvvmLightLibsStd10


可通過執(zhí)行 cli 命令進(jìn)行安裝

dotnet add package Microsoft.Extensions.DependencyInjection
dotnet add package MvvmLightLibsStd10

注:因?yàn)槲覀兪褂昧?DotNetCore,所以我們盡量讓我們安裝的第三方包是基于 .NET Standard 方式來實(shí)現(xiàn)。

然后,嘗試修改我們的這個項(xiàng)目,把它改成我們以后期望創(chuàng)建的項(xiàng)目模板的樣子。可以參考我的如下修改:

項(xiàng)目結(jié)構(gòu)如下圖所示:

怎么使用DotNet CLI創(chuàng)建自定義的WPF項(xiàng)目模板

其中,src\Models\DataItem.cs 的示例代碼如下所示:

using System;
using System.Collections.Generic;
using System.Text;

namespace WpfApp.Models
{
  public class DataItem
  {
    public string Title { get; private set; }

    public DataItem(string title)
    {
      Title = title;
    }
  }
}

src\Models\IDataService.cs 的示例代碼如下所示:

using System;
using System.Collections.Generic;
using System.Text;

namespace WpfApp.Models
{
  public interface IDataService
  {
    void GetData(Action<DataItem, Exception> callback);
  }
}

src\Models\DataService.cs 的示例代碼如下所示:

using System;
using System.Collections.Generic;
using System.Text;

namespace WpfApp.Models
{
  public class DataService : IDataService
  {
    public void GetData(Action<DataItem, Exception> callback)
    {
      var item = new DataItem("Hello .NET Core!");
      callback(item, null);
    }
  }
}

src\ViewModels\MainViewModel.cs 的示例代碼如下所示:

using GalaSoft.MvvmLight;
using WpfApp.Models;

namespace WpfApp.ViewModels
{
  public class MainViewModel : ViewModelBase
  {
    private readonly IDataService _dataService;

    private string _welcomeTitle;
    public string WelcomeTitle
    {
      get { return _welcomeTitle; }
      set { Set(ref _welcomeTitle, value); }
    }

    public MainViewModel(IDataService dataService)
    {
      _dataService = dataService;
       _dataService.GetData(
        (item, error) =>
        {
          if (error != null)
          {
            return;
          }

          WelcomeTitle = item.Title;
        });
    }
  }
}

src\Views\MainView.xaml 的示例代碼如下所示:

<Window
  x:Class="WpfApp.Views.MainView"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  xmlns:local="clr-namespace:WpfApp"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  Title="MainWindow"
  Width="800"
  Height="450"
  mc:Ignorable="d">
  <Grid>
    <Label
      HorizontalAlignment="Center"
      VerticalAlignment="Center"
      Content="{Binding WelcomeTitle}"
      FontSize="40" />
  </Grid>
</Window>

src\Views\MainView.xaml.cs 的示例代碼如下所示:

using System.Windows;
using WpfApp.ViewModels;

namespace WpfApp.Views
{
  public partial class MainView : Window
  {
    public MainView(MainViewModel vm)
    {
      InitializeComponent();
      this.DataContext = vm;
    }
  }
}

src\App.xaml 的示例代碼如下所示:

<Application
  x:Class="WpfApp.App"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:local="clr-namespace:WpfApp" />

src\App.xaml.cs 的示例代碼如下所示:

using Microsoft.Extensions.DependencyInjection;
using System.Windows;
using WpfApp.Models;
using WpfApp.ViewModels;
using WpfApp.Views;

namespace WpfApp
{
  public partial class App : Application
  {
    public ServiceProvider ServiceProvider { get; private set; }

    protected override void OnStartup(StartupEventArgs e)
    {
      base.OnStartup(e);

      var serviceCollection = new ServiceCollection();
      ConfigureServices(serviceCollection);

      ServiceProvider = serviceCollection.BuildServiceProvider();

      var mainWindow = ServiceProvider.GetRequiredService<MainView>();
      mainWindow.Show();
    }

    private void ConfigureServices(ServiceCollection services)
    {
      services.AddTransient<MainView>();
      services.AddTransient<MainViewModel>();

      services.AddScoped<IDataService, DataService>();
    }
  }
}

修改完畢后嘗試編譯運(yùn)行我們的項(xiàng)目,確??梢哉>幾g運(yùn)行。

之后,在我們的項(xiàng)目根目錄 src 下新建一個 .template.config 文件夾,然后在里面新建一個 template.json 文件,進(jìn)行如下示例配置:

{
  "$schema": "http://json.schemastore.org/template",
  "author": "hippiezhou <hippiezhou@outlook.com>",
  "classifications": ["wpf", "mvvmlight", "Dependency Injection"],
  "name": "wpf mvvmlight: use dotnetcore to create wpf with mvvmlight.",
  "tags": {
    "language": "C#",
    "type": "project"
  },
  "identity": "wpf.mvvmlight",
  "shortName": "wpf-mvvmlight",
  "sourceName": "wpf.mvvmlight",
  "preferNameDirectory": true
}

最后,打開我們的終端,將目錄切換至當(dāng)前項(xiàng)目目錄下(就是 .template.config 所在的目錄),然后執(zhí)行下述安裝操作

dotnet new -i C:\Users\hippieZhou\Desktop\helloworld\wpfapp

此時(shí),我們的項(xiàng)目模板會被打包到 DotNetCore 的 CLI 中,如下圖所示:

怎么使用DotNet CLI創(chuàng)建自定義的WPF項(xiàng)目模板

同時(shí),在 C:\Users\hippieZhou.templateengine\dotnetcli\v3.0.100-preview3-010431 目錄下的以 templatecache.json 結(jié)尾的 JSON 文件內(nèi)容也會發(fā)生修改,會在 TemplateInfo 結(jié)點(diǎn)下新增一個如下的節(jié)點(diǎn)內(nèi)容:

 {
   "ConfigMountPointId": "f3861181-7a43-4fc5-ab1c-12d95e734c0a",
   "Author": "hippiezhou <hippiezhou@outlook.com>",
   "Classifications": [
    "wpf",
    "mvvmlight",
    "Dependency Injection"
   ],
   "DefaultName": null,
   "Description": "",
   "Identity": "wpf.mvvmlight",
   "GeneratorId": "0c434df7-e2cb-4dee-b216-d7c58c8eb4b3",
   "GroupIdentity": "",
   "Precedence": 0,
   "Name": "wpf mvvmlight: use dotnetcore to create wpf with mvvmlight.",
   "ShortNameList": [
    "wpf-mvvmlight"
   ],
   "Tags": {
    "language": {
     "Description": null,
     "ChoicesAndDescriptions": {
      "C#": ""
     },
     "DefaultValue": "C#"
    },
    "type": {
     "Description": null,
     "ChoicesAndDescriptions": {
      "project": ""
     },
     "DefaultValue": "project"
    }
   },
   "CacheParameters": {
    "name": {
     "DataType": "string",
     "DefaultValue": null,
     "Description": "The default name symbol"
    }
   },
   "ConfigPlace": "/.template.config/template.json",
   "LocaleConfigMountPointId": "00000000-0000-0000-0000-000000000000",
   "LocaleConfigPlace": null,
   "HostConfigMountPointId": "00000000-0000-0000-0000-000000000000",
   "HostConfigPlace": null,
   "ThirdPartyNotices": null,
   "BaselineInfo": {},
   "HasScriptRunningPostActions": false,
   "ConfigTimestampUtc": null
},

注:如果后期我們不慎將我們的模板刪除了,我們通過刪除掉這兩個文件里面對應(yīng)的模板節(jié)點(diǎn)就可以在 CLI 中取消應(yīng)用了。

我們可以使用下述操作進(jìn)行測試一下:

# 使用我們自定義的項(xiàng)目模板,創(chuàng)建 wpf 項(xiàng)目
dotnet new wpf-mvvmlight -n test

cd test

dotnet restore

dotnet run

如果不出意外的話,我們就可以看到這個項(xiàng)目的代碼段和我們自定義的模板代碼段是一樣的。

如果卸載我們的項(xiàng)目模板可以使用如下命令:

dotnet new -u C:\Users\hippieZhou\Desktop\helloworld\wpfapp

注:我們需要確保我們的自定義模板不能丟失,要不然到時(shí)候就卸載就麻煩了(至少目前看來是這樣的)。

關(guān)于如何將我們的自定義模板可以上傳到 NuGet 供別人下載使用,這里就不做介紹了,具體操作可參考園里介紹如何在 DotNetCore MVC 中打造自己的項(xiàng)目模板方法是一樣的。我在本文中的創(chuàng)建的代碼模板也不會提交上去,還是等著 MVVMLight 的原作者 Laurent Bugnion 來操刀會好一些。

以上是“怎么使用DotNet CLI創(chuàng)建自定義的WPF項(xiàng)目模板”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

本文題目:怎么使用DotNetCLI創(chuàng)建自定義的WPF項(xiàng)目模板-創(chuàng)新互聯(lián)
URL標(biāo)題:http://www.muchs.cn/article16/coiigg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、關(guān)鍵詞優(yōu)化建站公司、營銷型網(wǎng)站建設(shè)、網(wǎng)站導(dǎo)航、靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營