我们正在改进我们的 winforms 用户界面以使用Weifen Luo DockPanel Suite,并且由于我们的旧 UI 没有选项卡,我们希望在新窗口停靠到文档区域时显示气球工具提示,通知用户他们可能撕下文件并将其浮动到任何他们想要的地方。
我认为要做到这一点,我需要能够以编程方式确定停靠窗口选项卡的位置。我们的 DockPanel 的 DocumentStyle 设置为 DockingWindow,因此任何停靠在“文档”区域的窗口始终显示选项卡。
有任何想法吗?
我们正在改进我们的 winforms 用户界面以使用Weifen Luo DockPanel Suite,并且由于我们的旧 UI 没有选项卡,我们希望在新窗口停靠到文档区域时显示气球工具提示,通知用户他们可能撕下文件并将其浮动到任何他们想要的地方。
我认为要做到这一点,我需要能够以编程方式确定停靠窗口选项卡的位置。我们的 DockPanel 的 DocumentStyle 设置为 DockingWindow,因此任何停靠在“文档”区域的窗口始终显示选项卡。
有任何想法吗?
根据您的描述,不清楚是否要将气泡精确定位在新创建的选项卡上,或者您是否可以将其显示在选项卡条上,在固定的 x 轴位置,但根据 y 轴位置正确定位条带(这是两种方法中较简单的一种)。
因此,我将为更简单的场景提供解决方案,并为更复杂的场景提供选项。
首先是简单的解决方案。When the tabs are on top, the Bounds.Top and ClientRectangle.Top values are not the same. 当标签在底部时。我们可以将此信息与 Bounds.Height 和 Bounds.Top 一起使用来计算正确的 y 轴位置。
下面是一些示例代码,尽管很天真。(例如,它不会在创建后立即处理文档,这与由于用户拖动窗口而发生的情况不同,这留给读者作为练习。)
设置 DockContent 时,注册事件:
class DocumentWindow : DockContent {
//...
}
DocumentWindow doc = new DocumentWindow();
doc.Text = "Document 1";
doc.DockStateChanged += new EventHandler(doc_DockStateChanged);
doc.Show(this.dockPanel1, DockState.Document);
处理事件时:
void doc_DockStateChanged(object sender, EventArgs e)
{
DockContent doc = sender as DockContent;
if (doc != null)
{
if (doc.DockState == DockState.Document)
{
Debug.Write("Client:");
Debug.WriteLine(doc.ClientRectangle);
Debug.Write("Bounds:");
Debug.WriteLine(doc.Bounds);
int y = doc.ClientRectangle.Top == doc.Bounds.Top ? doc.ClientRectangle.Bottom : doc.Bounds.Top;
this.toolTip1.Show("You may tear this \r\nsucker out any \r\ntime you like!", doc.PanelPane, doc.PanelPane.Right, y, 5000);
}
}
}
如果你想要更高级的方法,事情就不会那么容易了。我为您提供的选项如下:
1) 更改基础库代码以公开 DockPaneStripBase.Tab 类并公开选项卡矩形。
2) 实现您自己的自定义 DockPaneStrip,如 DockSample 应用程序代码所示。
3) 检查选项 1 和/或 2 的代码并设计一个方案,允许您计算放置工具提示的位置。
仅供参考,对于其他阅读本文的人来说,他们希望了解更高级的方法所涉及的工作量。WeifenLuo DockPanel 和 DockSample app 的源码可以从: http: //sourceforge.net/projects/dockpanelsuite/files/DockPanel%20Suite/2.5.0%20RC1/ 以_Src 结尾的包名。