2011-01-31 10 views
1

WPFチャートに現在エリアシリーズが表示されています。私は、ユーザーがチャートをクリックし、ラインシリーズの新しいポイントを追加できるようにする必要があります。私が抱えている問題は、ポイントをMouseButtonEventArgsからLineDataPointに変換する方法が見つからないようです。グラフをクリックしてwpfチャートにラインシリーズを作成できるようにする

private void chtPowerFlowMap_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     Point p = e.GetPosition(chtPowerFlowMap); 

     points.Add(p); //Issue here is this will return a point in screen coordinates and not in chart coordinates 

     ls.ItemsSource = points; //ls is an existing lineseries and points is a List<Point> object 

     chtPowerFlowMap.Series.Add(ls); 
    } 

ありがとうございます。

+0

X軸として日付を使用する場合には、さらに複雑becames。実際の幅、実際の高さ、データx範囲、データy範囲、および点の座標に関する情報が必要です。私は時間がある場合、私は同様のものを実装しようとします。 – vorrtex

答えて

1

これは完全な解決策です。チャートの任意の場所をクリックすると、その場所に新しいポイントが表示されます。

MainWindows.xaml

<chart:Chart x:Name="chart" MouseLeftButtonDown="Chart_MouseLeftButtonDown"> 
     <chart:LineSeries ItemsSource="{Binding}" x:Name="lineSeries" 
          DependentValuePath="Value" 
          IndependentValuePath="Date"/> 
</chart:Chart> 

MainWindow.xaml.cs

public partial class MainWindow : Window 
{ 
    private ObservableCollection<Item> items; 

    public MainWindow() 
    { 
     InitializeComponent(); 
     Random rd = new Random(); 

     items = new ObservableCollection<Item>(
       Enumerable.Range(0, 10) 
       .Select(i => new Item 
       { 
        Date = DateTime.Now.AddMonths(i - 10), 
        Value = rd.Next(10,50) 
       })); 
     this.DataContext = items; 
    } 

    public class Item 
    { 
     public DateTime Date { get; set; } 
     public double Value { get; set; } 
    } 

    private void Chart_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     var p = Mouse.GetPosition(this.lineSeries); 
     //ranges in the real values 
     var left = items.Min(i => i.Date); 
     var right = items.Max(i => i.Date); 
     var top = items.Max(i => i.Value); 
     var bottom = items.Min(i => i.Value); 

     var hRange = right - left; 
     var vRange = top - bottom; 

     //ranges in the pixels 
     var width = this.lineSeries.ActualWidth; 
     var height = this.lineSeries.ActualHeight; 

     //from the pixels to the real value 
     var currentX = left + TimeSpan.FromTicks((long)(hRange.Ticks * p.X/width)); 
     var currentY = top - vRange * p.Y/height; 

     this.items.Add(new Item { Date = currentX, Value = currentY }); 
    } 
} 
+0

クール...完璧に働いた。チャートツールキットがマウスポイントを軸セットに基づいてチャート値に変換する機能を持っていればうれしいです。再度、感謝します。 – Chris

+0

ちょうど不思議なことに、シリーズと関連してポイントを得ているのはなぜですか?チャートではありません。 – Chris

+0

@Chris wpfチャートはシリーズと軸の組み合わせなので、座標の原点から軸の実際の始点から測定しました。正義のために、私は最初は全体のチャートで作業しようとしましたが、打ち上げとテストの後、コントロールを変更しました。この例では、シリーズ外のクリックに反応しますが、左と下の値をシリーズの境界と比較することで修正できます。 – vorrtex

関連する問題