/// <summary> /// Invoked when an unhandled MouseUp routed event reaches an element in its route that is derived from this class. Implement this method to add class handling for this event. /// </summary> /// <param name="e">The <see cref="T:System.Windows.Input.MouseButtonEventArgs" /> that contains the event data. The event data reports that the mouse button was released.</param> protected override void OnMouseUp(MouseButtonEventArgs e) { base.OnMouseUp(e); if (e.Handled) { return; } this.ReleaseMouseCapture(); e.Handled = this.ActualController.HandleMouseUp(this, e.ToMouseReleasedEventArgs(this)); // Open the context menu var p = e.GetPosition(this).ToScreenPoint(); double d = p.DistanceTo(this.mouseDownPoint); if (this.ContextMenu != null) { if (Math.Abs(d) < 1e-8 && e.ChangedButton == MouseButton.Right) { // TODO: why is the data context not passed to the context menu?? this.ContextMenu.DataContext = this.DataContext; this.ContextMenu.Visibility = Visibility.Visible; this.ContextMenu.IsOpen = true; } else { this.ContextMenu.Visibility = Visibility.Collapsed; this.ContextMenu.IsOpen = false; } } }