ni.com is currently undergoing scheduled maintenance.

Some services may be unavailable at this time. Please contact us for help or try again later.

Measurement Studio for .NET Languages

cancel
Showing results for 
Search instead for 
Did you mean: 

wpf graph getChildrenAtPoint

Solved!
Go to solution

I have a  wpf on which I add Point Annotations and Range Annotation programmatically, when the user clicks the the buttons "Take Point Annotation" and "Take Range Annoation". I would like to select an annotation when the user clicks on it an make him able to modify or delete. I used getChildrenAtPoint method of the graph but the collection that this method returns is always empty... 

 

My graph definition is: 

<ni:Graph Name="graph" HitTestMode="RenderedInterpolation" PlotAreaMouseLeftButtonUp="graph_PlotAreaMouseLeftButtonUp">
            <ni:Graph.Axes>
                <ni:AxisDouble x:Name="xAxis" Range="0,10" Orientation="Horizontal"></ni:AxisDouble>
                <ni:AxisDouble x:Name="yAxis" Range="0,20" Orientation="Vertical"></ni:AxisDouble>
            </ni:Graph.Axes>
            <ni:Graph.Children>
                <ni:Cursor Name="simpleCursor">
                    <ni:Cursor.ValuePresenter>
                        <nic:ValueFormatterGroup>
                            <nic:ValueFormatterGroup.DefaultFormatter>
                                <nic:GeneralValueFormatter x:Name="valueFormatter" Format="0.00"></nic:GeneralValueFormatter>                               
                            </nic:ValueFormatterGroup.DefaultFormatter>
                        </nic:ValueFormatterGroup>                     
                    </ni:Cursor.ValuePresenter>
                </ni:Cursor>
                <ni:MultiPlotCursor Name="mpCursor" Visibility="Hidden"></ni:MultiPlotCursor>
                <ni:RangeCursor Name="rangeCursor" HorizontalRange="4,6" VerticalRange="4,6" Visibility="Hidden"></ni:RangeCursor>
            </ni:Graph.Children>
        </ni:Graph>          

 

and the the addAnnotation method is:

private void TakeRangeAnnotation_Executed(object sender, ExecutedRoutedEventArgs e)
        {
            WindowAnnotation dialog = new WindowAnnotation();
            if (dialog.ShowDialog() == true)
            {
                NationalInstruments.Controls.RangeAnnotation ann = new NationalInstruments.Controls.RangeAnnotation();
                ann.HorizontalRange = rangeCursor.ActualHorizontalRange;
                ann.VerticalRange = rangeCursor.ActualVerticalRange;
                ann.Label = dialog.Annotation;
                ann.HorizontalAxis = xAxis;
                ann.VerticalAxis = yAxis;
                graph.Children.Add(ann);
            }
        }

 

I call the getChlidrenAtPoint method on the PlotAreaMouseLeftButtonUp event:

private void graph_PlotAreaMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            Point mousePos = e.GetPosition(graph);
            Point screenPos = graph.GetPlotAreaPosition(e);
            IEnumerable<object> children1 = graph.GetChildrenAtPoint(mousePos);
            IEnumerable<object> children2 = graph.GetChildrenAtPoint(screenPos);

 I tried both mouse position and PlotAreaPosition but the two collections are always empty, also if I click on a Range Annotation 

 

0 Kudos
Message 1 of 4
(6,201 Views)
Solution
Accepted by ga@bimal

I was able to reproduce the issue you were seeing, and confirmed there is a bug in our code that prevents annotations from appearing in hit test results. We have created a work item to fix this issue.


To workaround this, here is an example of how you can perform manual hit testing for a RangeAnnotation in a graph configured with double horizontal and vertical axes:


    double[] dataValue = graph.ScreenToData(plot, screenPos).Cast<double>().ToArray();

    foreach( var rangeAnnotation in graph.Children.OfType<RangeAnnotation>() ) {
        var horizontalRange = (Range<double>)rangeAnnotation.HorizontalRange;
        var verticalRange = (Range<double>)rangeAnnotation.VerticalRange;

        if( horizontalRange.Contains(dataValue[0])
             && verticalRange.Contains(dataValue[1]) ) {
            // matching range annotation found
        }
    }

~ Paul H
Message 2 of 4
(6,182 Views)

Problem Solved? If so, please set Phansen answer as the correct one.

 

Thanks.

 

Mattia

0 Kudos
Message 3 of 4
(6,128 Views)

Just wanted to let you know this issue (#374462) was fixed in the Measurement Studio 2013 release.

~ Paul H
0 Kudos
Message 4 of 4
(5,913 Views)