我想知道是否可以使用ToolTip.SetToolTip
或类似的东西将控件作为工具提示打开,而不仅仅是一个字符串(即SetToolTip(controlToWhichToAdd, panelToDisplayAsToolTip)
,而不是将字符串作为第二个参数传递)。
如果这不可能,我猜下一个最好的办法是在mouse_enter
控件上的事件上显示鼠标位置上的面板,并在mouse_leave
.
或者是否有其他做法可以更轻松地实现这一点?
您可以为Tooltip.Popup 事件编写一个处理程序,并取消弹出窗口以显示您自己的面板。不过,您需要在适当的时候清理它。
例如:
private void ToolTip1_Popup(Object sender, PopupEventArgs e)
{
e.Cancel = true;
//Do work here to display whatever control you'd like
}
如果您只是在工具提示显示中寻找更多格式选项,另一种选择是类似于此 CodeProject entry,它实现了启用 HTML 的工具提示:
这是开箱即用的。你有两个选择。第一个选项是覆盖Draw Event,这将让您自定义工具提示的外观。这是一个例子。如果使用此方法,请确保将OwnerDraw属性设置为!true
虽然如果您只需要一些简单的定制,第一种方法会起作用,但如果您需要更灵活的选项,第二种方法效果最好。第二种选择是执行您已经建议的操作并创建自己的工具提示。简单地说,您将首先为MouseEnter 事件创建一个事件处理程序。当该事件触发时,您将启用Timer。此计时器将是显示工具提示之前发生的延迟。最后,您只需让您的面板出现在鼠标坐标处。
假设您有一个带有按钮和计时器的表单,并且您希望该按钮具有作为面板的工具提示:
public partial class Form1 : Form
{
private Panel _myToolTipPanel;
private void Form1_Load(object sender, EventArgs e)
{
_myToolTipPanel = new Panel {Visible = false};
Controls.Add(_myToolTipPanel);
Label myLabel = new Label();
myLabel.Text = "Testing";
_myToolTipPanel.Controls.Add(myLabel);
}
private void button1_MouseEnter(object sender, EventArgs e)
{
timer1.Enabled = true;
}
private void button1_MouseLeave(object sender, EventArgs e)
{
timer1.Enabled = false;
_myToolTipPanel.Visible = false;
}
private void timer1_Tick(object sender, EventArgs e)
{
timer1.Enabled = false;
Point position = Cursor.Position;
Point formPoisition = PointToClient(position);
_myToolTipPanel.Visible = true;
_myToolTipPanel.Location = formPoisition;
}
}
当然,现在您必须对工具提示进行一些美化,但这是一般的想法!
一种方法可能是继承 ToolTip 控件,然后覆盖 SetToolTip 和 Show方法。在 SetToolTip 内部,私有方法 - SetToolTipInternal需要重写,但大部分功能可以重用 - 它使用鼠标事件(离开、移动)来绑定区域。但由于工具提示使用内部的窗口来显示气球窗口。你将不得不重写相当多的代码。
但这可能很耗时,并且需要进行大量测试。