我正试着在MetroFramework上玩C#,当一个ToolStripItem被悬停时,它会显示出一个很好的ToolTip,而不是提供的基本/常规工具提示。
但是,我无法显示“每个项目”,因为ToolStripItem只有“所有者”控件属性,并且它将显示它在工具栏中的所有项目。
示例:
private void toolStripButton1_MouseHover(object sender, EventArgs e)
{
var tooltip = new MetroFramework.Components.MetroToolTip();
ToolStripItem tsi = (ToolStripItem)sender;
tooltip.SetToolTip(tsi.Owner, "testing the tooltips");
}有人有办法解决这个问题吗?或者,如果不编辑MetroFramework库,这是不可能的吗?
非常感谢您的投入。
发布于 2021-02-10 21:45:01
基于该组件的源代码,其派生自System.Windows.Forms.ToolTip,因此我们可以以同样的方式处理它以满足这一需求。
首先,您只需要一个表单中的MetroToolTip实例。要么使用设计器删除实例,要么在关闭窗体时在代码中创建实例并将其释放。
要使它在每项中都有效:
ToolStrip / MenuStrip / ContextMenuStrip / StatusStrip项的MenuStrip属性。Form.Load事件中,使用递归方法获取ToolStripItem对象,以订阅Click、MouseHover和MouseLeave事件。此外,还需要ToolStripDropDownItem.DropDownOpening事件。我们会处理它们来展示和隐藏工具提示。示例
private readonly MetroToolTip mTt;
// ctor
public SomeForm()
{
InitializeComponent();
mTt = new MetroToolTip();
// 3 strips just for demonstration.
menuStrip1.ShowItemToolTips = false;
toolStrip1.ShowItemToolTips = false;
contextMenuStrip1.ShowItemToolTips = false;
foreach (var item in GetAllToolStripItems(menuStrip1.Items)
.Concat(GetAllToolStripItems(toolStrip1.Items))
.Concat(GetAllToolStripItems(contextMenuStrip1.Items)))
{
if (!string.IsNullOrEmpty(item.ToolTipText))
{
item.AutoToolTip = false;
item.Click += OnToolStripItemClick;
item.MouseHover += OnToolStripItemMouseHover;
item.MouseLeave += OnToolStripItemMouseLeave;
if (item is ToolStripDropDownItem tsddi && tsddi.HasDropDown)
tsddi.DropDownOpening += OnDropDownOpening;
}
}
}
// Clean up..
private void SomeForm_FormClosed(object sender, FormClosedEventArgs e) =>
mTt.Dispose();
// Show the tooltip of the current item at a proper point.
private void OnToolStripItemMouseHover(object sender, EventArgs e)
{
var s = sender as ToolStripItem;
var p = Point.Add(Cursor.Position, new Size(0, Cursor.Size.Height));
mTt.Show(s.ToolTipText, s.Owner, s.Owner.PointToClient(p));
}
// Hide the tooltip when the mouse pointer leaves the bounds of the current item.
private void OnToolStripItemMouseLeave(object sender, EventArgs e) =>
mTt.Hide((sender as ToolStripItem).Owner);
// Hide the tooltip (if any) when a dropdown is about to open
// Otherwise it'll remain behind the dropdown window until the
// internal timer ticks.
private void OnDropDownOpening(object sender, EventArgs e) =>
mTt.Hide((sender as ToolStripItem).Owner);
// For the ToolStrip control. To hide the tooltip right after clicking an item.
private void OnToolStripItemClick(object sender, EventArgs e) =>
mTt.Hide((sender as ToolStripItem).Owner);
// A recursive method to get all the TSIs of any strip.
private static IEnumerable<ToolStripItem> GetAllToolStripItems(ToolStripItemCollection tsic)
{
foreach (var tsi in tsic.Cast<ToolStripItem>())
{
yield return tsi;
if (tsi is ToolStripDropDownItem tsddi && tsddi.HasDropDown)
foreach (var ddi in GetAllToolStripItems(tsddi.DropDownItems))
yield return ddi;
}
}https://stackoverflow.com/questions/66138476
复制相似问题