public AnnotationTag(AnnotatedEventVisualizationObjectView parent, Message <AnnotatedEvent> message, Rect rect)
            {
                this.parent  = parent;
                this.vizObj  = this.parent.AnnotatedEventVisualizationObject;
                this.message = message;

                this.transformGroup = new TransformGroup();
                this.scaleTransform = parent.scaleTransform;
                this.transformGroup.Children.Add(parent.translateTransform);
                this.transformGroup.Children.Add(parent.scaleTransform);

                // Currently, only support one annotation
                var annotation  = message.Data.Annotations[0];
                var schemaValue = this.vizObj.Definition.Schemas[0].Values.FirstOrDefault(v => object.Equals(v.Value, annotation));

                if (schemaValue == null)
                {
                    schemaValue = this.vizObj.Definition.Schemas[0].Values.FirstOrDefault(v => object.Equals(v.Value, null)) ?? this.vizObj.Definition.Schemas[0].Values.FirstOrDefault();
                }

                this.rectangleGeometry = new RectangleGeometry(rect)
                {
                    Transform = this.transformGroup
                };
                this.rectanglePath = new Path()
                {
                    Data            = this.rectangleGeometry,
                    DataContext     = this,
                    ContextMenu     = parent.Resources["AnnotationContextMenu"] as ContextMenu,
                    Fill            = (schemaValue != null) ? schemaValue.Color.ToMediaBrush() : System.Drawing.Color.Black.ToMediaBrush(),
                    Stroke          = Brushes.Black,
                    StrokeThickness = 1,
                    Tag             = annotation
                };

                this.textBlock = new TextBlock()
                {
                    Background       = null,
                    IsHitTestVisible = false,
                    Name             = "Value",
                    Padding          = new Thickness(5),
                    Text             = annotation,
                    TextAlignment    = TextAlignment.Center,
                    TextWrapping     = TextWrapping.Wrap
                };

                // create context menu items
                this.internalContextMenuItems = new ObservableCollection <object>(this.vizObj.Definition.Schemas);
                this.contextMenuItems         = new ReadOnlyObservableCollection <object>(this.internalContextMenuItems);
                this.rectanglePath.ContextMenu.ItemsSource = this.contextMenuItems;

                // add in separators (nulls) and commands (tuple<string, ICommand, object>)
                this.internalContextMenuItems.Add(null);
                this.internalContextMenuItems.Add(Tuple.Create <string, ICommand, object>("Set value...", parent.AnnotatedEventVisualizationObject.SetValueCommand, this.Message.Data));
                this.internalContextMenuItems.Add(null);
                this.internalContextMenuItems.Add(Tuple.Create <string, ICommand, object>("Delete", parent.AnnotatedEventVisualizationObject.DeleteEventCommand, this.Message));
                this.internalContextMenuItems.Add(null);
                this.internalContextMenuItems.Add(Tuple.Create <string, ICommand, object>("Save Annotations", parent.AnnotatedEventVisualizationObject.SaveAnnotationsCommand, null));
            }
        private void AnnotatedEventVisualizationObjectView_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
            this.AnnotatedEventVisualizationObject = this.DataContext as AnnotatedEventVisualizationObject;
            this.AnnotatedEventVisualizationObject.PropertyChanged += this.AnnotatedEventVisualizationObject_PropertyChanged;
            this.AnnotatedEventVisualizationObject.Configuration.PropertyChanged += this.Configuration_PropertyChanged;

            this.navigator = this.AnnotatedEventVisualizationObject.Navigator;
            this.navigator.ViewRange.RangeChanged += this.Navigator_ViewRangeChanged;

            this.Data_CollectionChanged(this.AnnotatedEventVisualizationObject.Data, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
            if (this.AnnotatedEventVisualizationObject.Data != null)
            {
                this.AnnotatedEventVisualizationObject.Data.CollectionChanged += this.Data_CollectionChanged;
            }
        }