WPF Tips集（～するには）

逆引きTips

# ■目次

* [■コントロール](https://qiita.com/Kosen-amai/items/ba13012a4076054df255#%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB)
    * [◇フレームワーク共通（FrameworkElement）](https://qiita.com/Kosen-amai/items/ba13012a4076054df255#%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF%E5%85%B1%E9%80%9Aframeworkelement)
        * 幅を変えるには
        * 高さを変えるには
        * ツールチップを表示するには
        * 有効/無効を切り替えるには
        * 表示状態を切り替えるには
        * 水平方向の配置を変えるには
        * 垂直方向の配置を変えるには
        * フォーカスを移動するには
        * コントロールを名前の文字列で参照するには
    * [◇コントロール共通（Control）](https://qiita.com/Kosen-amai/items/ba13012a4076054df255#%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB%E5%85%B1%E9%80%9Acontrol)
        * 文字色を変更するには
        * 背景色を変更するには
        * 太字にするには
        * フォントの候補を複数指定するには
    * [◇ボタン（Button）](https://qiita.com/Kosen-amai/items/ba13012a4076054df255#%E3%83%9C%E3%82%BF%E3%83%B3button)
        * ボタンのテキスト（キャプション）を変更するには
        * デフォルトボタンにするには
        * キャンセルボタンにするには
        * 画像付きボタンを作るには
    * [◇チェックボックス（CheckBox）](https://qiita.com/Kosen-amai/items/ba13012a4076054df255#%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9checkbox)
        * チェックボックスのテキストを変えるには
        * チェックボックスのチェック状態を変えるには
    * [◇ラジオボタン（RadioButton）](https://qiita.com/Kosen-amai/items/ba13012a4076054df255#%E3%83%A9%E3%82%B8%E3%82%AA%E3%83%9C%E3%82%BF%E3%83%B3radiobutton)
        * ラジオボタンのテキストを変えるには
        * ラジオボタンのチェック状態を変えるには
        * ラジオボタンのグループを設定するには
    * [◇ラベル（Label, TextBlock）](https://qiita.com/Kosen-amai/items/ba13012a4076054df255#%E3%83%A9%E3%83%99%E3%83%ABlabel-textblock)
        * ラベルのテキストを変更するには
        * ラベルを太字にするには
    * [◇テキストボックス（TextBox）](https://qiita.com/Kosen-amai/items/ba13012a4076054df255#%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9textbox)
        * テキストボックスのテキストを変更するには
        * テキストボックスの折り返し設定を変更するには
        * テキストボックスに改行を入力できるようにするには
        * 複数行テキストボックスにするには
        * テキストボックスにタブ（TAB）コードを入力できるようにするには
        * テキストボックスのIMEを無効にするには
        * テキストボックスのIMEを「ひらがな」モードにするには
        * テキストボックスのテキストを全選択するには
        * テキストボックスを読み取り専用にするには
        * テキスト系コントロールにウォーターマーク（プレースホルダ）を表示するには
        * 数値入力に適したテキスト系コントロールを使うには
* [■キー](https://qiita.com/Kosen-amai/items/ba13012a4076054df255#%E3%82%AD%E3%83%BC)
    * [◇ショートカット](https://qiita.com/Kosen-amai/items/ba13012a4076054df255#%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88)
        * アクセスキー（アクセラレータキー）を設定するには
    * [◇キー入力](https://qiita.com/Kosen-amai/items/ba13012a4076054df255#%E3%82%AD%E3%83%BC%E5%85%A5%E5%8A%9B)
        * Ctrl, Shift, Altキーが押されているか調べるには
* [■ウィンドウ](https://qiita.com/Kosen-amai/items/ba13012a4076054df255#%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6)
    * [◇画面全般](https://qiita.com/Kosen-amai/items/ba13012a4076054df255#%E7%94%BB%E9%9D%A2%E5%85%A8%E8%88%AC)
        * Windows 10にマッチした画面デザインにするには
        * Windows 10のダークテーマ/ライトテーマに対応するには
    * [◇ウィンドウ（Window）](https://qiita.com/Kosen-amai/items/ba13012a4076054df255#%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6window)
        * ウィンドウのタイトル文字列を変更するには
        * ウィンドウにサイズ変更グリップを表示するには
        * 最大化ボタン、最小化ボタンを非表示にするには
        * 最大化ボタンを無効化するには
        * 閉じる（×）ボタンを無効化するには
        * ウィンドウを最前面に表示するには
        * ウィンドウを閉じるには
        * 別ウィンドウを表示するには
        * 別ウィドウをモーダル表示するには
        * タスクバーにアイコンを表示しないようにするには
        * 初期フォーカスを設定するには
* [■ダイアログ](https://qiita.com/Kosen-amai/items/ba13012a4076054df255#%E3%83%80%E3%82%A4%E3%82%A2%E3%83%AD%E3%82%B0)
    * [◇メッセージボックス（MessageBox）](https://qiita.com/Kosen-amai/items/ba13012a4076054df255#%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9messagebox)
        * メッセージボックスを表示するには
        * OK/キャンセルメッセージボックスを表示するには
        * アイコン付きメッセージボックスを表示するには
        * メッセージボックスにデフォルトボタンを設定するには
    * [◇インプットボックス（InputBox）](https://qiita.com/Kosen-amai/items/ba13012a4076054df255#%E3%82%A4%E3%83%B3%E3%83%97%E3%83%83%E3%83%88%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9inputbox)
        * InputBoxを表示するには
    * [◇ファイルダイアログ（OpenFileDialog/SaveFileDialog）](https://qiita.com/Kosen-amai/items/ba13012a4076054df255#%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%80%E3%82%A4%E3%82%A2%E3%83%AD%E3%82%B0openfiledialogsavefiledialog)
        * ファイル選択ダイアログ（ファイルを開くダイアログ）を表示するには
        * ファイル保存ダイアログ（名前を付けて保存ダイアログ）を表示するには
    * [◇フォルダダイアログ](https://qiita.com/Kosen-amai/items/ba13012a4076054df255#%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%83%80%E3%82%A4%E3%82%A2%E3%83%AD%E3%82%B0)
        * フォルダ選択ダイアログを表示するには
* [■レイアウト](https://qiita.com/Kosen-amai/items/ba13012a4076054df255#%E3%83%AC%E3%82%A4%E3%82%A2%E3%82%A6%E3%83%88)
    * [◇コンテナ](https://qiita.com/Kosen-amai/items/ba13012a4076054df255#%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A)
        * コントロールを縦並びに配置するには
        * コントロールを横並びに配置するには
        * コントロール間に余白を設定するには
        * コントロールを行列指定で配置するには
* [■その他](https://qiita.com/Kosen-amai/items/ba13012a4076054df255#%E3%81%9D%E3%81%AE%E4%BB%96)
    * [◇パス](https://qiita.com/Kosen-amai/items/ba13012a4076054df255#%E3%83%91%E3%82%B9)
        * 実行ファイルのフォルダパスを取得するには
    * [◇プロセス](https://qiita.com/Kosen-amai/items/ba13012a4076054df255#%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9)
        * 外部プログラムを実行するには
        * 既定のプログラムでファイルを開くには
* [■開発環境](https://qiita.com/Kosen-amai/items/ba13012a4076054df255#%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83)
    * [◇Visual Studio](https://qiita.com/Kosen-amai/items/ba13012a4076054df255#visual-studio)
        * XAMLを整形するには
        * XAMLを効率よく入力するには
* [■開発手法](https://qiita.com/Kosen-amai/items/ba13012a4076054df255#%E9%96%8B%E7%99%BA%E6%89%8B%E6%B3%95)
    * [◇MVVMで作るには](https://qiita.com/Kosen-amai/items/ba13012a4076054df255#mvvm%E3%81%A7%E4%BD%9C%E3%82%8B%E3%81%AB%E3%81%AF)
        * MVVMサンプル（足し算）
        * MVVMサンプル（画面遷移）
        * MVVMサンプル（処理中表示）
        * MVVMサンプル（進捗表示）

---

# ■コントロール

## ◇フレームワーク共通（FrameworkElement）

* UIElement
    * __FrameworkElement__

### ◎幅を変えるには

`Width`プロパティ

### ◎高さを変えるには

`Height`プロパティ

### ◎ツールチップを表示するには

`ToolTip`プロパティ

### ◎有効/無効を切り替えるには

`IsEnabled`プロパティ

### ◎表示状態を切り替えるには

`Visibility`プロパティ

|設定値|説明|
| ---- | ---- |
|Visible|表示|
|Hidden|非表示だがレイアウト中の要素の領域は確保|
|Collapsed|非表示、要素の領域も確保しない|

![visible.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/68088103-2356-f093-b320-96a0aad35842.png)

### ◎水平方向の配置を変えるには

`HorizontalAlignment`プロパティ

|設定値|説明|
| ---- | ---- |
|Center|中央に配置|
|Left|左側に配置|
|Right|右側に配置|
|Stretch|引き伸ばして配置|

### ◎垂直方向の配置を変えるには

`VerticalAlignment`プロパティ

|設定値|説明|
| ---- | ---- |
|Center|中央に配置|
|Top|上側に配置|
|Bottom|下側に配置|
|Stretch|引き伸ばして配置|

### ◎フォーカスを移動するには

`Focus`メソッド

### ◎コントロールを名前の文字列で参照するには

`FindName`メソッドの引数にstringで名前を指定

```Xml:xaml
：
<StackPanel>
    <TextBlock x:Name="txt1" Text="あああ" />
    <TextBlock x:Name="txt2" Text="いいいい" />
    <TextBlock x:Name="txt3" Text="ううううう" />
</StackPanel>
：
```

```CSharp:C#
foreach (int i in Enumerable.Range(1, 3))
{
    var textBlockObj = this.FindName($"txt{i}") as TextBlock;
    if (textBlockObj != null)
    {
        MessageBox.Show(textBlockObj.Text);
    }
}
```

<details><summary>VB.NET</summary><div>

```vb:VB.NET
For Each i As Integer In Enumerable.Range(1, 3)
    Dim textBlockObj = TryCast(Me.FindName($"txt{i}"), TextBlock)

    If textBlockObj IsNot Nothing Then
        MessageBox.Show(textBlockObj.Text)
    End If
Next
```

</div></details>

## ◇コントロール共通（Control）

* UIElement
    * FrameworkElement
        * __Control__

### ◎文字色を変更するには

`Foreground`プロパティ

```Xml:xaml
<Button Content="ボタン" Foreground="Brown"/>
<TextBox Text="テキストボックス" Foreground="#FFFF0000"/>
```

### ◎背景色を変更するには

`Background`プロパティ

```Xml:xaml
<Button Content="ボタン" Background="Yellow"/>
<TextBox Text="テキストボックス" Background="#FF00FF00"/>
```

### ◎太字にするには

`FontWeight`プロパティ

```Xml:xaml
<TextBlock Text="てきすと" FontWeight="Bold"/>
```

### ◎フォントの候補を複数指定するには

`FontFamily`プロパティに`,`区切りで複数フォント指定

```Xml:xaml
<TextBlock Text="abc0123あア亜" FontFamily="JetBrains Mono, Cascadia Code, BIZ UDGothic, Yu Gothic Medium, Meiryo"/>
```

## ◇ボタン（Button）

* Control
    * ContentControl
        * ButtonBase
            * __Button__

### ◎ボタンのテキスト（キャプション）を変更するには

`Content`プロパティ

### ◎デフォルトボタンにするには

`IsDefault`プロパティを`True`に設定

### ◎キャンセルボタンにするには

`IsCancel`プロパティを`True`に設定

### ◎画像付きボタンを作るには

```xml
<Button Height="30" Width="100" Margin="5">
    <StackPanel Orientation="Horizontal">
        <Image Source="Resources/image01.png"/>
        <TextBlock Text="ボタン" VerticalAlignment="Center"/>
    </StackPanel>
</Button>
```

https://qiita.com/Kosen-amai/items/c06f4c89f636b781795a

## ◇チェックボックス（CheckBox）

* Control
    * ContentControl
        * ButtonBase
            * ToggleButton
                * __CheckBox__

### ◎チェックボックスのテキストを変えるには

`Content`プロパティ

### ◎チェックボックスのチェック状態を変えるには

`IsChecked`プロパティ

## ◇ラジオボタン（RadioButton）

* Control
    * ContentControl
        * ButtonBase
            * ToggleButton
                * __RadioButton__

### ◎ラジオボタンのテキストを変えるには

`Content`プロパティ

### ◎ラジオボタンのチェック状態を変えるには

`IsChecked`プロパティ

### ◎ラジオボタンのグループを設定するには

`GroupName`プロパティ

同じGroupNameの中で1つ選択状態にできる

## ◇ラベル（Label, TextBlock）

* FrameworkElement
    * Control
        * ContentControl
            * __Label__
    * __TextBlock__

文字を表示したいだけなら軽量な`TextBlock`。
[アクセスキー](https://qiita.com/Kosen-amai/items/ba13012a4076054df255#%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88 "アクセスキー（アクセラレータキー）を設定するには")を設定するなら`Label`。

### ◎ラベルのテキストを変更するには

`Label`の`Content`プロパティ
`TextBlock`の`Text`プロパティ

### ◎ラベルを太字にするには

`TextBlock`の`FontWeight`プロパティを`Bold`に設定

## ◇テキストボックス（TextBox）

* Control
    * TextBoxBase
        * __TextBox__

### ◎テキストボックスのテキストを変更するには

`Text`プロパティ

### ◎テキストボックスの折り返し設定を変更するには

`TextWrapping`プロパティ

|設定値|イメージ|説明|
| ---- | ---- | ---- |
|NoWrap|![Wrap-off.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/01319cdc-47bf-4259-b5c3-706d72a853ab.png)|折り返しなし|
|Wrap|![Wrap-on1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/08764dcb-06d8-0ef3-4e17-23665db9cc94.png)|折り返しあり（単語が入りきらなければ折り返す）|
|WrapWithOverflow|![Wrap-on2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/16520e85-db7b-8328-4688-44c12ab6e58a.png)|折り返しあり（単語が入りきらなければ見切れる）|

### ◎テキストボックスに改行を入力できるようにするには

`AcceptsReturn`プロパティを`True`に設定

### ◎複数行テキストボックスにするには

```xml:xaml
<TextBox
    AcceptsReturn="True"
    TextWrapping="Wrap"
    VerticalScrollBarVisibility="Auto" />
```

### ◎テキストボックスにタブ（TAB）コードを入力できるようにするには

`AcceptsTab`プロパティを`True`に設定

### ◎テキストボックスのIMEを無効にするには

```xml:xaml
<TextBox InputMethod.IsInputMethodEnabled="False"/>
```

### ◎テキストボックスのIMEを「ひらがな」モードにするには

```xml:xaml
<TextBox InputMethod.PreferredImeState="On" InputMethod.PreferredImeConversionMode="FullShape,Native"/>
```

### ◎テキストボックスのテキストを全選択するには

`SelectAll`メソッド

### ◎テキストボックスを読み取り専用にするには

`IsReadOnly`プロパティを`True`に設定

### ◎テキスト系コントロールにウォーターマーク（プレースホルダ）を表示するには

https://qiita.com/Kosen-amai/items/a1cb3e83e2749bd00d96#%E3%82%A6%E3%82%A9%E3%83%BC%E3%82%BF%E3%83%BC%E3%83%9E%E3%83%BC%E3%82%AF

https://qiita.com/Kosen-amai/items/c5cecf81240407693cda#%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E7%B3%BB%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%AE%E8%A8%AD%E5%AE%9A

### ◎数値入力に適したテキスト系コントロールを使うには

数値のみ入力するテキストボックス

https://qiita.com/Kosen-amai/items/a1cb3e83e2749bd00d96#numericupdown

https://qiita.com/Kosen-amai/items/c5cecf81240407693cda#%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E7%B3%BB%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%AE%E8%A8%AD%E5%AE%9A

---

# ■キー

## ◇ショートカット

### ◎アクセスキー（アクセラレータキー）を設定するには

英数字の前に`_`

```xml:xaml（ボタン）
<Button Content="閉じる(_C)"/>
```

```xml:xaml（メニュー）
<Menu>
    <MenuItem Header="_File"/>
    <MenuItem Header="_Edit"/>
    <MenuItem Header="_Help"/>
</Menu>
```

```xml:xaml（ラベルと対になるコントロール）
<StackPanel Orientation="Horizontal">
    <!-- アクセスキーの入力で Target にフォーカスが移動する -->
    <Label Content="名前(_N)" Target="{Binding ElementName=NameText}"/>
    <TextBox x:Name="NameText" Width="100"/>
</StackPanel>
```

## ◇キー入力

### ◎Ctrl, Shift, Altキーが押されているか調べるには

```csharp:C#
// using System.Windows.Input;

if (Keyboard.Modifiers == ModifierKeys.Shift)
{
    // Shiftが押されている
}

if (Keyboard.Modifiers ==
    (ModifierKeys.Control | ModifierKeys.Alt))
{
    // CtrlとAltが押されている
}

if (Keyboard.IsKeyDown(Key.LeftCtrl))
{
    // 左Ctrlが押されている
}
```

<details><summary>VB.NET</summary><div>

```vb:VB.NET
If Keyboard.Modifiers = ModifierKeys.Shift Then
    ' Shiftが押されている
End If

If Keyboard.Modifiers = (ModifierKeys.Control Or ModifierKeys.Alt) Then
    ' CtrlとAltが押されている
End If

If Keyboard.IsKeyDown(Key.LeftCtrl) Then
    ' 左Ctrlが押されている
End If
```

</div></details>

---

# ■ウィンドウ

## ◇画面全般


### ◎Windows 10にマッチした画面デザインにするには

https://qiita.com/Kosen-amai/items/607b9ba3af9222aa7225

### ◎Windows 10のダークテーマ/ライトテーマに対応するには

https://qiita.com/Kosen-amai/items/607b9ba3af9222aa7225

## ◇ウィンドウ（Window）

* Control
    * ContentControl
        * __Window__

フォーム、画面。

### ◎ウィンドウのタイトル文字列を変更するには

`Title`プロパティ

### ◎ウィンドウにサイズ変更グリップを表示するには

`ResizeMode`プロパティを`CanResizeWithGrip`に設定
![SizeGrip_v2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/6b097722-3a10-2827-b8b3-a2c3907a5e63.png)


### ◎最大化ボタン、最小化ボタンを非表示にするには

#### 方法1

`WindowStyle`プロパティを`ToolWindow`に設定

#### 方法2

https://qiita.com/Kosen-amai/items/a1cb3e83e2749bd00d96#%E6%9C%80%E5%A4%A7%E5%8C%96%E3%83%9C%E3%82%BF%E3%83%B3%E6%9C%80%E5%B0%8F%E5%8C%96%E3%83%9C%E3%82%BF%E3%83%B3

### ◎最大化ボタンを無効化するには

https://qiita.com/Kosen-amai/items/d7de36443b33a7e5cb3c

### ◎閉じる（×）ボタンを無効化するには

https://qiita.com/Kosen-amai/items/b7064952cd68545ab648

### ◎ウィンドウを最前面に表示するには

`TopMost`プロパティを`True`に設定

### ◎ウィンドウを閉じるには

`Close`メソッド

### ◎別ウィンドウを表示するには

```CSharp:C#
var wnd = new Window();
wnd.Show();
```

<details><summary>VB.NET</summary><div>

```vb:VB.NET
Dim wnd = New Window()
wnd.Show()
```

</div></details>

### ◎別ウィドウをモーダル表示するには

```CSharp:C#
var wnd = new Window();
wnd.ShowDialog();
```

<details><summary>VB.NET</summary><div>

```vb:VB.NET
Dim wnd = New Window()
wnd.ShowDialog()
```

</div></details>

### ◎タスクバーにアイコンを表示しないようにするには

`ShowInTaskbar`プロパティを`False`に設定

### ◎初期フォーカスを設定するには

`FocusManager.FocusedElement="{Binding ElementName=コントロール名}"`

```Xml:xaml
<Window x:Class="WpfTips.MainWindow"
        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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfTips"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800"
        FocusManager.FocusedElement="{Binding ElementName=txt2}">
    <StackPanel>
        <TextBox x:Name="txt1" Text="" Width="100"/>
        <TextBox x:Name="txt2" Text="ここにフォーカス" Width="100"/>
    </StackPanel>
</Window>
```

---

# ■ダイアログ

## ◇メッセージボックス（MessageBox）

### ◎メッセージボックスを表示するには

```CSharp:C#
MessageBox.Show("Hello!");
```

<details><summary>VB.NET</summary><div>

```vb:VB.NET
MessageBox.Show("Hello!")
```

</div></details>

![msg01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/eaa484e3-99c1-00b3-6c36-eddc48fe9441.png)

### ◎OK/キャンセルメッセージボックスを表示するには

```CSharp:C#
if (MessageBox.Show("こんにちは", "タイトル", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
{
    // OKが押された
}
```

<details><summary>VB.NET</summary><div>

```vb:VB.NET
If MessageBox.Show("こんにちは", "タイトル", MessageBoxButton.OKCancel) = MessageBoxResult.OK Then
    ' OKが押された
End If
```

</div></details>

![msg02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/19f882cd-52d7-a4bd-d7f0-dc37c6e2086e.png)

### ◎アイコン付きメッセージボックスを表示するには

```CSharp:C#
MessageBox.Show("こんにちは", "タイトル", MessageBoxButton.YesNoCancel, MessageBoxImage.Information);
```

<details><summary>VB.NET</summary><div>

```vb:VB.NET
MessageBox.Show("こんにちは", "タイトル", MessageBoxButton.YesNoCancel, MessageBoxImage.Information)
```

</div></details>

![msg03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/66e8e03a-f27e-0ebe-b091-e0f19cb0dd34.png)

### ◎メッセージボックスにデフォルトボタンを設定するには

```CSharp:C#
// 「いいえ」をデフォルト
MessageBox.Show("こんにちは？", "タイトル", MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.No);
```

<details><summary>VB.NET</summary><div>

```vb:VB.NET
' 「いいえ」をデフォルト
MessageBox.Show("こんにちは？", "タイトル", MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.No)
```

</div></details>

![msg04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/c31d1a02-7322-c080-ff7e-8c6390fc358b.png)

## ◇インプットボックス（InputBox）

### ◎InputBoxを表示するには

https://qiita.com/Kosen-amai/items/a1cb3e83e2749bd00d96#inputbox

## ◇ファイルダイアログ（OpenFileDialog/SaveFileDialog）

### ◎ファイル選択ダイアログ（ファイルを開くダイアログ）を表示するには

```CSharp:C#
var dlg = new Microsoft.Win32.OpenFileDialog();
dlg.Title = "開くファイルを選択してください";
dlg.Filter = "テキストファイル|*.txt|CSVファイル|*.csv|全てのファイル|*.*";

if (dlg.ShowDialog() == true)
{
    MessageBox.Show($"{dlg.FileName}が選択されました。");
}
```

<details><summary>VB.NET</summary><div>

```vb:VB.NET
Dim dlg = New Microsoft.Win32.OpenFileDialog()
dlg.Title = "開くファイルを選択してください"
dlg.Filter = "テキストファイル|*.txt|CSVファイル|*.csv|全てのファイル|*.*"

If dlg.ShowDialog() = True Then
    MessageBox.Show($"{dlg.FileName}が選択されました。")
End If
```

</div></details>

### ◎ファイル保存ダイアログ（名前を付けて保存ダイアログ）を表示するには

```CSharp:C#
var dlg = new Microsoft.Win32.SaveFileDialog();
dlg.Title = "保存するファイル名を指定してください";
dlg.Filter = "テキストファイル|*.txt|CSVファイル|*.csv|全てのファイル|*.*";
dlg.FileName = "デフォルトのファイル名.txt";

if (dlg.ShowDialog() == true)
{
    MessageBox.Show($"指定されたファイルパスは{dlg.FileName}です。");
}
```

<details><summary>VB.NET</summary><div>

```vb:VB.NET
Dim dlg = New Microsoft.Win32.SaveFileDialog()
dlg.Title = "保存するファイル名を指定してください"
dlg.Filter = "テキストファイル|*.txt|CSVファイル|*.csv|全てのファイル|*.*"
dlg.FileName = "デフォルトのファイル名.txt"

If dlg.ShowDialog() = True Then
    MessageBox.Show($"指定されたファイルパスは{dlg.FileName}です。")
End If
```

</div></details>

## ◇フォルダダイアログ

### ◎フォルダ選択ダイアログを表示するには

https://qiita.com/Kosen-amai/items/9de7a77a1e6b7851a0b3

---

# ■レイアウト

## ◇コンテナ

### ◎コントロールを縦並びに配置するには

![StackPanel-V.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/76ca9f55-97aa-b14e-bb1b-64e31ab8c60e.png)

`StackPanel`内にコントロールを配置する

```Xml:xaml
<StackPanel>
    <Button Content="ボタン1" Width="100" Height="30"/>
    <Button Content="ボタン2" Width="100" Height="30"/>
    <Button Content="ボタン3" Width="100" Height="30"/>
</StackPanel>
```

### ◎コントロールを横並びに配置するには

![StackPanel-H.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/7f86e189-c51e-aea3-67e5-7eb30f9e5963.png)

`StackPanel`内にコントロールを配置し、`Orientation`プロパティを`Horizontal`に設定する

```Xml:xaml
<StackPanel Orientation="Horizontal">
    <Button Content="ボタン1" Width="100" Height="30"/>
    <Button Content="ボタン2" Width="100" Height="30"/>
    <Button Content="ボタン3" Width="100" Height="30"/>
</StackPanel>
```

### ◎コントロール間に余白を設定するには

![Margin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/bdeff1de-e07a-1959-a58d-1d4a14a6a4be.png)

`Margin`プロパティ

```Xml:xaml
<StackPanel>
    <Button Content="ボタン1" Margin="5" Width="100" Height="30"/>
    <Button Content="ボタン2" Margin="5" Width="100" Height="30"/>
    <Button Content="ボタン3" Margin="5" Width="100" Height="30"/>
</StackPanel>
```

参考）

https://qiita.com/Kosen-amai/items/75136edba4f8ef90d26f

### ◎コントロールを行列指定で配置するには

`Grid`内にコントロールを配置する

#### 例1

![grid02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/845fa73f-62c2-18cb-b95a-f4566c8abb8b.png)

```xml:xaml
<Grid>
    <Grid.ColumnDefinitions>
        <!--  2列  -->
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>

    <Button
        Grid.Column="0"
        Margin="5"
        Content="ButtonA" />
    <Button
        Grid.Column="1"
        Margin="5"
        Content="ButtonB" />
</Grid>
```

#### 例2

![grid01_v2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/04571ade-fa15-cdad-f47e-e4dc6efc22db.png)

```xml:xaml
<Grid>
    <Grid.ColumnDefinitions>
        <!--  3列  -->
        <ColumnDefinition />
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <!--  4行  -->
        <RowDefinition Height="1*" />
        <RowDefinition Height="1*" />
        <RowDefinition Height="2*" />
        <RowDefinition Height="3*" />
    </Grid.RowDefinitions>

    <!--  1行1列目に配置（Row="0", Column="0")  -->
    <Button 
        Content="ButtonA" />
    <!--  1行2列目に配置  -->
    <Button
        Grid.Row="0"
        Grid.Column="1"
        Content="ButtonB" />
    <!--  1～3行3列目に配置  -->
    <Button
        Grid.RowSpan="3"
        Grid.Column="2"
        Content="ButtonC" />
    <!--  3行1列目に配置  -->
    <Button
        Grid.Row="2"
        Grid.Column="0"
        Content="ButtonD" />
    <!--  4行目2～3列に配置  -->
    <Button
        Grid.Row="3"
        Grid.Column="1"
        Grid.ColumnSpan="2"
        Content="ButtonE" />
</Grid>
```

# ■その他

## ◇パス

### ◎実行ファイルのフォルダパスを取得するには

`System.AppDomain.CurrentDomain.BaseDirectory`
または
`System.AppContext.BaseDirectory`

## ◇プロセス

### ◎外部プログラムを実行するには

```csharp:C#
var p = new System.Diagnostics.Process();
// 実行するプログラムを指定
p.StartInfo.FileName = @"C:\Work\ProgramX.exe";
p.StartInfo.UseShellExecute = true;
// 実行
p.Start();
```

<details><summary>VB.NET</summary><div>

```vb:VB.NET
Dim p = New System.Diagnostics.Process()
' 実行するプログラムを指定
p.StartInfo.FileName = "C:\Work\ProgramX.exe"
p.StartInfo.UseShellExecute = True
p.Start()
```

</div></details>

### ◎既定のプログラムでファイルを開くには

[外部プログラムを実行するには](https://qiita.com/Kosen-amai/items/ba13012a4076054df255#%E5%A4%96%E9%83%A8%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF)の方法で、起動するプログラムに対象のファイルを指定すれば関連付けられたアプリケーションで開かれる。

例）
`p.StartInfo.FileName = @"C:\Work\Book1.xlsx";`

# ■開発環境

## ◇Visual Studio

### ◎XAMLを整形するには

#### 標準機能を使う方法

オプション設定

* テキストエディター
    * XAML
        * Formatting（書式設定）
            * General（全般）
                * **指定の長さを超えたタグを折り返す**にチェック
            * Spacing（間隔）
                * **各属性を別の行に配置する**を選択

参考）`Visual Studioのインストール、初期設定` - `初期設定` - `3)`

https://zenn.dev/apterygiformes/books/470ba1042dfbef/viewer/a78803

#### Visual Studio拡張を使う方法

拡張機能の`XAML Styler`をインストールする。
XAMLファイルの保存時に自動的に整形される。
右クリックメニューの`Format XAML`でも整形できる。

https://qiita.com/Kosen-amai/items/e31b62a6f892cb5a7c14

### ◎XAMLを効率よく入力するには

https://qiita.com/Kosen-amai/items/550f398e6675a0ba697f

# ■開発手法

## ◇MVVMで作るには

### ◎MVVMサンプル（足し算）
https://zenn.dev/apterygiformes/articles/79a7c9e7e15106
### ◎MVVMサンプル（画面遷移）
https://zenn.dev/apterygiformes/articles/5c6ccbae6c3939
### ◎MVVMサンプル（処理中表示）
https://zenn.dev/apterygiformes/articles/026d501aa6fef8
### ◎MVVMサンプル（進捗表示）
https://zenn.dev/apterygiformes/articles/c322a22ea296f8