динамическая обработка событий для изображения - PullRequest
0 голосов
/ 20 февраля 2011

В настоящее время я работаю над программой, в которой к окну динамически добавлено несколько «значков».Каждый из этих «значков» (который на самом деле представляет собой изображение с меткой под ним) представляет устройство в сети.Когда пользователь дважды щелкает значок, ему нужно открыть окно, в котором пользователь может изменить свойства этого конкретного устройства.

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

Вот часть кода, которая запускается, когда пользователь добавляет новое устройство вместе с используемым им обработчиком событий:

//create new device
devices.Add(new Device(ipaddress, hn, un, pw, cm, lx, ly, tp, pl, nt, dn));
images.Add(new Image());
    //create image for main window
images[images.Count - 1].Width = 50;
images[images.Count - 1].Height = 35;
images[images.Count - 1].Stretch = Stretch.Fill;
BitmapImage logo = new BitmapImage();
logo.BeginInit();
logo.UriSource = new Uri(deviceImages[tp], UriKind.Relative);
logo.CacheOption = BitmapCacheOption.OnLoad;
logo.EndInit();
images[images.Count - 1].Source = logo;
images[images.Count - 1].Cursor = Cursors.Hand;
images[images.Count - 1].Margin = new System.Windows.Thickness(lx-25, ly-25, 0, 0);
images[images.Count - 1].VerticalAlignment = System.Windows.VerticalAlignment.Top;
images[images.Count - 1].HorizontalAlignment = System.Windows.HorizontalAlignment.Left;
images[images.Count - 1].MouseDown += new MouseButtonEventHandler(deviceIcon_MouseDown);
ConnexMainWindow.grid1.Children.Add(images[images.Count - 1]);

public void deviceIcon_MouseDown(object sender, MouseButtonEventArgs e)
{
    ConnexDeviceWindow deviceWindow = new ConnexDeviceWindow();
    deviceWindow.Show();
}

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

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

1 Ответ

2 голосов
/ 20 февраля 2011

Одной из распространенных стратегий определения элемента управления, вызвавшего событие, является использование свойства Tag элемента управления для хранения некоторой информации.

Я не знаю, как выглядит ваша device модель, но давайте предположим, что IP-адрес уникален среди всех устройств.Вы можете прикрепить это к элементу управления Image:

images[images.Count - 1].Tag = ipaddress

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

public void deviceIcon_MouseDown(object sender, MouseButtonEventArgs e)
{
    Image image = e.Source as Image;
    if (image != null)
    {
        string ipAddress = (string)image.Tag;
        Device device = devices.FirstOrDefault(d => d.IpAddress == ipAddress);
        if (device != null)
        {
            ConnexDeviceWindow deviceWindow = new ConnexDeviceWindow(device);
            deviceWindow.Show();
        }         
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...