一般點擊 Window的標題列,接著滑鼠移動,視窗自然而然就會跟著動,但是在 Window的 WindowStyle設為 None時,Window的標題列不見囉。
這時該怎麼移動 Window呢?
作法是添加 MouseLeftButtonDown再加 MouseMove 這兩個事件去處理滑鼠移動數及改變 Window的 Top和 Left的值。
首先,先宣告一個全域 Point,程式碼如下:
private Point _startPoint;
在 Constructor或 Window_Load處添加 MouseButtonEventHandler和 MouseEventHandler,程式碼如下:
this.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(Window_PreviewMouseLeftButtonDown); this.PreviewMouseMove += new MouseEventHandler(Window_PreviewMouseMove);
接著,實作 Window_PreviewMouseLeftButtonDown和 Window_PreviewMouseMove,程式碼如下:
private void Window_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { _startPoint = e.GetPosition(null); } private void Window_PreviewMouseMove(object sender, MouseEventArgs e) { if (e.LeftButton == MouseButtonState.Pressed) { Point position = e.GetPosition(null); Top += position.Y - _startPoint.Y; Left += position.X - _startPoint.X; } }
以上的是拖移 Window的程式碼,那接下來是有關 Drag&Drop的東西。
也就是你可以把元件A拖拉到元件B,正常來說這是禁止的,如何讓他可以啟用呢?
首先,你要先將元件A的 AllowDrop設為 True。
接下來的動作很像上面的程式碼,例如宣告一個全域 Point和在 Constructor或 Window_Load處添加 MouseButtonEventHandler和 MouseEventHandler,不過這次要指定這兩個事件是元件A的。
this.[元件A].PreviewMouseLeftButtonDown += new MouseButtonEventHandler([元件A]_PreviewMouseLeftButtonDown); this.[元件A].PreviewMouseMove += new MouseEventHandler([元件A]_PreviewMouseMove);
接著一樣,實作 [元件A]_PreviewMouseLeftButtonDown和 [元件A]_PreviewMouseMove,[元件A]_PreviewMouseLeftButtonDown的內容和上面的一樣,[元件A]_PreviewMouseMove就有點不同了,程式碼如下:
private void Window_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { _startPoint = e.GetPosition(null); } private void Window_PreviewMouseMove(object sender, MouseEventArgs e) { if (e.LeftButton == MouseButtonState.Pressed) { Point position = e.GetPosition(null); if (Math.Abs(position.X - _startPoint.X) > SystemParameters.MinimumHorizontalDragDistance || Math.Abs(position.Y - _startPoint.Y) > SystemParameters.MinimumVerticalDragDistance) { DataObject data = new DataObject(System.Windows.DataFormats.Text.ToString(), "Drag&Drop"); DragDropEffects de = DragDrop.DoDragDrop([元件A], data, DragDropEffects.Move); } } }
DataObject 就是拖拉到元件B時,元件B獲得的東西,在此宣告為字串 "Drag&Drop"
參考至 http://blogs.msdn.com/b/jaimer/archive/2007/07/12/drag-drop-in-wpf-explained-end-to-end.aspx