Как связать кнопку с элементом управления? - PullRequest
1 голос
/ 15 октября 2010

ИЛИ - Как побрить коалу, чтобы она не выглядела раздавленной(Но я не думал, что это даст подходящее название)

Проблема: у вас есть три изображения для предварительного просмотра, полученные из основного изображения.Размер предварительных изображений изменен для стандартных пространств изображений на веб-сайте компании. Основное изображение может быть изображением любого размера из любого места.

Пример. Основное изображение - это изображение медведя коалы в высоком разрешении размером 2000x2250.Ваши предварительные просмотры хотят визуализировать коалу с размерами 200x200, 200x50 и 250x150.

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

Чтобы решить эту проблему, вы добавляете в свою программу небольшой метод обрезки, который сокращает пять пикселей от предварительного просмотра на желаемой стороне.Это означает, что вы должны иметь возможность изменить размер изображения и расшатать свою коалу, сбрив ненужные части изображения.

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

Как сообщить универсальной функции, какое из трех изображений предварительного просмотра изображения выхотите, чтобы он брился изящным и чудесным способом?

Пример кода:

//cropPict=method for cropping the picture in the relevant picturebox.
//CropSide=a little enum which tells the method which side to crop.
private void btnT_Click(object sender, EventArgs e)
{
  cropPict(/*Reference to PictureBox Goes Here*/, CropSide.Top);
}

private void btnB_Click(object sender, EventArgs e)
{

   cropPict(/*Reference to PictureBox Goes Here*/, CropSide.Bottom);
}

private void btnR_Click(object sender, EventArgs e)
{
   cropPict(/*Reference to PictureBox Goes Here*/, CropSide.Right);
}

private void btnL_Click(object sender, EventArgs e)
{
   cropPict(/*Reference to PictureBox Goes Here*/, CropSide.Left);
}

РЕДАКТИРОВАТЬ: как это происходит, вдохновленный Гансом ниже, а не просто вставить PictureBox в тег.Это была отличная идея, я фактически поместил KeyValuePair в тег для каждой кнопки следующим образом:

btnCCB.Tag = new KeyValuePair<CropSide,PictureBox>(CropSide.Bottom,pbxKoala);
btnCCL.Tag = new KeyValuePair<CropSide, PictureBox>(CropSide.Left, pbxKoala);
btnCCR.Tag = new KeyValuePair<CropSide, PictureBox>(CropSide.Right, pbxKoala);
btnCCT.Tag = new KeyValuePair<CropSide, PictureBox>(CropSide.Top, pbxKoala);

Тогда я мог бы просто подключить все кнопок до одного событияобработчик примерно так:

private void btnC_Click(object sender, EventArgs e)
{
   Button btnSend = (Button)sender;
   KeyValuePair<CropSide, PictureBox> kvCrop = (KeyValuePair<CropSide, PictureBox>)btnSend.Tag;

   cropPict(kvCrop.Value,kvCrop.Key);
}

Конечно, еще многое предстоит сделать, но это в значительной степени решило мою проблему.Спасибо, Ганс!

1 Ответ

3 голосов
/ 15 октября 2010

Используйте свойство Button.Tag для хранения ссылки на связанный с ним PictureBox.Приведение отправитель к кнопке:

public Form1() 
{
  InitializeComponent();
  button1.Tag = pictureBox1;
  button1.Click += btnT_Click;
  // etc..
}

private void btnT_Click(object sender, EventArgs e)
{
  var btn = (Button)sender;
  cropPict((PictureBox)btn.Tag, CropSide.Top);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...