/// <summary> /// When Metadata.xml is downloaded, let's parse it and create a list of ImageMetadata objects. ZOrder can be used to uniquely identify an image. So let's use it as the key of our dictionary for faster searching. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void webClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) { XDocument doc = XDocument.Parse(e.Result); this._imageMetadatas = new Dictionary <int, ImageMetadata>(); this._conversations = new Dictionary <int, ConversationControl>(); var imageElements = doc.Root.Elements("Image"); foreach (XElement imageElement in imageElements) { int zOrder = int.Parse(imageElement.Element("ZOrder").Value); ImageMetadata metadata = new ImageMetadata() { FileName = imageElement.Element("FileName").Value, X = double.Parse(imageElement.Element("x").Value), Y = double.Parse(imageElement.Element("y").Value), Width = double.Parse(imageElement.Element("Width").Value), Height = double.Parse(imageElement.Element("Height").Value), ZOrder = zOrder, Tag = imageElement.Element("Tag").Value }; this._imageMetadatas.Add(zOrder, metadata); ConversationControl conversationControl = new ConversationControl() { ConversationText = metadata.Tag, Visibility = Visibility.Collapsed }; this.LayoutRoot.Children.Add(conversationControl); this._conversations.Add(zOrder, conversationControl); } }
/// <summary> /// Display the tag for a sub image that hit tested. /// </summary> private void HitTestImage() { for (int i = 0; i < this.msi.SubImages.Count; i++) { MultiScaleSubImage subImage = this.msi.SubImages[i]; if (HitTest(subImage)) { //ZOrder starts from 1 rather than 0. ImageMetadata metadata = this._imageMetadatas[i + 1]; ConversationControl conversationControl = this._conversations[i + 1]; Point topLeft = this.msi.LogicalToElementPoint(new Point(-subImage.ViewportOrigin.X / subImage.ViewportWidth, -subImage.ViewportOrigin.Y / subImage.ViewportWidth + 1 / subImage.ViewportWidth / subImage.AspectRatio)); conversationControl.translate.X = topLeft.X; conversationControl.translate.Y = topLeft.Y; conversationControl.Visibility = Visibility.Visible; } else { ConversationControl conversationControl = this._conversations[i + 1]; conversationControl.Visibility = Visibility.Collapsed; } } }