4

我的项目中有多种形式。Form1 包含一个显示 jpeg 的图片框。在 Form2 中,我有一个 trackBar,我想控制 Form1 中图像的缩放级别。为了简单起见,我只需要 2 或 3 个缩放级别。我已在设计器视图中将图片框设置为公共。但是,当我尝试在 Form2 中引用图片框时,它说它不存在。下面是我用来在 Form1 中调用 Form2 的代码

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

简而言之,我需要帮助的两件事是:

1) 从单独的窗体中更改图片框1 的属性。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 回答