Как заставить PictureBox заполнить UserControl при настройке в дизайнере - PullRequest
1 голос
/ 22 февраля 2012

Технология: .NET 4, C #, WinForms, Visual Studio 2010

Я столкнулся с проблемой при определении размера пользовательского UserControl. Клиент UserControl просто содержит PictureBox со свойствами, установленными так, что полосы прокрутки появляются при необходимости.

UserControl имеет следующие установленные свойства:

  • AutoScaleMode: шрифт
  • Автопрокрутка: True
  • DoubleBuffered: True
  • Минимальный размер: 100, 100
  • Размер: 250, 250

PictureBox имеет следующие установленные свойства:

  • Якорь: сверху, слева
  • Расположение: 0,0
  • Размер: 250, 250
  • SideMode: AutoSize

В представлении конструктора для пользовательского элемента управления PictureBox заполняет все, что требуется. Однако в представлении конструктора для основного приложения пользовательский UserControl изначально имеет размер 250 x 250, как показывал его конструктор, но когда я изменяю его размер, чтобы он соответствовал основному приложению, изменяется только панель UserControl, оставляя PictureBox до originl 250 x 250. Одно из раскрываемых мною свойств - курсор мыши X, Y внутри PictureBox, и когда изображение не загружено, свойство ничего не возвращает за пределы области 250 x 250.

Я пробовал:

  • Установка для свойства Anchor значения Top, Left, Right, Bottom, но это приводит к тому, что UserControl не отображает полосы прокрутки.
  • Установка свойства Dock PictureBox для заполнения, но это также приводит к тому, что UserControl не отображает полосы прокрутки.

Как сделать так, чтобы PictureBox всегда был в полном размере UserControl, даже если он был настроен в конструкторе?

1 Ответ

1 голос
/ 22 февраля 2012

Вам нужны полосы прокрутки в пользовательском элементе управления, поэтому, когда пользовательский элемент управления меньше, чем изображение, показанное в окне Picurebox, пользователь может прокрутить, чтобы увидеть другие части изображения, верно?А также, когда пользовательский элемент управления больше, чем графический блок, вы хотите, чтобы графический блок заполнил пользовательский элемент управления (чтобы вы не могли отловить события мыши на графическом блоке).Правильно?

Прежде всего, вы также можете подписаться на событие мыши на пользовательском элементе управления (в дополнение к графическому блоку), чтобы выполнить желаемое действие.Если это не применимо, вы можете сделать следующее:

Обработать событие Resize пользовательского элемента управления и изменить аспекты графического блока:

(поместите это в свой пользовательский элемент управления)

    protected override void OnResize(EventArgs e)
    {
        base.OnResize(e);

        MaintainPictureBoxSize();
    }

    private void MaintainPictureBoxSize()
    {
        pictureBox1.SizeMode = PictureBoxSizeMode.Normal;

        pictureBox1.Location = new Point();
        pictureBox1.Size = new Size();

        var clientSize = this.ClientSize;

        if (pictureBox1.Image == null)
            pictureBox1.Size = clientSize;
        else
        {
            Size s = pictureBox1.Image.Size;
            pictureBox1.Size = new Size(
                clientSize.Width > s.Width ? clientSize.Width : s.Width,
                clientSize.Height > s.Height ? clientSize.Height : s.Height);
        }
    }

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

...