2015-03-14 2 views
0

У меня есть код для отображения нескольких изображений в панелиМестоположение свойства PictureBox в C#

public List<Image> images = new List<Image>(); 
    public List<PictureBox> pictures = new List<PictureBox>(); 
    public int top=10; 
    public int ItemCount = 0; 
    private void tsbOpen_Click(object sender, EventArgs e) 
    { 
     OpenFileDialog file = new OpenFileDialog(); 
     file.Filter="Image files (*.jpg, *.jpeg, *.jpe, *.jfif, *.png) | *.jpg; *.jpeg; *.jpe; *.jfif; *.png"; 
     if (file.ShowDialog() == DialogResult.OK) 
     { 
      images.Add(Image.FromFile(file.FileName)); 

      pictures.Add(new PictureBox()); 
      pictures[ItemCount].Image = images[ItemCount]; 
      pictures[ItemCount].Width = images[ItemCount].Width; 
      pictures[ItemCount].Height = images[ItemCount].Height; 
      pnlMain.Controls.Add(pictures[ItemCount]); 
      pnlMain.Controls[ItemCount].Location=new Point(0,top); 


      top += (images[ItemCount].Size.Height+10); 
      ItemCount++; 
     } 
    } 

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

+0

Как вы хотите разместить ПБ? Все в одной строке или в нескольких рядах? – TaW

+0

Проверка снова, я думаю, что ваш код работает просто отлично! Что вы подразумеваете под «расстоянием .. становится неузнаваемым». ?? Изменяется ли это с помощью изображений, которые вы выбрали? – TaW

+0

Только один маленький тонкий, который вы, возможно, захотите улучшить: если у вас PB есть граница, вы должны установить свой клиенс, а не внешние границы: 'pictures [ItemCount] .ClientSize = images [ItemCount] .Size;' - Ну и из контекста это FlowLayoutPanel, который будет выполнять все макеты! – TaW

ответ

1

попробовать что-то вроде этого:

int space = 10; 

if (ItemCount > 0) pnlMain.Controls[ItemCount].Location = 
    new Point(0, pnlMain.Controls[ItemCount - 1].Bottom + space); 
else pnlMain.Controls[ItemCount].Location = new Point(0, space); 

Как правило, вы должны знать

  • что является SizeMode из PictureBoxes?
  • у них есть BorderStyle кроме None?

Но здесь ошибка в коде утончённее: Location должен быть установлен по отношению к месту, где выше PictureBox находится. Код с переменной top работает, но только до тех пор, пока Panel не прокручивается. Непосредственно привязывая его к последнему размещенному изображению, он будет работать, даже если вы прокрутили вниз. Надеюсь, что ...

В приведенном выше коде указан следующий код относительно Bottom предыдущего с интервалом в 10 пикселей.

+0

Спасибо! Я решил проблему. – HuynhAT