4

プロジェクトには複数のフォームがあります。Form1には、jpegを表示するpictureBoxが含まれています。Form2には、Form1の画像のズームレベルを制御したいtrackBarがあります。簡単にするために、必要なズームレベルは2つまたは3つだけです。DesignerビューでpictureBoxをpublicに設定しました。ただし、Form2でpictureBoxを参照しようとすると、存在しないと表示されます。以下は、Form1でForm2を呼び出すために使用しているコードです。

Form2 dataWindow = new Form2();
dataWindow.ShowDialog();

つまり、私が助けを必要としている2つのことは次のとおりです。

1)pictureBox1のプロパティを別のフォームから変更します。2)簡単なズーム式を作成します。

4

2 に答える 2

3

他のクラスがフォームの内部コントロールを変更できるようにすることは、悪い設計と見なされます。フォームは、そのすべてのコンポーネントを担当する必要があります。内部統制を公開してはいけません。また、子フォームが親フォームへの参照を持つことは悪い習慣と見なされます。

この問題に取り組む適切な方法は、イベントを使用することです。子フォームはForm2、公開イベントを定義する必要があります。

public event Action<int> TrackBarMoved;

Form2トラックバーが移動したときにそのイベントを発生させ、パラメーターとしてトラックバーの位置を渡すことができます(ズームレベルなど、他の何かを渡すことが理にかなっている場合は、それでも問題ありません)。

Form1トラックバーの位置に基づいてFrom2、画像のズームを作成および変更するときに、そのイベントをサブスクライブできます(内部的には内部から)。Form1

于 2012-11-24T04:02:06.180 に答える
2

1)form1参照をform2のコンストラクターに渡します。

Form2 dataWindow = new Form2(this);
dataWindow.Show();

..。

private form1 as Form1;
public Form2(Form1 frm1)
{
  form1 = frm1;
}

次に、Form2sのTrackBar_Scrollイベントで、プライベートメンバー変数form1を介してPictureBoxを参照します。form1.PictureBox1.Property

2)PictureBoxを使用して写真を拡大し、マウスホイールでズームできるようにします


より良い方法はイベントです:

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

    private void button1_Click(object sender, EventArgs e)
    {
        var form2 = new Form2();
        form2.TrackBarMoved += new Action<int>(ZoomPictureBox);
        form2.ShowDialog();
        form2.TrackBarMoved -= new Action<int>(ZoomPictureBox);

    }

    private void ZoomPictureBox(int zoomFactor)
    {
        pictureBox1.Width = 100 * zoomFactor;
        pictureBox1.Height = 100 * zoomFactor;
    }
}


public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

    public event Action<int> TrackBarMoved;

    private void trackBar1_Scroll(object sender, EventArgs e)
    {
        TrackBarMoved(trackBar1.Value);
    }
}
于 2012-11-24T02:59:02.310 に答える