private void OnContextMenuOpening(object sender, ContextMenuEventArgs e)
        {
            // If the shift key is down, the the user is dropping the end selection
            // marker, so in this case we won't show the context menu.
            if ((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift)
            {
                e.Handled = true;
                return;
            }

            // Create a new context menu metadata to be filled by the hit tester
            this.contextMenuSources = new Dictionary <ContextMenuItemsSourceType, IContextMenuItemsSource>();

            // Run a hit test at the mouse cursor
            VisualTreeHelper.HitTest(
                this,
                null,
                new HitTestResultCallback(this.ContextMenuHitTestResult),
                new PointHitTestParameters(Mouse.GetPosition(this)));

            // If a visualization panel was found, set it as the current visualization panel.
            if (this.contextMenuSources.ContainsKey(ContextMenuItemsSourceType.VisualizationPanel))
            {
                VisualizationPanel visualizationPanel = (this.contextMenuSources[ContextMenuItemsSourceType.VisualizationPanel] as VisualizationPanelView).DataContext as VisualizationPanel;
                visualizationPanel.IsTreeNodeSelected = true;
            }

            // Clear the existing context menu
            this.ContextMenu.Items.Clear();

            if (this.contextMenuSources.ContainsKey(ContextMenuItemsSourceType.VisualizationPanel))
            {
                // Find all of the visualization object views that are children of the panel view.
                VisualizationPanelView panelView = this.contextMenuSources[ContextMenuItemsSourceType.VisualizationPanel] as VisualizationPanelView;
                IEnumerable <VisualizationObjectView> visualizationObjectViews = panelView.FindVisualChildren <VisualizationObjectView>();
                IEnumerator <VisualizationObjectView> viewEnumerator           = visualizationObjectViews.GetEnumerator();

                // If there's only a single visualization object view then insert its context menu items
                // inline, otherwise generate a separate cascading menu for each visualization object view.
                if (visualizationObjectViews.Count() == 1)
                {
                    viewEnumerator.MoveNext();
                    this.AddContextMenuItems(viewEnumerator.Current, false);
                }
                else
                {
                    while (viewEnumerator.MoveNext())
                    {
                        this.AddContextMenuItems(viewEnumerator.Current, true);
                    }
                }
            }

            // Add the context menu items for the visualization panel, instant panel, and visualization conatiner.
            foreach (IContextMenuItemsSource panelViewSource in this.contextMenuSources.Values)
            {
                this.AddContextMenuItems(panelViewSource, false);
            }
        }
        private HitTestFilterBehavior HitTestFilter(DependencyObject dependencyObject)
        {
            if (dependencyObject is VisualizationPanelView)
            {
                this.hitTestResult = dependencyObject as VisualizationPanelView;
                return(HitTestFilterBehavior.Stop);
            }

            return(HitTestFilterBehavior.Continue);
        }
Beispiel #3
0
        private HitTestFilterBehavior HitTestFilter(DependencyObject dependencyObject)
        {
            if (dependencyObject is VisualizationPanelView visualizationPanelView &&
                (visualizationPanelView.DataContext as VisualizationPanel).IsShown)
            {
                this.hitTestResult = visualizationPanelView;
                return(HitTestFilterBehavior.Stop);
            }

            return(HitTestFilterBehavior.Continue);
        }
        private VisualizationPanel GetVisualizationPanelUnderMouse(Point mousePosition)
        {
            // Find out if the mouse is above an existing Visualization Panel
            this.hitTestResult = null;
            VisualTreeHelper.HitTest(
                this.Items,
                new HitTestFilterCallback(this.HitTestFilter),
                new HitTestResultCallback(this.HitTestResultCallback),
                new PointHitTestParameters(mousePosition));

            // Get the visualization panel that the stream was dropped over (if any)
            return(this.hitTestResult != null ? this.hitTestResult.DataContext as VisualizationPanel : null);
        }