WpfCustomControlTemplate 1.0.2

There is a newer version of this package available.
See the version list below for details.
dotnet new install WpfCustomControlTemplate::1.0.2
                    
This package contains a .NET Template Package you can call from the shell/command line.

WpfCustomControlTemplate

License: MIT

dotnet new 명령 한 줄로 WPF CustomControl 기반 프로젝트를 즉시 생성하는 템플릿입니다.

Support / Main / Forms 3단계 레이어 구조와 커스텀 크롬 윈도우가 처음부터 포함되어 있어 반복 작업 없이 바로 기능 개발에 집중할 수 있습니다.

이 템플릿이 필요한 이유

WPF CustomControl 프로젝트를 새로 시작할 때마다 아래 작업을 반복하게 됩니다.

  • 솔루션과 프로젝트 4개 생성 및 참조 설정
  • ThemeInfo 어트리뷰트, Generic.xaml 작성
  • DefaultStyleKeyProperty.OverrideMetadata 등록
  • WindowChrome 기반 커스텀 크롬 윈도우 구현
  • OnApplyTemplate + PART_ 버튼 패턴 구현
  • DI 컨테이너 설정 (Microsoft.Extensions.Hosting)

이 템플릿은 위 내용을 모두 포함한 채 생성됩니다. 빌드 후 바로 실행되는 상태로 시작합니다.

설치

dotnet new install WpfCustomControlTemplate

로컬 .nupkg로 설치하는 경우:

dotnet new install ./bin/Release/WpfCustomControlTemplate.1.0.0.nupkg

사용법

dotnet new wpf-cc -n MyProjectName

MyProjectName 자리에 원하는 이름을 넣으면 프로젝트 이름, 네임스페이스, 파일명이 모두 자동으로 치환됩니다.

예시

dotnet new wpf-cc -n FactoryMonitor
cd FactoryMonitor
dotnet build
dotnet run --project FactoryMonitor

생성되는 프로젝트 구조

MyProjectName/
├── MyProjectName.sln
│
├── MyProjectName/                         ← 진입점 (WinExe)
│   ├── MyProjectName.csproj
│   ├── App.cs                             ← IHost DI 설정
│   └── Starter.cs                         ← [STAThread] Main
│
├── MyProjectName.Support/                 ← 공통 커스텀 컨트롤 라이브러리
│   ├── MyProjectName.Support.csproj
│   ├── AssemblyInfo.cs                    ← ThemeInfo 어트리뷰트
│   ├── UI/Units/
│   │   └── MyProjectNameWindow.cs         ← 기본 WindowChrome 창
│   └── Themes/
│       ├── Generic.xaml
│       └── Units/MyProjectNameWindow.xaml
│
├── MyProjectName.Main/                    ← 도메인별 커스텀 컨트롤 추가
│   ├── MyProjectName.Main.csproj
│   ├── AssemblyInfo.cs
│   └── Themes/Generic.xaml
│
└── MyProjectName.Forms/                   ← 뷰 / 윈도우
    ├── MyProjectName.Forms.csproj
    ├── AssemblyInfo.cs
    ├── AppServices.cs                     ← DI 서비스 접근 헬퍼
    ├── UI/Views/
    │   └── MainWindow.cs                  ← 닫기/최대화/최소화 + 버튼
    └── Themes/
        ├── Generic.xaml
        └── UI/Views/MainWindow.xaml

초기 실행 화면

생성 직후 실행하면 아래 구성의 윈도우가 표시됩니다.

┌─────────────────────────────────────────── ─ □ ✕ ┐
│ MyProjectName                                     │
│                                                   │
│                  [ Click Me ]                     │
│                                                   │
└───────────────────────────────────────────────────┘
  • 타이틀바 — 드래그로 이동, WindowChrome으로 네이티브 크롬 제거
  • 최소화 / 최대화 / 닫기PART_MinimizeButton, PART_MaximizeButton, PART_CloseButton
  • Click Me 버튼MessageBox.Show 호출 예시 (PART_CenterButton)
  • 리사이즈ResizeBorderThickness="5" 로 가장자리 드래그 리사이즈 가능

CustomControl 패턴

이 템플릿은 WPF CustomControl의 표준 패턴을 따릅니다.

1. 컨트롤 등록 (AssemblyInfo.cs)

[assembly: ThemeInfo(
    ResourceDictionaryLocation.None,
    ResourceDictionaryLocation.SourceAssembly
)]

2. 스타일 키 등록 (C# 클래스)

static MyProjectNameWindow()
{
    DefaultStyleKeyProperty.OverrideMetadata(typeof(MyProjectNameWindow),
        new FrameworkPropertyMetadata(typeof(MyProjectNameWindow)));
}

3. 스타일 정의 (Themes/Units/MyProjectNameWindow.xaml)

<Style TargetType="{x:Type units:MyProjectNameWindow}">
    <Setter Property="WindowChrome.WindowChrome">
        <Setter.Value>
            <WindowChrome CaptionHeight="40" ResizeBorderThickness="5" .../>
        </Setter.Value>
    </Setter>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate ...>
                ...
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

4. Generic.xaml에 등록

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="/MyProjectName.Support;component/Themes/Units/MyProjectNameWindow.xaml"/>
</ResourceDictionary.MergedDictionaries>

5. PART_ 패턴으로 자식 요소 연결 (OnApplyTemplate)

public override void OnApplyTemplate()
{
    base.OnApplyTemplate();

    var closeButton = GetTemplateChild("PART_CloseButton") as Button;
    if (closeButton != null)
        closeButton.Click += (s, e) => Close();
}

레이어 구조 설명

프로젝트 역할 참조
Support 앱 전체에서 쓰는 기반 컨트롤 (기본 창, 공통 유닛) 없음
Main 도메인 특화 커스텀 컨트롤 추가 Support
Forms 화면 구성 (Window, View, ViewModel) Main, Support
(루트) 진입점, DI 설정 Forms

새 커스텀 컨트롤을 추가할 때는 Support 또는 Main 프로젝트에 C# 클래스와 XAML 파일을 추가하고, 해당 프로젝트의 Themes/Generic.xaml에 경로를 등록합니다.

요구사항

  • .NET 8.0 이상
  • Windows (WPF는 Windows 전용)
dotnet --version

템플릿 제거

dotnet new uninstall WpfCustomControlTemplate

라이선스

MIT License

  • net8.0

    • No dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.0.5 139 4/27/2026
1.0.4 131 4/22/2026
1.0.3 128 4/22/2026
1.0.2 129 4/21/2026
1.0.1 130 4/21/2026
1.0.0 126 4/21/2026