我正在構建一個 WPF 應用程式并使用 OxyPlot 呈現圖表。
為了最大化圖表的性能,我切換到OxyPlot.WindowsForms并使用嵌入圖表WindowsFormsHost。資料來源:
WPF:

有什么方法可以自定義 WindowsForms 工具提示,使其看起來像 WPF 工具提示?最重要的是點的垂直和水平線。
uj5u.com熱心網友回復:
查看組件的源代碼,它不是真正的工具提示,
使用以下代碼:
private Label trackerLabel;
private void Form1_Load(object sender, EventArgs e)
{
var trackerLabelField = plotView1.GetType().GetField("trackerLabel",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
trackerLabel = new BalloonLabel()
{
Visible = false,
Parent = plotView1
};
trackerLabelField.SetValue(plotView1, trackerLabel);
var myModel = new PlotModel { Title = "Example 1" };
myModel.Series.Add(new FunctionSeries(Math.Cos, 0, 10, 0.1, "cos(x)"));
this.plotView1.Model = myModel;
this.plotView1.Paint = PlotView1_Paint;
trackerLabel.VisibleChanged = TrackerLabel_VisibleChanged;
}
private void TrackerLabel_VisibleChanged(object sender, EventArgs e)
{
plotView1.Invalidate();
}
private void PlotView1_Paint(object sender, PaintEventArgs e)
{
if (trackerLabel.Visible)
{
var r = plotView1.Model.PlotArea;
e.Graphics.DrawLine(Pens.Blue, trackerLabel.Left trackerLabel.Width / 2, (int)r.Top,
trackerLabel.Left trackerLabel.Width / 2, (int)r.Bottom);
e.Graphics.DrawLine(Pens.Blue, (int)r.Left, trackerLabel.Bottom, (int)r.Right, trackerLabel.Bottom);
}
}
這個氣球標簽,我認為這是一個足夠好的起點:
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
public class BalloonLabel : Label
{
public BalloonLabel()
{
BackColor = SystemColors.Info;
Padding = new Padding(5, 5, 5, 20);
ArrowSize = new Size(10, 20);
AutoSize = true;
}
private Size arrowSize;
public Size ArrowSize
{
get { return arrowSize; }
set
{
arrowSize = value;
this.RecreateRegion();
}
}
private GraphicsPath GetBalloon(Rectangle bounds)
{
GraphicsPath path = new GraphicsPath();
path.StartFigure();
if (arrowSize.Width > 0 && arrowSize.Height > 0)
{
path.AddLine(bounds.Left, bounds.Bottom - arrowSize.Height / 2, bounds.Left, bounds.Top);
path.AddLine(bounds.Left, bounds.Top, bounds.Right, bounds.Top);
path.AddLine(bounds.Right, bounds.Top, bounds.Right, bounds.Bottom - arrowSize.Height / 2);
path.AddLine(bounds.Right, bounds.Bottom - arrowSize.Height / 2, bounds.Left bounds.Width / 2 arrowSize.Width / 2, bounds.Bottom - arrowSize.Height / 2);
path.AddLine(bounds.Left bounds.Width / 2 arrowSize.Width / 2, bounds.Bottom - arrowSize.Height / 2,
bounds.Left bounds.Width / 2, bounds.Bottom);
path.AddLine(bounds.Left bounds.Width / 2, bounds.Bottom,
bounds.Left bounds.Width / 2 - arrowSize.Width / 2, bounds.Bottom - arrowSize.Height / 2);
path.AddLine(bounds.Left bounds.Width / 2 - arrowSize.Width / 2, bounds.Bottom - arrowSize.Height / 2,
bounds.Left, bounds.Bottom - arrowSize.Height / 2);
}
else
{
path.AddLine(bounds.Left, bounds.Bottom, bounds.Left, bounds.Top);
path.AddLine(bounds.Left, bounds.Top, bounds.Right, bounds.Top);
path.AddLine(bounds.Right, bounds.Top, bounds.Right, bounds.Bottom);
path.AddLine(bounds.Right, bounds.Bottom, bounds.Left, bounds.Bottom);
}
path.CloseFigure();
return path;
}
private void RecreateRegion()
{
var r = ClientRectangle;
using (var path = GetBalloon(r))
this.Region = new Region(path);
this.Invalidate();
}
protected override void OnSizeChanged(EventArgs e)
{
base.OnSizeChanged(e);
this.RecreateRegion();
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
var r = ClientRectangle;
r.Inflate(-1, -1);
using (var path = GetBalloon(r))
{
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
using (var pen = new Pen(Color.Gray, 1) { Alignment = PenAlignment.Inset })
e.Graphics.DrawPath(pen, path);
if (Parent != null)
Parent.Invalidate();
}
}
}
這是影片結果:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/456213.html
