C#将Form1的PictureBox图像更改为Form2中OpenFileDialog图像选择的图像

时间:2018-04-28 11:40:05

标签: c# winforms

我正在尝试将当前在Form1图片框中显示的图像更改为我在Form2中通过openFileDialog选择的新图像。

似乎无法使其发挥作用。非常感谢帮助,谢谢。

代码:(相关功能)

**Form1.cs**

   public partial class Form1 : Form
{
    //Initializing first form:
    public Form1()
    {
        InitializeComponent();
    }

    public Form1(Image newImage)
    {
        InitializeComponent();
        picBtn.Image = newImage;
    }

    //This function is activated if the picture button was clicked:
    private void picBtn_Click(object sender, EventArgs e)
    {
        Form2 form2 = new Form2();
        form2.ShowDialog();

    }
}

**Form2.cs**

public partial class Form2 : Form
{
    //Initializing second form:
    public Form2()
    {
        InitializeComponent();
    }

    //This function is activated if the image upload button was clicked:
    private void imageUploadBtn_Click(object sender, EventArgs e)
    {
        //New file dialog object:
        OpenFileDialog dialog = new OpenFileDialog();
        //Accept images for files only:
        dialog.Filter= "Image files (*.jpg, *.jpeg, *.jpe, *.jfif, *.png) | *.jpg; *.jpeg; *.jpe; *.jfif; *.png";
        dialog.ShowDialog();
        Image newImage = Image.FromFile(dialog.FileName);
        Form1 form1 = new Form1(newImage);
    }
}

2 个答案:

答案 0 :(得分:1)

这里的问题是你有Form1的多个实例。想象一下Form1是一个苹果,Form2是一个橘子。您在屏幕上显示了苹果,picBtn_Click告诉计算机现在还显示橙色。

此橙色({1}}告诉计算机创建包含所选图像的imageUploadBtn_Click。但是,您并没有告诉现有的苹果显示它,而且您也没有要求在屏幕上显示您的第二个苹果。

为这个奇怪的比喻道歉,但我希望它有所帮助。您希望new Apple了解现有的Form2。您可以让Form1构造函数在创建时Form2采用Form1来执行此操作:

Form2

private readonly Form1 _apple;

//Initializing second form:
public Form2(Form1 apple)
{
    InitializeComponent();
    _apple = apple;
}

//This function is activated if the image upload button was clicked:
private void imageUploadBtn_Click(object sender, EventArgs e)
{
    //New file dialog object:
    OpenFileDialog dialog = new OpenFileDialog();
    //Accept images for files only:
    dialog.Filter= "Image files (*.jpg, *.jpeg, *.jpe, *.jfif, *.png) | *.jpg; *.jpeg; *.jpe; *.jfif; *.png";
    dialog.ShowDialog();
    Image newImage = Image.FromFile(dialog.FileName);
    // now, instead of creating a second instance of Form1,
    // pass the image to the existing instance.
    _apple.UpdatePicture(newImage);
}

您需要在名为public的{​​{1}}上创建Form1方法,但我会留给您。在创建UpdatePicture时,您还需要Form1将自己传递给Form2,这可以这样做:

Form2

请注意,虽然这样可行,但我们会尽量避免将耦合 UI元素放在一起。它会起作用,但有一些更复杂的机制,例如MVVM可能值得一看。

答案 1 :(得分:0)

嗯,你可以这样做......

将您的class ViewController: UIViewController { var activityIndicator = UIActivityIndicatorView() var refreshBarButton = UIBarButtonItem() var activityBarButton = UIBarButtonItem() override func viewDidLoad() { super.viewDidLoad() activityIndicator.sizeToFit() activityIndicator.color = self.view.tintColor activityBarButton = UIBarButtonItem.init(customView: activityIndicator) refreshBarButton = UIBarButtonItem(barButtonSystemItem: .refresh, target: self, action: #selector(refreshBarButtonPressed)) showRefreshButton() } func performNetworkOperation(completion: @escaping(Bool)->()) { //simulate network operation DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(3), execute: { completion(true) }) } @objc func refreshBarButtonPressed() { showActivityIndicator() activityIndicator.startAnimating() performNetworkOperation { (result) in //completion self.activityIndicator.stopAnimating() self.showRefreshButton() } } func showRefreshButton() { self.navigationItem.setRightBarButton(refreshBarButton, animated: true) } func showActivityIndicator() { self.navigationItem.setRightBarButton(activityBarButton, animated: true) } } 方法更改为这样。 在这里,我删除了您的Form1.cs方法并添加了一个名为Form1(Image newImage)的新公共方法。

public void ChangePicImg(Image newImage)

另外,像这样更改public Form1() { InitializeComponent(); } public void ChangePicImg(Image newImage) { picBtn.Image = newImage; } private void picBtn_Click(object sender, EventArgs e) { Form2 form2 = new Form2(); form2.ShowDialog(); }

Form2

public Form2() { InitializeComponent(); } private void imageUploadBtn_Click(object sender, EventArgs e) { OpenFileDialog dialog = new OpenFileDialog(); dialog.Filter = "Image files (*.jpg, *.jpeg, *.jpe, *.jfif, *.png) | *.jpg; *.jpeg; *.jpe; *.jfif; *.png"; dialog.ShowDialog(); Image newImage = Image.FromFile(dialog.FileName); Form1 frm1 = (Form1)System.Windows.Forms.Application.OpenForms["Form1"]; //Enter the Form1 name here frm1.ChangePicImg(newImage); } =将Form1替换为Form1名称。