之前写过一篇,用的是oxyplot的annotation实现的:
https://blog.csdn.net/pxy7896/article/details/120490130
这篇不用annotation,也不用刷新图像,所以响应速度更快,且可以自定义提示。
前台
首先在绘图区放一个Canvas。
<Grid>
...
<oxy:PlotView x:Name="myPlot" Model="{Binding Path= SimplePlotModel}" Grid.Row="0">
...
</oxy:PlotView>
<Canvas x:Name="canvas1" Grid.Row="0"/>
...
</Grid>
后台
// 定义几个类的私有变量
// rect就是点击时显示的bar
private System.Windows.Shapes.Rectangle rect;
// 存放对象。比如我就放了两个textblock
private DockPanel peakToolTip;
private TextBlock peakText1;
private TextBlock peakText2;
// 在构造函数里初始化一下
this.rect = new System.Windows.Shapes.Rectangle { Fill = new
SolidColorBrush(System.Windows.Media.Color.FromArgb(XXX)) };
// 加到canvas1里
canvas1.Children.Add(this.rect);
peakToolTip = new DockPanel();
peakText1 = new TextBlock() { Name = "peakText1" };
peakText2 = new TextBlock() { Name = "peakText2" };
peakToolTip.Children.Add(peakText1);
peakToolTip.Children.Add(peakText2);
canvas1.Children.Add(peakToolTip);
// 事件处理函数
// 绑定方法看之前写的那篇
private void SimplePlotModel_MouseDown(object sender, OxyMouseDownEventArgs e)
{
// e.Position.X 和 e.Position.Y是点击处的位置
var position = OxyPlot.Axes.Axis.InverseTransform(e.Position, myPlot.Model.DefaultXAxis, myPlot.Model.DefaultYAxis);
// 这个是与x轴对应的位置
var x = Math.Round(position.X);
....
// 设置bar的宽度和高度
this.rect.Width = 10;
this.rect.Height = 800;
// 设置bar的位置
Canvas.SetLeft(this.rect, e.Position.X);
Canvas.SetTop(this.rect, 20);
// 设置peakText1和peakText2相关的
this.peakText1.Text = ...
// 设置tooltip的位置
Canvas.SetLeft(this.peakToolTip, e.Position.X);
Canvas.SetTop(this.peakToolTip, e.Position.Y + 50);
// 设置裁剪区域
var plotArea = new Rect(myPlot.Model.PlotArea.Left,
myPlot.Model.PlotArea.Top,
myPlot.Model.PlotArea.Width,
myPlot.Model.PlotArea.Height);
// 裁剪后剩下plotArea,所以在这里出现的东西就会显示在绘图区了
canvas1.Clip = new RectangleGeometry(plotArea);
}