2017-12-18 13 views
-1

현재 Visual Studio의 도킹 패널/양식을 다시 만들려고합니다. 서로 다른 창보기를 처리하기 위해 동일한 시스템을 다른 프로젝트에 적용하려고하지만 먼저 다시 작성하려고합니다.자식 폼이 MdiChild와 Normal간에 전환됩니까?

지금까지 MainForm과 null 사이에서 MDiParent 속성을 전환했지만 Visual Studio에 표시된 부드러운 전환을 다시 만들 수 없었습니다. 그것은 항상 janky이고 절반은 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 

Dock/UnDock을 처리하려면이 코드를 사용하고 있습니다.

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에서 도킹 패널/양식을 다시 만드는 방법이 있습니까? 나는 올바른 길을 가고 있나, 아니면 내가 볼 수없는 더 좋은 방법이 있나?

+1

UI가 정말 어렵습니다. 그래서 https://github.com/xceedsoftware/wpftoolkit과 같은 것들이 좋습니다. 아발론 독, 그냥 fyi. – Will

+0

"항상 janky_입니다." "janky"를 정의하십시오. " 어떤 행동을 실제로하고 있습니까? 도킹을위한 올바른 위치를 얻으려면 Form ... 대신 MdiParent 양식에서 [MdiClient] (https://stackoverflow.com/a/604275/2330053) 컨트롤을 찾아 사용하십시오. . –

+0

양식 도킹, spazzes 및 도킹 해제 또는 오프 스크린 이동 –

답변

-1

그냥 대답 해주세요. 윌은 완전히 맞습니다. 나는 어떻게 든 그것을 일종의 것으로 만들었지 만, 어떤 용도로도 사용 하기엔 너무 이상합니다. 그냥 WPF로 전환하십시오 (WinForms에서 점프하기가 너무 어렵지 않습니다) xceedsoftware의 " Extended WPF Toolkit"에서 Avalon 독 컨트롤을 사용하십시오