我们正在修改我们的winforms用户界面以使用Weifen Luo DockPanel Suite,并且由于我们的旧UI没有标签,我们希望在新窗口停靠到文档区域时显示气球工具提示,通知用户可以撕掉文件并将其浮动到任何他们想要的地方。
我想这样做我需要能够以编程方式确定停靠窗口选项卡的位置。我们的DockPanel的DocumentStyle设置为DockingWindow,因此对于停靠在“文档”区域中的任何窗口,始终显示选项卡。
有什么想法吗?
答案 0 :(得分:3)
根据您的描述,您不清楚是否要将气泡精确定位在新创建的标签上,或者如果您可以将其显示在标签条上,位于固定的x轴位置,但是根据y-正确定位条带的轴位置(这是两种方法中较简单的方法)。
因此,我将为更简单的场景提供解决方案,并为更复杂的场景提供选项。
首先是简单的解决方案。当选项卡位于顶部时,Bounds.Top和ClientRectangle.Top值不同。当标签位于底部时,它们就是。我们可以将此信息与Bounds.Height和Bounds.Top一起使用来计算正确的y轴位置。
下面是一些示例代码,尽管是Naiive。 (例如,由于用户拖动窗口而导致创建不同,因此它不会立即处理文档,这是留给读者的练习。)
设置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应用程序的源代码可以从以下位置获得: http://sourceforge.net/projects/dockpanelsuite/files/DockPanel%20Suite/2.5.0%20RC1/ 它是以_Src结尾的包名。