LoginSignup
0
0

More than 3 years have passed since last update.

[Windows Forms] ボタンに画像を2つ表示

Last updated at Posted at 2021-03-21

■概要

画像を2つ設定したボタン
00.png

■環境

  • Windows 10
  • Visual Studio 2019 Community Version 16.9.2
  • .NET Framework 4.7.2

■プロジェクトの作成

新しいプロジェクトを作成します。
検索条件で絞り込んでWindows フォーム アプリケーション(.NET Framework)を選択します。
01_.png

プロジェクト名を入力し、フレームワークを選択します。
ここではプロジェクト名をWindowsFormsApp1
フレームワークは4.5~4.8、ここでは.NET Framework 4.7.2にしました。
02_.png

03_.png

■画面コンテンツ枠の追加

プロジェクトを右クリックし、「追加」-「新しい項目」を選択します。
04.png

「WPF」-「ユーザーコントロール(WPF)」を選択し、名前にForm1Childと入力して追加します。
05.png
06.png

メニューの「ビルド」-「ソリューションのビルド」でビルドしておきます。

Form1を選択し、ツールボックスの「WPF相互運用機能」の「ElementHost」をForm1にドラッグ&ドロップします。
07.png

「ホストするコンテンツの選択」のドロップダウンを開き、Form1Childを選択します。
08.png

「親コンテナーにドッキングする」を選択します。
09.png
10.png

■土台部分作成

デザイナの「Form1Child.xaml」のタブを選択し、メニューの「表示」-「その他のウィンドウ」-「ドキュメントアウトライン」を選択します。
11.png

ドキュメントアウトラインを使いやすい位置に配置します。
12.png

Gridを選択状態にし、デザイナの薄く赤線を引いた部分にマウスポインタを近づけると+マークが付きます。
そこでクリックするとGridを分割できます。
13.png
14.png

ツールボックスから「StackPanel」を行分割したGridの下の行にドラッグ&ドロップします。
20.png

Gridの中にStackPanelが追加されました。
21.png

StackPanelは既定では中に配置したコントロールを縦並びに整列させます。
これを横並びに変更します。
StackPanelを選択し、プロパティウィンドウの「整列」-「Orientation」でHorizontalを選択します。
22.png

■ボタンの追加

ツールボックスから「Button」を画面のStackPanel上にドラッグ&ドロップします。
23.png

続けて2つ、「Button」をStackPanel上にドラッグ&ドロップします。
24.png
25.png

■画像リソースの読み込み

以下のファイルをダウンロードしてgreen.png, orange.pngという名前で保存します。
green.png
orange.png

プロジェクトの「Properties」-「Resources.resx」をダブルクリックし、
「リソースの追加」のをクリックし、「既存のファイルの追加」を選択します。
26.png

green.pngとorange.pngを追加します。
27.png

「Resources」フォルダの「green.png」を選択し、
プロパティウィンドウの「ビルドアクション」でResourcesを選択します。
28.png

「orange.png」も同様に設定します。
29.png

メニューの「ビルド」-「ソリューションのビルド」でビルドしておきます。

■画像付きボタンの作成

◇部品配置

ツールボックスから「StackPanel」を1つめのボタン上にドラッグ&ドロップします。
30.png

ボタンの中にStackPanelが入りました。
31.png

ドキュメントアウトライン上でStackPanelが選択状態になっていることを確認し、
プロパティウィンドウで「レイアウト」-「Orientation」を先程と同じHorizontalに設定します。

ツールボックスからドキュメントアウトラインの「Button」の中の「StackPanel」上に、
「Image」、「TextBlock」、「Image」の順にドラッグ&ドロップします。
32.png
33.png

◇画像設定

ドキュメントアウトラインで1つめの「Image」を選択し、
プロパティウィンドウの「共通」-「Source」のを開き、「green.png」を選択します。
34.png

「Image」をプロパティウィンドウの「レイアウト」で「Width」と「Height」を20に設定します。
35.png

もう一つの「Image」も「orange.png」を読み込ませて同様に設定します。
36.png

◇余白調整、ボタンテキスト変更

ドキュメントアウトラインで「TextBlock」を選択し、
プロパティウィンドウの「レイアウト」-「Margin」で左右余白8を設定します。
「共通」-「Text」に押してくださいを入力します。
37.png
「レイアウト」-「VerticalAlignment」をCenterに設定します。
37-2.png

◇イベント追加

ドキュメントアウトラインで1つめのボタンを選択し、プロパティウィンドウで稲妻マークを選択し、イベント一覧を表示します。
「Click」横のテキストボックスをダブルクリックします。
38.png

メッセージボックスを表示する処理を記述します。

Form1Child.xaml.cs
private void Button_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("押された!", "タイトル", 
        MessageBoxButton.OK, MessageBoxImage.Information);
}

■Gridの行高さ調整

適当に設定していたGridの行高さを調整します。
ドキュメントアウトラインでGridを選択し、デザイナでGridの下の行の左端あたりにマウスポインタを移動します。
40.png

ドロップダウンを開いて「Auto」を選択します。
41.png

Grid行の中の要素(ボタン)に合わせて自動調整されます。
42.png

■ボタン間隔調整

ボタンがぴったりくっついているので間隔を調整します。
以下をUserControlの開始タグとGridの開始タグの間に記述します。

Form1Child.xaml
<UserControl.Resources>
    <Style TargetType="Button">
        <Setter Property="Margin" Value="8" />
    </Style>
</UserControl.Resources>

これでこのUserControlの中にあるすべてのボタンの上下左右に余白8が設定されました。
43.png

ボタンの淵と中身の間隔「Padding」も設定してみます。

<Style TargetType="Button">
    <Setter Property="Margin" Value="8" />
    <Setter Property="Padding" Value="24,8" />
</Style>

44.png

ボタンの淵~中身の左右の間隔は24、上下間隔は8に設定しました。
45.png

■実行

46.png

■おまけ

閉じるボタンを実装します。
3つめのボタンのテキストを閉じるにし、ClickイベントにCloseButton_Clickを入力してEnterします。
50.png

プロパティCloseActionを追加し、CloseButton_Clickの中で呼び出します。

Form1Child.xaml.cs
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にフォームを閉じる処理を設定します。

Form1.cs
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            var child = elementHost1.Child as Form1Child;
            child.CloseAction = () => Close();
        }
    }
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0