[C#/xaml] oxyplotでTrackerを使う

# oxyplot関連記事

https://tera1707.com/entry/2022/02/06/144447#oxyplot

# やりたいこと

OxyPlotのグラフで、
デフォルトだと、右クリックしたままで、表示されたSeries(グラフの線とか棒とか)の近くにマウスを持っていくと出てくる吹き出しみたいなやつの中身を改造したい。

これ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/4f396ba3-1a7c-e86a-4606-5b5874b41e3d.png)

あと、縦横に吹き出しの先を中心に、縦横に直線が出てくる。
なんとなく狙撃のスコープみたいでかっこいい気もするが、邪魔なので消したい。

# やりかた

`<oxy:PlotView.DefaultTrackerTemplate>`を使う。

あの吹き出しは、OxyPlotでは「Tracker」というらしい。

# 情報源

OxyPlot公式ドキュメントの「View > Tracker > Template」の項目。

https://oxyplot.readthedocs.io/en/latest/views/tracker.html#template

そこに「SourceExamplesWPFCustomTrackerDemo」というサンプルアプリを見よ、とある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/4b68e542-c6ec-99e2-4e59-079be1e75ab0.png)


その「SourceExamplesWPFCustomTrackerDemo」というサンプルがこれ。

https://github.com/ylatuya/oxyplot/tree/master/Source/Examples/WPF/WpfExamples/Examples/CustomTrackerDemo

よく見たらこのサンプルの名前、置き場所のパスに一致する...
`https://github.com/ylatuya/oxyplot/tree/master/Source/Examples/WPF/WpfExamples/Examples`の間の`/`が見えてないということなのか...ちゃんと書いていてくれたら、見つけるのにこんなに時間はかからなかったのに....

# サンプル

上のサンプルをもとに、ちょっとだけ簡略化したのが下記のコード。

`<oxy:PlotView.DefaultTrackerTemplate>`に<ControlTemplate>を入れて、`<oxyshared:TrackerControl>`の`Content`に好きな見た目を入れてやればOK。

縦横の線を消すには、`TrackerControl `の`VerticalLineVisibility`と`HorizontalLineVisibility`をCollapsedにすればよい。

```MainWindow.xaml
<Window x:Class="OxyPlotTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:OxyPlotTest"
        xmlns:oxy="http://oxyplot.org/wpf"
        xmlns:oxyshared="clr-namespace:OxyPlot.Wpf;assembly=OxyPlot.Wpf.Shared" 
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800"
        Name="root">
    <Grid>
        <!-- グラフ本体 -->
        <oxy:PlotView Model="{Binding Model, ElementName=root}" Controller="{Binding Controller, ElementName=root}" >
            <oxy:PlotView.DefaultTrackerTemplate>
                <ControlTemplate>
                    <Grid>
                        <oxyshared:TrackerControl 
                            Position="{Binding Position}" 
                            VerticalLineVisibility="Collapsed" 
                            HorizontalLineVisibility="Collapsed"
                            LineExtents="{Binding PlotModel.PlotArea}" >
                            
                            <oxyshared:TrackerControl.Content>
                                <!-- Trackerの中身をここに書いてやる -->
                                <Grid>
                                    <TextBlock Text="{Binding}" Margin="7" />
                                    <Ellipse Stroke="Red" StrokeThickness="3"/>
                                </Grid>
                            </oxyshared:TrackerControl.Content>
                        </oxyshared:TrackerControl>
                    </Grid>
                </ControlTemplate>
            </oxy:PlotView.DefaultTrackerTemplate>
        </oxy:PlotView>
    </Grid>
</Window>
```

csコードでは、Trackerのためには何もしていない。ただグラフを表示させただけ。
(＝[以前書いたサンプル](https://qiita.com/tera1707/items/1070993f6bccac9770c9#%E7%B7%9A%E3%82%B0%E3%83%A9%E3%83%95)と全く同じコード。)

```MainWindw.xaml.cs
using OxyPlot;
using OxyPlot.Axes;
using System.Windows;

// https://shikaku-sh.hatenablog.com/entry/oxyplot-simple-usage
// https://gist.github.com/YSRKEN/f68112602efa304b2f20c10e24f31674

namespace OxyPlotTest
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            Init();
        }
        // OxyPlotのためのモデルとコントローラー
        public PlotModel Model { get; } = new PlotModel();
        public PlotController Controller { get; } = new PlotController();

        // 軸の設定
        public LinearAxis AxisX { get; } = new LinearAxis();
        public LinearAxis AxisY { get; } = new LinearAxis();

        public void Init()
        {
            // X軸の設定
            AxisX.Position = OxyPlot.Axes.AxisPosition.Bottom;    // 軸の位置(topにしたら、目盛りが上にくる)
            // Y軸の設定
            AxisY.Position = OxyPlot.Axes.AxisPosition.Left;      // Y軸の位置(Rightにしたら、目盛りが右にくる)

            // 設定した軸をモデルにセット
            Model.Title = "グラフのタイトル";
            Model.Axes.Add(AxisX);
            Model.Axes.Add(AxisY);

            // 線グラフ
            var LineSeries = new OxyPlot.Series.LineSeries();
            LineSeries.Title = "Line";
            LineSeries.InterpolationAlgorithm = InterpolationAlgorithms.UniformCatmullRomSpline;//グラフの角を丸める
            LineSeries.Color = OxyColor.FromArgb(0xff, 0xff, 0, 0);     // 上の線の色
            LineSeries.StrokeThickness = 2;                             // 線の太さ
            // 点を追加
            LineSeries.Points.Add(new DataPoint(1.0, 10.0));
            LineSeries.Points.Add(new DataPoint(5.0, 90.0));
            LineSeries.Points.Add(new DataPoint(9.0, 40.0));
            // 線グラフをモデルに追加
            Model.Series.Add(LineSeries);

            // セットした内容を反映させる
            Model.InvalidatePlot(true);
        }
    }
}
```
見た目
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/4342871b-7ec9-7691-1315-ed53ae8dc129.png)



# 前提

下記を使用。

- .NET Framework 4.7.2
- OxyPlot.Wpf v2.1.0-Preview1（Nuget）

# 備考

OxyPlotは情報が結構見つけづらい印象。
今回いろいろ見たところ、

- まず公式Docをざっと見る
- それっぽい項目があったら、サンプルアプリの名前(githubのパス？)が書いてるので、そこを見る。  
(サンプルは下記に置いてる)

公式Doc

https://oxyplot.readthedocs.io/en/latest/

サンプル(公式？)

https://github.com/ylatuya/oxyplot