1

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

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

有任何想法吗?

4

1 回答 1

4

根据您的描述,不清楚是否要将气泡精确定位在新创建的选项卡上,或者您是否可以将其显示在选项卡条上,在固定的 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 结尾的包名。

于 2011-05-06T02:15:39.220 回答