Хранение PictureBox по центру внутри контейнера - PullRequest
10 голосов
/ 21 февраля 2012

Я создаю простую программу просмотра изображений с возможностью некоторой базовой обработки изображений.В настоящее время у меня есть проблема с постоянным центрированием PictureBox внутри TabPage, а также с сохранением ширины и размера Picturebox в соответствии с изображением, которое он показывает.До сих пор у меня не было успеха.

У меня есть следующий код, который я вызываю в конструкторе формы, чтобы расположить его в центре.он работает в первый раз для центрирования Picturebox:

private void SetPictureBoxOriginalSizeAndLocation(bool makeImageNull = false, DockStyle dockStyle = DockStyle.None)
{
    if (makeImageNull) picBoxView.Image = null;
    picBoxView.Dock = dockStyle;

    var xPoint = tabImageView.Location.X + ((splitContainer.Panel2.Width / 2) / 2);
    var yPoint = tabImageView.Location.Y;

    var width = tabImageView.Width / 2;
    var height = (tabImageView.Height / 2) - toolStripImageView.Height;

    if (picBoxView.Image == null) return;

    //Resize image according to width
    picBoxView.Image = ImageMethods.ResizeImage(picBoxView.Image.Tag.ToString(), width, height, false); 

    picBoxView.Location = new Point(xPoint, yPoint);
    picBoxView.Width = width;
    picBoxView.Height = height;
}

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

IT is ok the first time

Проблема усугубляется, как только я изменяю размер формы, позиция в окне рисунка поднимается вверх:

Form resized

Я звонюВыше приведен код в событии изменения размера формы, понятия не имею, почему он работает при запуске приложения.Было бы неплохо, если бы кто-нибудь сказал мне, о каких свойствах я должен позаботиться, чтобы получить красиво центрированную коробку с картинками, размер которой всегда так же велик, как ее изображение.

Ответы [ 3 ]

17 голосов
/ 21 февраля 2012

Это довольно легко, если вы просто установите стиль Anchor в none:

picBoxView = new PictureBox();
picBoxView.SizeMode = PictureBoxSizeMode.AutoSize;
picBoxView.Anchor = AnchorStyles.None;
tabImageView.Controls.Add(picBoxView);
CenterPictureBox(picBoxView, myImage);

Затем просто сначала центрируйте PictureBox при каждом изменении изображения PictureBox:

private void CenterPictureBox(PictureBox picBox, Bitmap picImage) {
  picBox.Image = picImage;
  picBox.Location = new Point((picBox.Parent.ClientSize.Width / 2) - (picImage.Width / 2),
                              (picBox.Parent.ClientSize.Height / 2) - (picImage.Height / 2));
  picBox.Refresh();
}

Наличие Anchor = None будет центрировать элемент управления PictureBox для вас всякий раз, когда размер родительского контейнера изменяется, поскольку он «не» привязан к расположениям по умолчанию слева и сверху.

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

Я полагаю, что ваша проблема заключается здесь

var xPoint = tabImageView.Location.X + ((splitContainer.Panel2.Width / 2) / 2);
var yPoint = tabImageView.Location.Y;

var width = tabImageView.Width / 2;
var height = (tabImageView.Height / 2) - toolStripImageView.Height;

Точка y всегда установлена ​​в tabImageView Y, хотя она должна быть установлена ​​в

tabImageView.Location.Y + (tabImageView.Size.Height - picBoxView.Size.Height)/2

, должна быть почти такой же с xPoint

tabImageView.Location.X + (tabImageView.Size.Width - picBoxView.Size.Width)/2

и

width = picBoxView.Image.Width;
height = picBoxView.Image.Height;
1 голос
/ 21 февраля 2012

Givien a Form с TabControl, для которого Dock установлено на Fill, ниже будет держать ваш PictureBox в центре.Он также устанавливает PictureBox размер Bitmap размер:

    public partial class Form1 : Form
    {
        Bitmap b = new Bitmap(320, 200);
        public Form1()
        {
            InitializeComponent();
            CenterTheBox();
        }

        private void Form1_Resize(object sender, EventArgs e)
        {
            CenterTheBox();
        }

        void CenterTheBox()
        {
            pictureBox1.Size = b.Size;
            var left = (tabPage1.ClientRectangle.Width - pictureBox1.ClientRectangle.Width) / 2;
            var top = (tabPage1.ClientRectangle.Height - pictureBox1.ClientRectangle.Height) / 2;
            pictureBox1.Location = new Point(tabPage1.ClientRectangle.Location.X + left, tabPage1.ClientRectangle.Location.Y + top);

        }
    }
...