DockPanel Suite:打开文档选项卡位置?

时间:2010-03-23 14:22:41

标签: c# .net winforms dockpanel-suite

我们正在修改我们的winforms用户界面以使用Weifen Luo DockPanel Suite,并且由于我们的旧UI没有标签,我们希望在新窗口停靠到文档区域时显示气球工具提示,通知用户可以撕掉文件并将其浮动到任何他们想要的地方。

我想这样做我需要能够以编程方式确定停靠窗口选项卡的位置。我们的DockPanel的DocumentStyle设置为DockingWindow,因此对于停靠在“文档”区域中的任何窗口,始终显示选项卡。

有什么想法吗?

1 个答案:

答案 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结尾的包名。