Я создаю средство просмотра изображений с прокручиваемыми миниатюрами. У меня есть форма с панелью и автопрокруткой, установленной на true на панели. Я загружаю панель с картинками, по одному на каждое изображение в папке; это миниатюры, которые можно прокручивать на панели, если на панели есть несколько графических окон.
Я могу щелкнуть одну или несколько коробок с картинками (миниатюры) и поставить рамку вокруг каждой картинки, по которой щелкают. Сначала я использовал BorderStyle = BorderStyle.Fixed3D, но эта тонкая граница неадекватна. Итак, теперь я устанавливаю границу на картинке, рисуя прямоугольник на картинке:
private void SetBorder(PictureBox pb)
{
var color = ColorTranslator.FromHtml("#ff9900");
var rc = pb.ClientRectangle;
rc.Inflate(-1, -1);
ControlPaint.DrawBorder(pb.CreateGraphics(), rc, color, 3, ButtonBorderStyle.Solid, color, 3, ButtonBorderStyle.Solid, color, 3, ButtonBorderStyle.Solid, color, 3, ButtonBorderStyle.Solid);
}
Это выглядит намного лучше, чем хромой стиль Fixed3D borderstyle, но у меня возникают проблемы при прокрутке изображений ТОЛЬКО при использовании трековой части полосы прокрутки (область вне полосы прокрутки, либо левая, либо правая). Щелчок и перетаскивание самой полосы прокрутки или использование стрелок работает нормально (я перекрашиваю из события прокрутки панели, см. Далее ниже). Но при щелчке дорожки границы не перекрашиваются, когда коробки с картинками прокручиваются назад из прокрутки из поля зрения. Например, я нажимаю пару миниатюр и устанавливаю границы:

Границы выглядят хорошо, но если я прокручиваю вправо (нажимая на дорожку), затем обратно налево, то, что было покрыто, не перекрашивается. Например:

Как я уже упоминал выше, при нажатии стрелок полосы прокрутки или перетаскивании полосы прокрутки я перерисовываю границы в событии прокрутки панели:
private void panel1_Scroll(object sender, ScrollEventArgs e)
{
SetBorders(panel1);
}
Однако при нажатии на дорожку это, похоже, не вызывает событие прокрутки панели.
Я забыл упомянуть, SetBorders (множественное число) - это другой метод (я не включал этот метод в вопросе), который проходит по ящикам с изображениями на панели, и для каждого, который должен быть перекрашен, он вызывает SetBorder (метод включено выше) и передает заданную картинку ...
Только что обнаружил, что проблема присутствует и при использовании колесика мыши для прокрутки.
Есть идеи?