2015-12-14 4 views
1

У меня есть N Число динамически добавленных PictureBoxes в FlowLayoutPanel. Когда я их создаю, я присоединяю к ним обработчики событий. Например:Провести одновременное событие для нескольких динамических элементов управления в C# winform

for(int i=0;i<x;i++) {  
    var pe= new PictureBox(); 
    pe.MouseUp+=mouseup; 
    pe.MouseDown+=mouseDown; 
    pe.MouseMove+=mouseMove; 
    pe.Paint+=paint; 
} 

Моя цель - запустить эти события для всех ящиков с картинками всякий раз, когда я работаю с любым из них. Например, если я переместил один (1st/2nd/3rd /.../ n), все остальные будут перемещаться автоматически, если я масштабирую любую рамку, другие будут автоматически масштабироваться. Как я могу запускать события одновременно для всех графических ящиков при работе с кем-либо.

Если я стараюсь, например:

void mouseWheel(object sender, MouseEventArgs e) { 
    var control=(PictureBox)sender; 
    var parent=control.parent; 
    var pictureBoxes=parent.ofType<PictureBox>(); 

    foreach(pb in pictureBoxes) { 
       //do something 
    } 
} 

Он работает только для окна изображения я работаю с.

+1

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

ответ

1

Вам нужно вызвать метод вместо того, чтобы поднимать событие.

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

Например:

void pictureBox_MouseWheel(object sender, MouseEventArgs e) 
{ 
    //Some parameter that you extract from eventArgs or somewhere else 
    int zoomFactor = e.Delta; 

    //Call the method on your picture boxes 
    foreach (var p in pictureBoxes) 
    { 
     Zoom(p, zoomFactor); 
    } 
} 

//The method that contains logic of zoom on a picture box 
public void Zoom(PictureBox p, int zoomFactor) 
{ 
    //It is just an example, not a real logic 
    p.SizeMode = PictureBoxSizeMode.Zoom; 
    p.Width += (zoomFactor * 10); 
    p.Height += (zoomFactor * 10); 
} 

Я должен, как вы добавили все PictureBoxes в List<PictureBox>, когда вы их создали.

Кроме того, если вы добавили свои изображения коробки к Controls коллекции контроля, например theControl, то вы можете найти их позже так:

var pictureBoxes = theControl.Controls.OfType<PictureBox>().ToList(); 
+0

Благодарим вас за отзыв, кстати, когда вы [принимаете ответ] (http://meta.stackexchange.com/a/5235/308647), вы также можете проголосовать за него, нажав на стрелку вверх. Это не обязательно, но разумно, рекомендуется и ваша доброта. Кроме того, хотя вы можете принять только один ответ, но вы можете проголосовать за столько ответов, сколько найдете, в том числе принятое: –

0

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

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