动态处理图像的事件

时间:2011-02-20 20:03:45

标签: c# wpf events

我目前正在开发一个程序,其中有多个“图标”动态添加到窗口中。这些“图标”中的每一个(实际上是在其下面具有标签的图像)表示网络中的设备。当用户双击某个图标时,需要打开一个窗口,用户可以在该窗口中更改该特定设备的属性。

我已经创建了窗口,以及动态添加图像到窗口的代码。我的问题是,由于每个图标都是动态添加的,因此它们使用相同的事件处理程序。由于每个图标使用相同的处理程序,因此似乎不可能让每个图标打开其各自的设备。

以下是用户添加新设备及其使用的事件处理程序时运行的代码的一部分:

//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 个答案:

答案 0 :(得分:2)

识别触发事件的控件的一种常见策略是使用控件的Tag属性来存储某些信息。

我不知道你的device模型是什么样的,但我们假设ip-address在所有设备中都是唯一的。您可以将其附加到图像控件:

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();
        }         
    }
}