DockPanel Suite: открыть расположение вкладки «Документ»? - PullRequest
1 голос
/ 23 марта 2010

Мы обновляем наш пользовательский интерфейс winforms, чтобы использовать Weifen Luo DockPanel Suite , и поскольку у нашего старого пользовательского интерфейса не было вкладок, мы хотели бы показать всплывающую подсказку, когда новое окно прикреплено область документа, информирующая пользователей о том, что они могут вырвать документ и отправить его туда, куда они захотят.

Я полагаю, что для этого мне нужно иметь возможность программно определять местоположение вкладки закрепленного окна. DocumentStyle нашей DockPanel установлен в DockingWindow, поэтому вкладки всегда отображаются для любых окон, прикрепленных к области «документа».

Есть идеи?

1 Ответ

3 голосов
/ 06 мая 2011

Из вашего описания неясно, хотите ли вы точно расположить пузырь над вновь созданной вкладкой, или если вы в порядке, когда он появляется над полоской вкладок, в фиксированном положении по оси 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.

...