■概要
■環境
- Windows 10
- Visual Studio 2019 Community Version 16.9.2
- .NET Framework 4.7.2
■プロジェクトの作成
新しいプロジェクトを作成します。
検索条件で絞り込んでWindows フォーム アプリケーション(.NET Framework)
を選択します。
プロジェクト名を入力し、フレームワークを選択します。
ここではプロジェクト名をWindowsFormsApp1
、
フレームワークは4.5~4.8、ここでは.NET Framework 4.7.2
にしました。
■画面コンテンツ枠の追加
プロジェクトを右クリックし、「追加」-「新しい項目」を選択します。
「WPF」-「ユーザーコントロール(WPF)」を選択し、名前にForm1Child
と入力して追加します。
メニューの「ビルド」-「ソリューションのビルド」でビルドしておきます。
Form1を選択し、ツールボックスの「WPF相互運用機能」の「ElementHost」をForm1にドラッグ&ドロップします。
「ホストするコンテンツの選択」のドロップダウンを開き、Form1Child
を選択します。
■土台部分作成
デザイナの「Form1Child.xaml」のタブを選択し、メニューの「表示」-「その他のウィンドウ」-「ドキュメントアウトライン」を選択します。
Gridを選択状態にし、デザイナの薄く赤線を引いた部分にマウスポインタを近づけると+
マークが付きます。
そこでクリックするとGridを分割できます。
ツールボックスから「StackPanel」を行分割したGridの下の行にドラッグ&ドロップします。
StackPanelは既定では中に配置したコントロールを縦並びに整列させます。
これを横並びに変更します。
StackPanelを選択し、プロパティウィンドウの「整列」-「Orientation」でHorizontal
を選択します。
■ボタンの追加
ツールボックスから「Button」を画面のStackPanel上にドラッグ&ドロップします。
続けて2つ、「Button」をStackPanel上にドラッグ&ドロップします。
■画像リソースの読み込み
以下のファイルをダウンロードしてgreen.png
, orange.png
という名前で保存します。
プロジェクトの「Properties」-「Resources.resx」をダブルクリックし、
「リソースの追加」の▼
をクリックし、「既存のファイルの追加」を選択します。
「Resources」フォルダの「green.png」を選択し、
プロパティウィンドウの「ビルドアクション」でResources
を選択します。
メニューの「ビルド」-「ソリューションのビルド」でビルドしておきます。
■画像付きボタンの作成
◇部品配置
ツールボックスから「StackPanel」を1つめのボタン上にドラッグ&ドロップします。
ドキュメントアウトライン上でStackPanelが選択状態になっていることを確認し、
プロパティウィンドウで「レイアウト」-「Orientation」を先程と同じHorizontal
に設定します。
ツールボックスからドキュメントアウトラインの「Button」の中の「StackPanel」上に、
「Image」、「TextBlock」、「Image」の順にドラッグ&ドロップします。
◇画像設定
ドキュメントアウトラインで1つめの「Image」を選択し、
プロパティウィンドウの「共通」-「Source」の▼
を開き、「green.png」を選択します。
「Image」をプロパティウィンドウの「レイアウト」で「Width」と「Height」を20
に設定します。
もう一つの「Image」も「orange.png」を読み込ませて同様に設定します。
◇余白調整、ボタンテキスト変更
ドキュメントアウトラインで「TextBlock」を選択し、
プロパティウィンドウの「レイアウト」-「Margin」で左右余白8
を設定します。
「共通」-「Text」に押してください
を入力します。
「レイアウト」-「VerticalAlignment」をCenter
に設定します。
◇イベント追加
ドキュメントアウトラインで1つめのボタンを選択し、プロパティウィンドウで稲妻マークを選択し、イベント一覧を表示します。
「Click」横のテキストボックスをダブルクリックします。
メッセージボックスを表示する処理を記述します。
private void Button_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("押された!", "タイトル",
MessageBoxButton.OK, MessageBoxImage.Information);
}
■Gridの行高さ調整
適当に設定していたGridの行高さを調整します。
ドキュメントアウトラインでGridを選択し、デザイナでGridの下の行の左端あたりにマウスポインタを移動します。
■ボタン間隔調整
ボタンがぴったりくっついているので間隔を調整します。
以下をUserControlの開始タグとGridの開始タグの間に記述します。
<UserControl.Resources>
<Style TargetType="Button">
<Setter Property="Margin" Value="8" />
</Style>
</UserControl.Resources>
これでこのUserControlの中にあるすべてのボタンの上下左右に余白8
が設定されました。
ボタンの淵と中身の間隔「Padding」も設定してみます。
<Style TargetType="Button">
<Setter Property="Margin" Value="8" />
<Setter Property="Padding" Value="24,8" />
</Style>
ボタンの淵~中身の左右の間隔は24
、上下間隔は8
に設定しました。
■実行
■おまけ
閉じるボタンを実装します。
3つめのボタンのテキストを閉じる
にし、ClickイベントにCloseButton_Click
を入力してEnterします。
プロパティCloseAction
を追加し、CloseButton_Clickの中で呼び出します。
using System;
using System.Windows;
using System.Windows.Controls;
namespace WindowsFormsApp1
{
/// <summary>
/// Form1Child.xaml の相互作用ロジック
/// </summary>
public partial class Form1Child : UserControl
{
public Action CloseAction { get; set; }
public Form1Child()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("押された!", "タイトル",
MessageBoxButton.OK, MessageBoxImage.Information);
}
private void CloseButton_Click(object sender, RoutedEventArgs e)
{
CloseAction();
}
}
}
CloseActionにフォームを閉じる処理を設定します。
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
var child = elementHost1.Child as Form1Child;
child.CloseAction = () => Close();
}
}
}