C # Изменение изображения PictureBox формы Form1 на изображение из выбора изображений OpenFileDialog в Form2 - PullRequest
0 голосов
/ 28 апреля 2018

Я пытаюсь изменить изображение, представленное в данный момент в графическом окне Form1, на новое изображение, которое я выбираю через openFileDialog в Form2.

Не могу заставить его работать. Помощь высоко ценится, спасибо.

Код: (Связанные функции)

**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 голосов
/ 28 апреля 2018

Проблема в том, что у вас есть несколько экземпляров из Form1. Представьте, что Form1 было яблоком, а Form2 апельсином. У вас есть ваше яблоко на экране, которое в picBtn_Click говорит компьютеру теперь также отображать оранжевый.

Этот оранжевый в 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 метод для Form1 с именем UpdatePicture, но я оставлю это вам. Вам также нужно будет Form1 передать себя Form2, когда он создаст Form2, что можно сделать так:

Form2 form2 = new Form2(this);

Обратите внимание, что пока это будет работать, мы стараемся избегать связывания элементов пользовательского интерфейса вместе, как это. Это будет работать, но есть некоторые более сложные механизмы, такие как MVVM , на которые стоит обратить внимание.

0 голосов
/ 28 апреля 2018

Ну, вы можете сделать что-то вроде этого ...

Измените свой 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 на ваше имя Form1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...