Есть ли у дочерней формы переключение между MdiChild и Normal?

В настоящее время я пытаюсь воссоздать панель / формы стыковки визуальной студии. Я хочу применить ту же систему к другому проекту для обработки разных оконных представлений, но сначала я хочу воссоздать ее.

До сих пор я переключал свойство MDiParent между MainForm и null, но не смог воссоздать плавный переход, наблюдаемый в Visual Studio. Это всегда неприятно, и в половине случаев я узнаю, что событие MouseUP, к которому я привязываю переключатель, редко срабатывает (в настоящее время я использую событие изменения местоположения).

Чтобы переместить форму, я использовал этот удобный блок кода, который я нашел;

 #region Form Movement

    public const int WM_NCLBUTTONDOWN = 0xA1;
    public const int HT_CAPTION = 0x2;

    [System.Runtime.InteropServices.DllImportAttribute("user32.dll")]
    public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
    [System.Runtime.InteropServices.DllImportAttribute("user32.dll")]
    public static extern bool ReleaseCapture();

    private void MoveForm()
    {
        ReleaseCapture();
        SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
    }

    #endregion

И для работы с док-станцией / отстыковкой я использую этот код;

    private void DockToMain()
    {
        Point f = Form1.Main.PointToClient(this.Location);
        Point newP = new Point(f.X - 25, f.Y - 51);
        try { this.MdiParent = Form1.Main; } catch { }
        this.Location = newP;
    }

    private void UnDockFromMain()
    {
        Point f = Form1.Main.PointToScreen(this.Location);
        Point newP = new Point(f.X + 25, f.Y + 51);
        try { this.MdiParent = null; } catch { }
        this.Location = newP;
    }

Есть ли способ воссоздать панель / форму док-станции в Winforms? Я вообще на правильном пути, или я не вижу лучшего пути?


person Jonathan Viju Mathai    schedule 18.12.2017    source источник
comment
UI действительно очень сложный. Вот почему такие вещи, как этот github.com/xceedsoftware/wpftoolkit, хороши. Док Авалон, просто фу.   -  person    schedule 18.12.2017
comment
Это всегда дрянно Определить janky. Какое поведение вы на самом деле наблюдаете? Чтобы указать правильное местоположение для стыковки, вы не хотите использовать форму ... вместо этого найдите элемент управления MdiClient в форме MdiParent и используйте это.   -  person Idle_Mind    schedule 18.12.2017
comment
Форма закрепляется, отключается и либо отключается, либо перемещается за пределы экрана   -  person Jonathan Viju Mathai    schedule 18.12.2017
comment
Уиллу, есть ли версия AvalonDock для Winforms?   -  person Jonathan Viju Mathai    schedule 18.12.2017
comment
Сделайте себе одолжение и найдите API / элемент управления. Это будет грязное мероприятие, и вы никогда не перестанете бороться с ним.   -  person DonBoitnott    schedule 18.12.2017


Ответы (1)


Чтобы ответить на этот вопрос, Уилл совершенно прав. Я каким-то образом заставил его работать, но он слишком глючный, чтобы быть полезным. Просто переключитесь на WPF (перейти с WinForms не так уж сложно) и используйте элемент управления док-станцией Avalon из "Расширенный набор инструментов WPF "

person Jonathan Viju Mathai    schedule 28.12.2017