OxyPlot:如何在TrackerFormatString中进行计算并显示自定义属性?
解决OxyPlot LineSeries Tracker显示自定义计算属性Z的问题
这个问题我之前也碰到过——OxyPlot的TrackerFormatString确实不支持直接在占位符里写计算表达式,它只能替换预定义的固定占位符(比如{2}对应X值,{4}对应Y值),所以你直接写{2*(1-4)}肯定不会生效,解析器只会把这段字符串原封不动地输出。
下面给你两种可行的解决方案,按需选择:
方案1:预计算Z值并存入DataPoint的Label属性(简单快速)
如果你的场景不需要使用DataPoint的Label做其他用途,可以在创建数据点的时候预先计算Z值,把它存在Label里,然后在TrackerFormatString中用{1}引用这个Label:
// 准备数据时预计算Z值 var points = new List<DataPoint>(); // 假设你有原始的X/Y数据源,比如从列表或数据库获取 foreach (var item in yourRawData) { double x = item.XValue; double y = item.YValue; double z = (1 - y) * x; // 将Z值存入Label,可指定小数格式 points.Add(new DataPoint(x, y) { Label = z.ToString("F2") }); } // 创建LineSeries并设置Tracker格式 var series = new LineSeries { TrackerFormatString = "X:{2}\nY:{4}\nZ:{1}", Points = points };
方案2:通过TrackerChanged事件自定义Tracker内容(灵活可控)
如果需要更灵活的控制(比如不想占用Label属性、需要动态计算或格式化),可以监听PlotView的TrackerChanged事件,在事件处理方法中手动计算Z值并修改Tracker的显示文本:
步骤1:绑定事件(XAML场景)
<!-- 在你的PlotView标签中添加TrackerChanged事件绑定 --> <oxy:PlotView x:Name="MyPlotControl" TrackerChanged="MyPlotControl_TrackerChanged" />
步骤2:编写事件处理代码
private void MyPlotControl_TrackerChanged(object sender, TrackerChangedEventArgs e) { // 确保有命中的点,且目标是LineSeries if (e.TrackerHitResult != null && e.TrackerHitResult.Series is LineSeries) { var hitPoint = e.TrackerHitResult.DataPoint; // 计算Z值 double z = (1 - hitPoint.Y) * hitPoint.X; // 自定义Tracker显示文本,可按需调整格式和内容 e.TrackerHitResult.Text = $"X:{hitPoint.X:F2}\nY:{hitPoint.Y:F2}\nZ:{z:F2}"; } }
这种方式完全不受TrackerFormatString的限制,你可以添加任何自定义内容,甚至根据不同的系列类型做差异化处理。
内容的提问来源于stack exchange,提问作者Anno
相关产品推荐
相关产品推荐

