FlexChart for WPF
ヒットテスト
FlexChart > FlexChart の操作 > エンドユーザー操作 > ヒットテスト

FlexChart は、ヒットテストをサポートし、実行時にコントロールの特定のポイントの情報を取得できます。ポイントされた座標に関する情報を再利用して、チャートデータをドリルダウンしたり、アラートを設定するなどのユーザー操作機能を実装できます。

Hit testing in FlexChart


FlexChart は、HitTest() メソッドを使用したヒットテストをサポートします。このメソッドは、指示されたエンティティの位置(座標)を取得します。そして、ポインタ位置に関する次の情報を提供する HitTestInfo クラスのオブジェクトを返します。

HitTest() メソッドに渡されるマウス座標はピクセル単位で、フォームの左上隅を基準とします。 

この例では、FlexChart コントロールの MouseMove イベントで HitTest() メソッドが呼び出されます。ここで、ポインタ位置のポイント座標がパラメータとして HitTest() メソッドに渡されます。

FlexChart でヒットテストを有効にするには、次の手順に従います。

  1. データ連結 FlexChart コントロールの追加
  2. マウスイベントのサブスクライブ
  3. マウスイベントハンドラでのチャートの HitTest メソッドの呼び出し
  4. HitTestInfo オブジェクトから返された情報の使用

先頭に戻る

  1. データ連結 FlexChart コントロールの追加

    以下のコードスニペットに示すように、WPFアプリケーションに FlexChart コントロールのインスタンスを追加し、適切なデータソースに連結します。

    <c1:C1FlexChart x:Name="flexChart" 
                            Binding="YVals"                                   
                BindingX="XVals"                                 
                ChartType="SplineSymbols"                                
                Margin="10,10,0,52"                               
                HorizontalAlignment="Left"                                 
                Grid.RowSpan="2"
                            Width="490">
                            <c1:Series x:Name="series0" SeriesName="系列 0"/>
                                    <c1:Series x:Name="series1" SeriesName="系列 1" />
                            </c1:C1FlexChart>
    

    先頭に戻る

  2. マウスイベントのサブスクライブ

    以下のコードスニペットに示すように、ポインタ座標を取得するためにマウスイベントをサブスクライブします。

        <c1:C1FlexChart Binding="YVals"
                     BindingX="XVals"
                     ChartType="SplineSymbols" 
                     x:Name="flexChart"                 
                     MouseLeftButtonDown="flexChart_MouseLeftButtonDown"                         
                     Margin="10,10,0,52"
                     HorizontalAlignment="Left"
                     Grid.RowSpan="2" Width="490">
        <c1:Series x:Name="series0" SeriesName="系列 0"/>
        <c1:Series x:Name="series1" SeriesName="系列 1" />
    </c1:C1FlexChart>
    

    先頭に戻る

  3. マウスイベントハンドラでのチャートの HitTest メソッドの呼び出し

    以下のコードスニペットに示すように、対応するイベントハンドラで、HitTest() メソッドを呼び出し、取得したマウスポインタ座標を渡します。

            Private Sub flexChart_MouseLeftButtonDown(sender As Object, e As MouseButtonEventArgs)
    
        HitTestOnFlexChart(e.GetPosition(flexChart))
    End Sub
    
    private void flexChart_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        HitTestOnFlexChart(e.GetPosition(flexChart));
    }
    

    先頭に戻る

  4. HitTestInfo オブジェクトから返された情報の使用

    次に、HitTestInfo オブジェクトで返されたマウスポインタの位置に関する情報を再利用できます。たとえば、以下のコードスニペットでは、HitTestInfo オブジェクトで返された値が文字列に変換され、TextBlock に表示されます。

            Private Sub HitTestOnFlexChart(p As Point)
        ' マウスーホバー/タッチしたチャート要素に関する情報を表示します。
        Dim ht = flexChart.HitTest(p)
    
        Dim result = New StringBuilder()
    
        result.AppendLine(String.Format("チャート要素:{0}", ht.ChartElement))
        If ht.Series IsNot Nothing Then
            result.AppendLine(String.Format("系列名:{0}", ht.Series.Name))
        End If
    
        If ht.PointIndex > 0 Then
            result.AppendLine(String.Format("ポイントインデックス={0:0}", ht.PointIndex))
        End If
    
        If ht.Distance > 0 Then
            result.AppendLine(String.Format("距離={0:0}", ht.Distance))
        End If
    
        If ht.X IsNot Nothing Then
            result.AppendLine(String.Format("X={0:0:0}", ht.X))
        End If
    
        If ht.Y IsNot Nothing Then
            result.AppendLine(String.Format("Y={0:0:0}", ht.Y))
        End If
    
        tbPosition1.Text = result.ToString()
    End Sub
    
    void HitTestOnFlexChart(Point p)
    {
        // マウスオーバーまたはタッチ時のチャート要素に関する情報を表示します。
        var ht = flexChart.HitTest(p);
        var result = new StringBuilder();
        result.AppendLine(string.Format("チャート要素:{0}", ht.ChartElement));
        if (ht.Series != null)
            result.AppendLine(string.Format("系列名:{0}", ht.Series.Name));
        if (ht.PointIndex > 0)
            result.AppendLine(string.Format("ポイントインデックス={0:0}", ht.PointIndex));
        if (ht.Distance > 0)
            result.AppendLine(string.Format("距離={0:0}", ht.Distance));
        if (ht.X != null)
            result.AppendLine(string.Format("X={0:0:0}", ht.X));
        if (ht.Y != null)
            result.AppendLine(string.Format("Y={0:0:0}", ht.Y));
        tbPosition1.Text = result.ToString();
    }
    

先頭に戻る