这绝对是可行的。我做过类似的事情,效果很好。以下示例将显示与所选图像相关的信息。您可以根据需要进行修改,以便在悬停、单击甚至缩放时显示信息。完全由您决定。
首先,在您的画布上添加一个MultiScaleImage...
<MultiScaleImage x:Name="deepZoomObject" Source="/GeneratedImages/dzc_output.xml" />
在画布的其他位置,添加一个TextBlock用于显示信息:
<TextBlock X:Name="tbInfo" />
接下来,创建一个类来保存每个“瓷砖”的信息,添加一些虚拟信息,并将一堆瓷砖添加到列表中:
public class TileDetail {
public int Index { get; set; }
public string TileName { get; set; }
}
List<TileDetail> TileDetailsList = new List<TileDetail>();
TitleDetail td1 = new TileDetail();
td1.Index = 0;
td1.TileName = "Tile #1";
TileDetailsList.Add(td1);
TitleDetail td21 = new TileDetail();
td2.Index = 1;
td2.TileName = "Tile #2";
TileDetailsList.Add(td2);
现在列表已经充满了瓷砖信息,我们需要连接MouseLeftButtonDown事件处理程序以检测图像何时被点击,并最终确定所点击图像的索引。有了索引,我们只需要搜索我们的列表以获取适当的瓷砖详细信息,然后在画布上显示。
在您的代码后台中,请添加以下内容:
deepZoomObject.MouseLeftButtonDown += delegate(object sender, MouseButtonEventArgs e)
;
以下是“秘密武器”,它将找到所点击图片的索引。
private int GetIndexOfSubImage(Point point)
{
for (int i = deepZoomObject.SubImages.Count - 1; i >= 0; i--)
{
MultiScaleSubImage image = deepZoomObject.SubImages[i];
double width = deepZoomObject.ActualWidth / (deepZoomObject.ViewportWidth * image.ViewportWidth);
double height = deepZoomObject.ActualWidth / (deepZoomObject.ViewportWidth * image.ViewportWidth * image.AspectRatio);
Point pos = deepZoomObject.LogicalToElementPoint(new Point(image.ViewportOrigin.X / image.ViewportWidth, -image.ViewportOrigin.Y / image.ViewportWidth));
Rect rect = new Rect(pos.X, pos.Y, width, height);
if (rect.Contains(point))
{
return i;
}
}
return -1;
}
就是这样。只要您的图像索引在列表中有相应的图像,那么在MultiScaleImage对象内单击图像将显示图像信息。