Код: Выделить всё
OwnerDraw=true
Я уже задал вопрос об этом, думая, что я делаю что-то не так, но теперь я обнаружил, что это работает нормально (для меня) с .net 8, но не с .net Framework . Я протестировал .NET Framework 4.8 (это то, что я должен использовать), 4.7.2 и 4.6.2 - всплывающее событие не запускается ни с одним из них. Событие поднимается всякий раз, когда отображается подсказка, либо с помощью явного призывания к одному из методов шоу, либо когда класс подсказки инструментов неявно отображает подсказку. Код, но в своем ответе на мой предыдущий вопрос @olivier jacot-descombes включил следующий код, который очень похож на то, как я это делаю, и это также код, который я использовал для своих тестов с тех пор: < /p>
Код: Выделить всё
public partial class FormTreeNodeToolTip : Form
{
private static readonly Font _font = new Font("Consolas", 16, FontStyle.Regular);
private TreeNode _currentNode;
public FormTreeNodeToolTip()
{
InitializeComponent();
treeView1.Nodes.Add(new TreeNode("First node"));
treeView1.Nodes.Add(new TreeNode("Second node with longer text"));
treeView1.Nodes.Add(new TreeNode("Third node"));
}
private void ToolTip1_Draw(object sender, DrawToolTipEventArgs e)
{
e.Graphics.Clear(Color.LightYellow);
e.Graphics.DrawString(e.ToolTipText, _font, Brushes.Blue, e.Bounds);
}
private void TreeView1_NodeMouseHover(object sender, TreeNodeMouseHoverEventArgs e)
{
_currentNode = e.Node;
Point cursor = treeView1.PointToClient(Cursor.Position);
toolTip1.Show(e.Node.Text, treeView1, cursor.X + 20, cursor.Y + 20, 800);
}
private void ToolTip1_Popup(object sender, PopupEventArgs e)
{
e.ToolTipSize = TextRenderer.MeasureText(_currentNode.Text, _font);
}
private void TreeView1_MouseMove(object sender, MouseEventArgs e)
{
if (treeView1.GetNodeAt(e.Location) != _currentNode) {
_currentNode = null;
toolTip1.Hide(treeView1);
}
}
private void TreeView1_MouseLeave(object sender, EventArgs e)
{
toolTip1.Hide(treeView1);
}
}
Код: Выделить всё
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);
this.treeView1 = new System.Windows.Forms.TreeView();
this.SuspendLayout();
//
// toolTip1
//
this.toolTip1.OwnerDraw = true;
this.toolTip1.Draw += new System.Windows.Forms.DrawToolTipEventHandler(this.ToolTip1_Draw);
this.toolTip1.Popup += new System.Windows.Forms.PopupEventHandler(this.ToolTip1_Popup);
//
// treeView1
//
this.treeView1.Location = new System.Drawing.Point(0, 0);
this.treeView1.Name = "treeView1";
this.treeView1.Size = new System.Drawing.Size(306, 231);
this.treeView1.TabIndex = 0;
this.treeView1.NodeMouseHover += new System.Windows.Forms.TreeNodeMouseHoverEventHandler(this.TreeView1_NodeMouseHover);
this.treeView1.MouseLeave += new System.EventHandler(this.TreeView1_MouseLeave);
this.treeView1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.TreeView1_MouseMove);
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(710, 304);
this.Controls.Add(this.treeView1);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);
}
добавил несколько строк в конструктор в примере, чтобы добавить пару узлов в Treeview . Я не думал упомянуть, что этот простой пример просто показывает заголовок узла как подсказку, поэтому чем дольше строка подписи, тем более очевидным становится то, что подсказка имеет неправильный размер. Там многострочный текст подъема инструментов для узла определяется на основе других вещей, и его необходимо собирать в данный момент.>
Подробнее здесь: https://stackoverflow.com/questions/797 ... -framework