2014-01-21 36 views
0

的工具提示已經產生使用由詹姆斯麥卡弗裏提供的教程的曲線圖:http://msdn.microsoft.com/en-us/magazine/ff714591.aspx我如何顯示該點的座標在D3圖表

蔭能夠如此成功地做到。此外,我已經添加了一個提示如下:

plotter.AddLineGraph(compositeDataSource1, 
new Pen(Brushes.Blue, 2), 
new CircleElementPointMarker{ Size = 10.0, Fill = Brushes.Red ,Tooltip="Coordinates"}, 
new PenDescription("Number bugs open")); 

我的問題是:我怎麼顯示座標在提示點的

+0

你問的是提示了'CircleElementPointMarker'或行?如果你問的是這條線,我可以說我已經找了一段時間了;我認爲它不支持當前(非常舊)的版本。有Silverlight的更新版本可能會這樣做,我還沒有探索那麼多。 – klugerama

+0

雅我問的是CircleElementPointMarker。 – Surjeet

回答

1

這就是我如何解決我的問題。

EnumerableDataSource<TPoint> edc; 
edc= new EnumerableDataSource<TPoint>(List_Of_TPoint); 
      edc.SetXMapping(x => dateAxis.ConvertToDouble(x.X)); 
      edc.SetYMapping(y => Convert.ToDouble(y.Y)); 
      edc.AddMapping(CircleElementPointMarker.ToolTipTextProperty, s => String.Format("Y-Data : {0}\nX-Data : {1}", s.Y, s.X)); 

我剛剛在創建EnumerableDataSource時添加了上面的映射。 然後將edc添加到繪圖儀。

plotter.AddLineGraph(
          edc, 
          new Pen(Brushes.Transparent, 3), 
          new CircleElementPointMarker 
          { 
           Size = 15, 
           Brush = border, 
           Fill = c2 
          }, 
          null 
          ); 
0

使用ElementMarkerPointsGraph和CircleElementPointMarker可能非常耗費資源。對於每個點,將創建一個橢圓。此外,即使沒有人想看到工具提示,也會爲每個點執行Mapping(爲Tooltip構建字符串)。

所以我的方式是使用MarkerPointsGraph並將其設置爲動態提示。

的XAML:

<d3:MarkerPointsGraph Name="MyMarkerPointsGraph" DataSource="{Binding Values}" ToolTip="Dummy" ToolTipOpening="CircleMarker_OnToolTipOpening"> 
    <d3:MarkerPointsGraph.Marker> 
    <d3:CirclePointMarker /> 
    </d3:MarkerPointsGraph.Marker> 
</d3:MarkerPointsGraph> 

這裏背後的代碼:

private void CircleMarker_OnToolTipOpening(object sender, ToolTipEventArgs e) 
{ 
    var pos = Mouse.GetPosition(MyMarkerPointsGraph); 
    var transform = GetTransform(MyMarkerPointsGraph); 
    transform.ScreenToData(pos); 
    var dataPoint = transform.ScreenToData(pos); 

    MyMarkerPointsGraph.ToolTip = $"Y-Data : {dataPoint.Y}\nX-Data : {dataPoint.X}"; 
} 

public static CoordinateTransform GetTransform(PointsGraphBase graph) 
{ 
    if (!(graph.Plotter is Plotter2D)) 
     return null; 
    var transform = ((Plotter2D)graph.Plotter).Viewport.Transform; 
    if (graph.DataTransform != null) 
     transform = transform.WithDataTransform(graph.DataTransform); 

    return transform; 
}