「新しい項目の追加」ウィンドウに UserControl しか表示されないときの対処法【C#】【WPF】【Visual Studio】

毎度まいど対処法を忘れてしまうのでメモ。

↓ のように、「新しい項目の追加」ウィンドウの WPF カテゴリに「ユーザーコントロール (WPF)」のみが表示され、ウィンドウやリソースディクショナリなどが見当たらない場合があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677302/ad63584a-18dc-79ac-68a2-490aa3ebb039.png)

はじめプロジェクトを作成する際に WPF 関連のテンプレートを使用せず、後から WPF 関連のファイルを追加しようとしたときに出くわしがちな問題です。

:::note warn
**あなたが初心者の場合**……「visualstudio 新しい項目 見つからない」などで検索してこの記事へ辿り着いたのだとしたら、ただ単に Visual Studio Installer で必要なコンポーネントをインストールできていないだけの可能性があります。まずは必要なものが全て導入できているか確認を。
以下の記事は Windows Forms の例ですが、WPF の場合もほぼ同様です。

参考: [追加したい新しい項目にWindowsフォームが無い場合の解決方法 - Qiita](https://qiita.com/mohhumohu/items/3e18fe013782619716b4)
:::

## ズバリ原因: Visual Studio に WPF のプロジェクトだと認識されていない
プロジェクトファイル (*.csproj) へ ↓ の ProjectTypeGuids 要素を追記すれば OK です。

```xml
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
```

この要素を追加することによって、そのプロジェクトが WPF を使っていることを Visual Studio へ明示することができます。

### *.csproj への追記例
#### Before
```xml
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>{00000000-0000-0000-0000-000000000000}</ProjectGuid>
    <OutputType>Library</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>Hoge.Fuga.Piyo</RootNamespace>
    <AssemblyName>Hoge.Fuga.Piyo</AssemblyName>
    <TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
    <Deterministic>true</Deterministic>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
  ...以下略
```

#### After
```diff_xml
  <?xml version="1.0" encoding="utf-8"?>
  <Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
    <PropertyGroup>
      <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
      <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
      <ProjectGuid>{00000000-0000-0000-0000-000000000000}</ProjectGuid>
      <OutputType>Library</OutputType>
      <AppDesignerFolder>Properties</AppDesignerFolder>
      <RootNamespace>Hoge.Fuga.Piyo</RootNamespace>
      <AssemblyName>Hoge.Fuga.Piyo</AssemblyName>
+     <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
      <TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
      <FileAlignment>512</FileAlignment>
      <Deterministic>true</Deterministic>
    </PropertyGroup>
    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    ...以下略
```

## 参考
[Why doesn't Visual Studio want me to add a new window to my WPF project? - Stack Overflow](https://stackoverflow.com/questions/1484403/why-doesnt-visual-studio-want-me-to-add-a-new-window-to-my-wpf-project)