2013-12-17 177 views
11

在我的C#WinForms應用程序中,我有一個隱藏其默認控件的主窗口。在wpf中移動無邊界窗口

所以,讓我四處移動它,我增加了以下主窗口:

private const int WM_NCHITTEST = 0x84; 
    private const int HTCLIENT = 0x1; 
    private const int HTCAPTION = 0x2; 
    private const int WM_NCLBUTTONDBLCLK = 0x00A3; 

    protected override void WndProc(ref Message message) 
    { 
     if (message.Msg == WM_NCLBUTTONDBLCLK) 
     { 
      message.Result = IntPtr.Zero; 
      return; 
     } 

     base.WndProc(ref message); 

     //Allow window to move 
     if (message.Msg == WM_NCHITTEST && (int)message.Result == HTCLIENT) 
      message.Result = (IntPtr)HTCAPTION; 
    } 

我有一個WPF應用程序,我也隱藏在默認控件,我想這樣做。我發現主窗口是從「窗口」派生的,所以上面的代碼不起作用。 如何在WPF中執行此操作?

回答

22

爲此,您需要將事件處理程序附加到窗口的MouseDown事件中,檢查是否按下了鼠標左鍵並在窗口上調用DragMove方法。

這裏是一個窗口與此功能的示例:

public partial class MyWindow : Window 
{ 
    public MyWindow() 
    { 
     InitializeComponent(); 
     MouseDown += Window_MouseDown; 
    } 

    private void Window_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
     if (e.ChangedButton == MouseButton.Left) 
      DragMove(); 
    } 
} 
+0

使用這將導致我的標籤,通過的MouseUp或PreviewMouseUp調用不再會發出信號。 –

+0

@TheMuffinMan如果可以的話,我會嘗試使用MouseUp作爲標籤,或者使用按鈕作爲標籤樣式並使用click事件。 – Phaeze

0

正如我在你的其他話題說,在我掙扎在WPF創建一個自定義窗口,我發現,在Win32 API涉及一些方法在線到Resize窗口,JustinM代碼是正確的,如果你想拖動窗口。

該代碼有點廣泛。它處理光標,消息到WndProc和所有。我將留下一個解釋它的鏈接。

WPF Borderless window resize