C#ピクチャボックスのサイズ変更イベントについて

C# コンピュータ
C#
ピクチャボックスを扱っていて思わぬところでサイズ変更イベント(Resize)が発生したので、サンプルを書いて確認してみました。

ピクチャボックスのサイズモードを指定

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

        // ピクチャボックスの初期化
        PictureBox pictureBox = new()
        {
            // サイズモードノーマル
            SizeMode = PictureBoxSizeMode.Normal,
            // サイズ指定
            Size = new Size(100, 100),
            // 背景色
            BackColor = Color.Azure,
        };
        // ピクチャボックスのサイズ変更イベント
        pictureBox.Resize += (s, e) =>
        {
            Debug.Print("イベント発生");
        };

        // コントロールの登録
        this.Controls.Add(pictureBox);
    }
}
ピクチャボックスを作成するだけのコードはサイズ変更イベントは発生しませんでした。
サンプルコードではSizeModeにNormalを指定してますが、そのほかの値でもサイズ変更イベントは発生しませんでした。
ただ、後述のAutoSizeで画像のセットでサイズ変更イベントが発生します。

DockStyleをFillで指定した場合

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

        // ピクチャボックスの初期化
        PictureBox pictureBox = new()
        {
            // サイズモードノーマル
            SizeMode = PictureBoxSizeMode.Normal,
            // サイズ指定
            Size = new Size(100, 100),
            // 背景色
            BackColor = Color.Azure,
            // ドックスタイルFill
            Dock = DockStyle.Fill
        };
        // ピクチャボックスのサイズ変更イベント
        pictureBox.Resize += (s, e) =>
        {
            Debug.Print("イベント発生");
        };

        // コントロールの登録
        this.Controls.Add(pictureBox);
    }
}
DockStyleをFillに指定すると親コントロールの表示領域いっぱいにコントロールのサイズが自動的に調整されます。
サンプルの場合Formオブジェクトが親となりますので、ウィンドウサイズの変更に合わせてピクチャボックスのサイズ変更イベントが発生します。

ピクチャボックスのサイズモードがAutoSizeで画像をセット

using System.Diagnostics;

namespace PictureboxResize;

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

        // ピクチャボックスの初期化
        PictureBox pictureBox = new()
        {
            // サイズモードノーマル
            SizeMode = PictureBoxSizeMode.AutoSize,
            // サイズ指定
            Size = new Size(100, 100),
            // 背景色
            BackColor = Color.Azure,
        };
        // ピクチャボックスのサイズ変更イベント
        pictureBox.Resize += (s, e) =>
        {
            Debug.Print("イベント発生");
        };
        // フォームのロードイベント
        this.Load += (s, e) =>
        {
            // Imageプロパティに画像をセット
            var path = @"C:\Users\karet\Pictures\202310010715.jpg";
            pictureBox.Image = Image.FromFile(path);
        };
        // コントロールの登録
        this.Controls.Add(pictureBox);
    }
}
AutoSizeの場合セットした画像のサイズに合わせてピクチャボックスのサイズが変更されるためサイズ変更のイベントが発生した。

ピクチャボックスのサイズモードがAutoSize以外で画像をセット

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

        // ピクチャボックスの初期化
        PictureBox pictureBox = new()
        {
            // サイズモードノーマル
            SizeMode = PictureBoxSizeMode.Normal,
            // サイズ指定(初期値ではResizeは発生しない)
            Size = new Size(100, 100),
            // 背景色
            BackColor = Color.Azure,
        };
        // ピクチャボックスのサイズ変更イベント
        pictureBox.Resize += (s, e) =>
        {
            Debug.Print("イベント発生");
        };
        // フォームのロードイベント
        this.Load += (s, e) =>
        {
            // Imageプロパティに画像をセット
            var path = @"C:\Users\karet\Pictures\202310010715.jpg";
            pictureBox.Image = Image.FromFile(path);
        };
        // コントロールの登録
        this.Controls.Add(pictureBox);
    }
}
SizeModeをNormalなどAutoSize以外で画像を表示してもサイズ変更イベントは発生しない。

ピクチャボックスのサイズをフォームロード後に変更

using System.Diagnostics;

namespace PictureboxResize;

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

        // ピクチャボックスの初期化
        PictureBox pictureBox = new()
        {
            // サイズモードノーマル
            SizeMode = PictureBoxSizeMode.Normal,
            // サイズ指定
            Size = new Size(100, 100),
            // 背景色
            BackColor = Color.Azure,
        };
        // ピクチャボックスのサイズ変更イベント
        pictureBox.Resize += (s, e) =>
        {
            Debug.Print("イベント発生");
        };
        // フォームのロードイベント
        this.Load += (s, e) =>
        {
            // ピクチャボックスのサイズを変更
            pictureBox.Size = new Size(256, 256);
        };
        // コントロールの登録
        this.Controls.Add(pictureBox);
    }
}
フォームのロードイベント内でピクチャボックスサイズを変更してみました。当然サイズ変更イベントが発生します。

感想

AutoSizeでピクチャボックスサイズ変更が発生していることを失念していて、デバッグモードでコードを追いかけても勝手にサイズが変更されるようにしか見えず、結構ハマってしまいました。

コメント