Проблема с Picturebox и попытка обновить изображения - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь обновить изображение в графическом окне по таймеру. Честно говоря, у меня нет большого опыта работы с картинками, и прошло около 5 лет с тех пор, как я вообще занимался C# работой. Я попытался найти в Google и здесь, и не могу найти ответ, который, по-моему, мне нужен: /

По сути, это то, что я пытаюсь сделать. Форма занимает время в секундах (скажем, 5 секунд), и при нажатии кнопки открывается новая форма. Эта новая форма имеет графическое поле, в котором будет отображаться случайная фотография из каталога. Я могу заставить коробку с изображением показывать случайную фотографию, но когда я пытаюсь заставить ее обновить sh без повторного открытия формы, это - то, где у меня возникает проблема.

У меня есть переменная (timeVar), установленная на введенное время в секундах, и таймер на заднем плане, где каждый раз, когда тикает таймер, он обновляет timerVar, вычитая 1. Это то, что я должен установить изображение в графическом окне для каждой итерации. Существует внешний oop, который проходит по моему списку (dirList), пока он не достигнет каждого элемента в списке.

    while(timerVar > 0)
{
     pictureTimer.Start();
     imagePathPic = imagePath + dirList[ind];
     sessionPicture.ImageLocation = @imagePathPic;
     sessionPicture.Refresh();
}
    pictureTimer.Stop();
    timeVar = 5;

dirList - это список всех изображений внутри данной директории, а imagePath - строка, содержащая каталог. Функциональность моего списка / строки была успешно протестирована, так же как и внешняя l oop, но когда я применяю изображение в окне l oop выше, он ничего не делает, пока не получит последнее изображение, затем дисплеи. Чего мне не хватает, чтобы заставить его отображать каждую картинку в форме? Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

Спасибо!

1 Ответ

1 голос
/ 20 апреля 2020

Для меня это работает, чтобы загрузить изображение из файла. Image.FromFile() находится под System.Drawing пространством имен. Мне не нужно было добавлять Refresh() метод. Вы можете попробовать позвонить Refre sh в вашей пользовательской форме this.Refresh() или просто позвонить Refresh().

public partial class Form1 : Form
{
    Timer _timer = new Timer();
    string[] _images;
    Random _random = new Random();
    string _imagesFolder = @"C:\Users\Me\Desktop\Picures\";
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        _timer.Tick += new EventHandler(timer_Tick);
        _timer.Interval = 2000;
        _images = Directory.GetFiles(_imagesFolder);
    }
    private void button1_Click(object sender, EventArgs e)
    {
        _timer.Enabled = !_timer.Enabled;
    }

    private void timer_Tick(object sender, EventArgs e)
    {
        var index = _random.Next(0, _images.Length);
        var imagePath = Path.Combine(_imagesFolder, _images[index]);
        pictureBox1.Image = Image.FromFile(imagePath);
    }
}

Вот макет:

mockup

...