DotNet CLI 를 사용 하여 사용자 정의 WPF 프로젝트 템 플 릿 만 들 기

본 고 는 DotNet CLI 를 사용 하여 사용자 정의 WPF 프로젝트 템 플 릿 을 만 들 고 여러분 에 게 공유 하 는 것 을 소개 합 니 다.구체 적 으로 다음 과 같 습 니 다.

묘사 하 다.
DotNetCore 3.0 버 전의 SDK 를 설치 하면 DotNetCore 기반 WPF 프로젝트 템 플 릿 을 만 들 수 있 습 니 다.다음 CLI 를 통 해 프로젝트 를 편리 하고 빠르게 만 들 고 실행 할 수 있 습 니 다.

dotnet new wpf -n WpfApp
cd WpfApp
dotnet restore
dotnet run
WPF 개발 을 한 친구 들 은 이 프로젝트 템 플 릿 이 우리 의 기대 에 부합 되 지 않 을 것 이라는 것 을 잘 알 고 있 습 니 다.우 리 는 우리 의 프로젝트 템 플 릿 이 MVVM 의 기본 코드 세그먼트 에 가입 하고 DotNetCore 와 긴밀 하 게 합작 할 수 있 기 를 바 랍 니 다.그러면 더욱 편리 하지 않 겠 습 니까?그래서 본 고 는 MVVM 의 일종 인 MvvmLightStd 10 을 사용 하여 여러분 에 게 우리 의 이상 적 인 프로젝트 템 플 릿 을 만 드 는 방법 을 가 르 칩 니 다.
조작 하 다.
우선,우 리 는 DotNetCore 3.0 을 기반 으로 원본 WPF 프로젝트 템 플 릿 을 만 든 다음 에 다음 과 같은 라 이브 러 리 를 참조 합 니 다.
  • Microsoft.Extensions.DependencyInjection
  • MvvmLightLibsStd10
  • cli 명령 을 실행 하여 설치 할 수 있 습 니 다.
    
    dotnet add package Microsoft.Extensions.DependencyInjection
    dotnet add package MvvmLightLibsStd10
    주:우 리 는 DotNetCore 를 사 용 했 기 때문에 가능 한 한 우리 가 설치 한 제3자 패 키 지 는.NET Standard 방식 을 바탕 으로 이 루어 집 니 다.
    그리고 이 프로젝트 를 수정 해서 우리 가 앞으로 만 들 고 싶 은 프로젝트 템 플 릿 의 모습 으로 바 꾸 려 고 합 니 다.나의 다음 과 같은 수정 사항 을 참고 할 수 있다.
    프로젝트 구 조 는 다음 그림 과 같다.

    그 중에서 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>();
        }
      }
    }
    수정 이 끝 난 후에 우리 의 프로젝트 를 컴 파일 하여 정상적으로 컴 파일 하여 실행 할 수 있 도록 시도 합 니 다.
    다음 프로젝트 루트 디 렉 터 리 src 에'template.config 폴 더'를 새로 만 든 다음 template.json 파일 을 새로 만 들 고 다음 예제 설정 을 진행 합 니 다.
    
    {
      "$schema": "http://json.schemastore.org/template",
      "author": "hippiezhou <[email protected]>",
      "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
    }
    마지막 으로 터미널 을 열 고 디 렉 터 리 를 현재 프로젝트 디 렉 터 리 로 전환 한 다음(template.config 가 있 는 디 렉 터 리)다음 설치 작업 을 수행 합 니 다.
    
    dotnet new -i C:\Users\hippieZhou\Desktop\helloworld\wpfapp
    다음 그림 과 같이 프로젝트 템 플 릿 은 DotNetCore 의 CLI 에 포 장 됩 니 다.

    또한 C:\Users\\hippieZhou.templatengine\dotnetcli\\v 3.0.100-preview 3-010431 디 렉 터 리 에 있 는 templatecache.json 으로 끝 나 는 JSON 파일 내용 도 수정 되 며,Template Info 노드 에 다음 과 같은 노드 내용 을 추가 합 니 다.
    
     {
       "ConfigMountPointId": "f3861181-7a43-4fc5-ab1c-12d95e734c0a",
       "Author": "hippiezhou <[email protected]>",
       "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
    },
    주:만약 에 나중에 저희 가 실수 로 템 플 릿 을 삭제 하면 저 희 는 이 두 파일 에 해당 하 는 템 플 릿 노드 를 삭제 하면 CLI 에서 응용 을 취소 할 수 있 습 니 다.
    우 리 는 다음 조작 을 사용 하여 테스트 를 진행 할 수 있다.
    
    #             ,   wpf   
    dotnet new wpf-mvvmlight -n test
    
    cd test
    
    dotnet restore
    
    dotnet run
    만약 의외 의 사고 가 발생 하지 않 는 다 면,우 리 는 이 항목 의 코드 세그먼트 가 우리 가 정의 한 템 플 릿 코드 세그먼트 와 같다 는 것 을 볼 수 있 습 니 다.
    프로젝트 템 플 릿 을 마 운 트 해제 하면 다음 명령 을 사용 할 수 있 습 니 다.
    
    dotnet new -u C:\Users\hippieZhou\Desktop\helloworld\wpfapp
    주:사용자 정의 템 플 릿 을 잃 어 버 리 지 않도록 해 야 합 니 다.그렇지 않 으 면 마 운 트 해제 가 번 거 롭 습 니 다.
    사용자 정의 템 플 릿 을 NuGet 에 업로드 하여 다른 사람 이 다운로드 할 수 있 도록 하 는 방법 에 대해 서 는 소개 하지 않 습 니 다.구체 적 인 조작 은 참고 원 에서 DotNetCore MVC 에서 자신의 프로젝트 템 플 릿 을 만 드 는 방법 을 소개 하 는 것 과 같 습 니 다.내 가 본 논문 에서 만 든 코드 템 플 릿 도 제출 하지 않 을 것 이 며,MVVMLight 의 원작 자 Laurent Bugnion 이 칼 을 다 루 기 를 기다 리 는 것 이 좋 을 것 이다.
    총결산
    이 글 은 DotNet CLI 를 통 해 사용자 정의 WPF 프로젝트 템 플 릿 을 만 드 는 방법 을 소개 한다.실제 사용 하 는 과정 에서 CLI 의 기능 과 지원 하 는 매개 변수 가 더 많 기 때문에 관심 이 있 는 친 구 는 스스로 연구 할 수 있다.
    관련 참고

    how-to-create-a-dot-net-new-project-template-in-dot-net-core
    자신의.NET Core 프로젝트 템 플 릿 만 들 기
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기