Как сохранить ссылку на PictureBox Image, привязанную к переменной, а не к объекту переменной? - PullRequest
0 голосов
/ 17 января 2020

Я работаю в C# и хочу сохранить ссылку на PictureBox.Image, привязанную к переменной, а не к объекту переменной. Это означает, что я хочу свободно изменять объекты этой переменной, и PictureBox всегда будет ссылаться на эту переменную.

У меня есть класс, который манипулирует изображениями, объединяет их и возвращает изображение ImageShow для визуализации в PictureBox. Часто мне приходится присваивать новый объект Image переменной. Когда я это делаю, PictureBox сохраняет старый объект, а я хочу, чтобы он взял новый.

class Foo
{
   Image ImageShow = null;

   public void FooFunc()
   {
      //some code
      changeImageSize(new Size(600,800))
   }

   private void changeImageSize(Size newSize)
   {
      if(ImageShow != null)
         ImageShow.Dispose();
      ImageShow = new Bitmap(newSize.Width, newSize.Height);
   }
}

Когда я делаю код, подобный следующему:

var obj = Foo();
obj.SetImage(new Bitmap(50,50));
pictureBox.Image = obj.GetImage();
obj.FooFunc();

PictureBox сохраняет уничтожено старое изображение объекта. Поэтому я получаю сообщение об ошибке, если пытаюсь что-либо сделать с PictureBox.

Возврат нового объекта изображения каждый раз создает множество зависимостей между внутренним кодом класса и PictureBox. Так что это не лучшее решение для меня.

Простой пример:

Image img;

img = new Bitmap(200, 200);
pictureBox1.Image = img;

img = new Bitmap(300, 300);

Picturebox продолжает ссылаться на старое изображение

pictureBox1.Image.Size = {Width = 200 Height = 200}

В то время как я хочу, чтобы в относится к переменной img и новый объект

1 Ответ

0 голосов
/ 17 января 2020

Вы можете изучить привязку свойства Image PictureBox с помощью PictureBox.Bindings.Add() и создать объект для привязки к нему, реализующий INotifyPropertyChanged, чтобы при установке свойства изображения для этого объекта обновлялся Picturebox - или, что гораздо проще, вы можете инкапсулировать ImageShow в свойстве и добавить логи c для обновления Picturebox в сеттер.

private Image _imageShow = null;
public Image ImageShow {
    get {
        return _imageShow
    }
    set {
        _imageShow = value;
        pictureBox1.Image = value;
    }
}

Затем, когда вы устанавливаете ImageShow в новое image, PictureBox будет установлен на то же изображение.

Причина, по которой ваш код не работает как есть, заключается в том, что ImageShow хранит ссылку на Image и устанавливает pictureBox1.Image устанавливает свойство для ссылки на тот же Image - но если вы измените то, что ImageShow ссылается на PictureBox, он никогда не увидит этого, так как ссылается на исходное изображение, а не на поле ImageShow.

...