Прокручиваемая панель ящиков, границы не перекрашиваются при прокрутке - PullRequest
0 голосов
/ 10 сентября 2018

Я создаю средство просмотра изображений с прокручиваемыми миниатюрами. У меня есть форма с панелью и автопрокруткой, установленной на 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, но у меня возникают проблемы при прокрутке изображений ТОЛЬКО при использовании трековой части полосы прокрутки (область вне полосы прокрутки, либо левая, либо правая). Щелчок и перетаскивание самой полосы прокрутки или использование стрелок работает нормально (я перекрашиваю из события прокрутки панели, см. Далее ниже). Но при щелчке дорожки границы не перекрашиваются, когда коробки с картинками прокручиваются назад из прокрутки из поля зрения. Например, я нажимаю пару миниатюр и устанавливаю границы:

enter image description here

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

Borders not repainted

Как я уже упоминал выше, при нажатии стрелок полосы прокрутки или перетаскивании полосы прокрутки я перерисовываю границы в событии прокрутки панели:

    private void panel1_Scroll(object sender, ScrollEventArgs e)
    {
        SetBorders(panel1);
    }

Однако при нажатии на дорожку это, похоже, не вызывает событие прокрутки панели.

Я забыл упомянуть, SetBorders (множественное число) - это другой метод (я не включал этот метод в вопросе), который проходит по ящикам с изображениями на панели, и для каждого, который должен быть перекрашен, он вызывает SetBorder (метод включено выше) и передает заданную картинку ...

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

Есть идеи?

1 Ответ

0 голосов

Установите все пикбоксы paint event на одну и ту же субабоненту:

pictureBox1.Paint += pictureBox_Paint;
pictureBox2.Paint += pictureBox_Paint;
....
....

или после , добавив picboxes к panel:

var children = panel1.Controls.OfType<Control>();

foreach( Control child in children ) {
    ( (PictureBox)child ).Paint += pictureBox_Paint;
}

и в случае:

private void pictureBox_Paint( object sender, PaintEventArgs e ) {
    PictureBox picbox = (PictureBox)sender;
    var color = ColorTranslator.FromHtml( "#ff9900" );
    var rc = picbox.ClientRectangle;
    rc.Inflate( -1, -1 );

    ControlPaint.DrawBorder( e.Graphics, rc, color, 3, ButtonBorderStyle.Solid, color, 3, 
                             ButtonBorderStyle.Solid, color, 3, ButtonBorderStyle.Solid, 
                             color, 3, ButtonBorderStyle.Solid );

}

Больше не нужно использовать panel1_Scroll событие!

...