Перерисовка изображения c#

303
06 апреля 2017, 16:57

Всем доброго времени. Вопрос такой : использую Graphics для рисовки нескольких контуров (формат PNG) на PictureBox. Каждый раз когда я нажимаю на RadioBtn изображение перерисовывается согласно рисунку, чей RadioBtn был нажат. Проблема в том, что перерисованные контуры мелькают пока держиться зажатой ЛКМ, потом исчезают. Я наверное какую то мелочь не там написал, но найти не могу. Собсно:

 try
        {
            Image fon=Image.FromFile($"styles/{selectedRadioButton_Text}.png");
            pbx_StylePic.BackgroundImage = fon;
            Graphics gr = pbx_StylePic.CreateGraphics();

            for (int i = 0; i < OrderData.Styles.Count; i++)
            {
                if (OrderData.Styles[i] != "")
                {
                    Image im = Image.FromFile($"styles/shirt/{OrderData.Styles[i]}.png");
                    gr.DrawImage(im, new Point(0, 0));
                }
            }
        }

Подскажите, где напутался? Спасибо!

Answer 1

При нажатии на радио кнопку происходит несколько событий, просто нужно использовать правильное. Используйте событие CheckedChanged вместо Click.

private void radioButton1_CheckedChanged(Object sender, EventArgs e)
{
   var rb = (RadioButton)sender;
   if (rb.Checked)
   {
      //ваш код
   }
}

Срабатывать будет строго один раз при включении кнопки. При клике по включенной кнопке повторного выполнения не будет, при снятии выбора с кнопки тоже.

Вообще, по уму, вы не должны рисовать вручную. Я не знаю на чем именно вы там рисуете, а вы этого не написали, но я бы дела это по-другому:

  • картинки кладем в ресурсы
  • радио-кнопками выбираем нужное изображение из коллекции (по индексу или имени не суть)
  • контрол отображающий картинку берет ее по этому имени/индексу в момент перерисовки в событии Paint или унаследованном переопределенном методе OnPaint если контрол не стандартный, а унаследованный.

Таким образом не придется ловить ошибки связанные с перерисовкой окна после сворачивания в трей, изменения размера и т.д.

Answer 2
             try
            {
            Graphics gr = pbx_StylePic.CreateGraphics();
            pbx_StylePic.Refresh();
            foreach (string s in OrderData.Styles)
            {
                if (s != "")
                {
                    Image im = Image.FromFile($"styles/shirt/{s}.png");
                    gr.DrawImage(im, new Point(0, 0));
                }
             }
          }
READ ALSO
Ошибка при редактировании отфильтрованного BindingListCollectionView

Ошибка при редактировании отфильтрованного BindingListCollectionView

BindingListCollectionView является источником для DataGrid

200
Преобразование массива double в complex

Преобразование массива double в complex

ЗдравствуйтеПодскажите, пожалуйста, я пытаюсь преобразовать массив double в массив complex, как мне говорили ранее, в действительной части мы записываем...

286
Что такое делегат в языке С#?

Что такое делегат в языке С#?

Объясните простым, человеческим языком, кто такой и зачем нужен делегат в ООП вообще и в С# в частности? Спасибо!

390
C#. Изменение информации о файле.

C#. Изменение информации о файле.

Как изменить информацию о exe версию файла, версию продукта? К примеру изменить дату создания можно через IOFile

393