C# 使用两种形式缩放

C# 使用两种形式缩放,c#,zooming,picturebox,trackbar,C#,Zooming,Picturebox,Trackbar,我的项目中有多个表单。Form1包含一个显示jpeg的pictureBox。在Form2中,我有一个轨迹栏,我想控制Form1中图像的缩放级别。为了保持简单,我只需要2或3个缩放级别。我已在Designer视图中将pictureBox设置为public。然而,当我试图引用Form2中的pictureBox时,它说它不存在。下面是我用来在Form1中调用Form2的代码 Form2 dataWindow = new Form2(); dataWindow.ShowDialog(); 总之,我需要

我的项目中有多个表单。Form1包含一个显示jpeg的pictureBox。在Form2中,我有一个轨迹栏,我想控制Form1中图像的缩放级别。为了保持简单,我只需要2或3个缩放级别。我已在Designer视图中将pictureBox设置为public。然而,当我试图引用Form2中的pictureBox时,它说它不存在。下面是我用来在Form1中调用Form2的代码

Form2 dataWindow = new Form2();
dataWindow.ShowDialog();
总之,我需要帮助的两件事是:

1) 从单独的表单更改pictureBox1的属性。 2) 创建一个简单的缩放公式

1)将form1引用传递给form2的构造函数:

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

然后在Form2s TrackBar_Scroll事件中,通过私有成员变量form1引用PictureBox:
form1.PictureBox1.Property

(二)


更好的方法是:

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);
    }
}
公共部分类表单1:表单
{
公共表格1()
{
初始化组件();
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
var form2=新form2();
form2.TrackBarMoved+=新操作(ZoomPictureBox);
form2.ShowDialog();
form2.TrackBarMoved-=新操作(ZoomPictureBox);
}
私有void ZoomPictureBox(int zoomFactor)
{
pictureBox1.宽度=100*zoomFactor;
pictureBox1.高度=100*zoomFactor;
}
}
公共部分类表单2:表单
{
公共表格2()
{
初始化组件();
}
公共事件行动计划;
私有void trackBar1_滚动(对象发送方,事件参数e)
{
TrackBarMoved(trackBar1.Value);
}
}

允许其他类修改表单的内部控件被认为是糟糕的设计。表单应负责其所有组件。你不应该公开任何内部控制。子窗体引用父窗体也被认为是不好的做法

解决这个问题的适当方法是通过事件。子窗体
Form2
,应该定义一个公共事件:

public event Action<int> TrackBarMoved;
公共事件动作轨迹栏移动;
Form2
可以在移动轨迹栏时触发该事件,并将轨迹栏的位置作为参数传递(如果传递其他内容(如缩放级别或任何您想要的内容)是有意义的,也可以)


Form1
当它从2创建
时,可以订阅该事件,并根据轨迹栏的位置更改图片的缩放(内部,从
Form1
)。

将父窗体的引用传递给子窗体通常被认为是不好的做法。谢谢。我尝试了部分示例代码。问题。。。显示对话框之前和之后似乎有两个操作。。我只尝试了+=新操作的代码,它与没有第二个-=操作的代码具有相同的效果。。第二个操作的预期目的是什么?当您订阅事件处理程序
+=
时,您需要在完成后取消订阅
-=
。否则可能导致内存泄漏。再次感谢你们两位。代码工作得很好。我现在使用相同的概念在第二个表单上创建一些滚动条。这门语言的一点知识似乎有很大帮助。@Servy有最好的建议,为了您的方便,我编辑了我的答案以包含完整的实现。只需将PictureBox和按钮添加到form1,将轨迹栏添加到form2,然后粘贴到代码中。
public event Action<int> TrackBarMoved;