2009-05-15 17 views
14

tôi đang cố tạo một biểu mẫu C# WPF nơi tôi có thể kéo nó quanh màn hình bằng cách nhấp vào biểu tượng đó và di chuyển bằng chuột. các đặc điểm của biểu mẫu bao gồm hoàn toàn minh bạch và chỉ chứa một hình ảnh. Điều này đang được nói rằng phong cách cửa sổ là không có và nó không được hiển thị trong thanh tác vụ. Vì vậy, về cơ bản tất cả các bạn có thể thấy khi ứng dụng đang chạy là một hình ảnh nhỏ - và lý tưởng tôi muốn có thể kéo nó xung quanh màn hình nền nếu tôi nhấp và giữ nút chuột trái và di chuyển nó về.Kéo biểu mẫu WPF xung quanh màn hình máy tính để bàn

Có ai biết một cách đơn giản tôi có thể thực hiện điều này hoặc có tôi bỏ qua một xây dựng trong chức năng?

Cảm ơn.

+0

Cảm ơn rất nhiều, tôi đã chỉ tìm kiếm 2 ngày cho một câu trả lời như vậy :) –

Trả lời

18

Bạn có thể sử dụng phương thức Window.DragMove trong sự kiện di chuột xuống cửa sổ.

+0

bạn có thể cung cấp một exmaple mã như thế nào tôi có thể làm điều này? – Grant

+0

Có một ví dụ mã trong tài liệu hướng dẫn cho phương thức DragMove hiển thị chính xác những gì bạn đang cố gắng làm nhưng có nghĩa là 3 dòng dài - xử lý sự kiện MouseLeftButtonDown của cửa sổ, gọi phương thức DragMove trên cửa sổ. – Josh

20

câu trả lời trước đánh vào câu trả lời, nhưng đầy đủ các ví dụ là thế này:

private void Window_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
     if (e.LeftButton == MouseButtonState.Pressed) 
     { 
      DragMove(); 
     } 
    } 
+3

Chỉ cần sử dụng MouseLeftButtonDown và không cần kiểm tra –

1

Nếu bạn, như tôi, muốn có quyền kiểm soát nhiều hơn một chút về DoDragMove() - cho biết, để có cửa sổ luôn luôn ở trong biên giới của máy tính để bàn hiện tại, tôi đã thực hiện điều này.

Cách sử dụng:

public partial class MainWindow : Window 
{ 
    private WindowsDragger _dragger; 

    public MainWindow() 
    { 
     InitializeComponent(); 
     _dragger = new WindowsDragger(this); 
    } 
} 

Helper Class:

class WindowsDragger 
{ 
    private readonly Window _window; 
    private Point _dragDelta; 

    public WindowsDragger(Window window) 
    { 
     _window = window; 

     _window.MouseLeftButtonDown += MouseLeftButtonDown; 
     _window.MouseLeftButtonUp += MouseLeftButtonUp; 
     _window.MouseMove += MouseMove; 
    } 

    void MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     _dragDelta = e.GetPosition(_window); 
     Mouse.Capture(_window); 
    } 

    void MouseMove(object sender, MouseEventArgs e) 
    { 
     if (Equals(_window, Mouse.Captured)) 
     { 
      var pos = _window.PointToScreen(e.GetPosition(_window)); 
      var verifiedPos = CoerceWindowBound(pos - _dragDelta); 
      _window.Left = verifiedPos.X; 
      _window.Top = verifiedPos.Y; 
     } 
    } 

    void MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
    { 
     if (Equals(_window, Mouse.Captured)) 
      Mouse.Capture(null); 
    } 

    private Vector CoerceWindowBound(Vector newPoint) 
    { 
     // Snap to the current desktop border 
     var screen = WpfScreen.GetScreenFrom(_window); 
     var wa = screen.WorkingArea; 
     if (newPoint.X < wa.Top) newPoint.X = wa.Top; 
     if (newPoint.Y < wa.Left) newPoint.Y = wa.Left; 
     if (_window.Width + newPoint.X > wa.Right) newPoint.X = wa.Right - _window.Width; 
     if (_window.Height + newPoint.Y > wa.Bottom) newPoint.Y = wa.Bottom - _window.Height; 
     return newPoint; 
    } 
} 

nơi WpfScreen là từ đây: How to get the size of the current screen in WPF?

0

trên cửa sổ tải hoặc các sự kiện tải lưới bạn có thể sử dụng một đại biểu để kích hoạt Hàm DragMove().

'private void Grid_Loaded (object sender, RoutedEventArgs e) {

 this.MouseDown += delegate{DragMove();}; 

    }` 
3

Dưới đây là một số mã đơn giản để kéo các hình thức WPF xung quanh màn hình của bạn. Bạn có thể đã thấy một số mã này trên các bài đăng khác nhau, tôi vừa sửa đổi nó để phù hợp với nhu cầu kéo biểu mẫu WPF.

Hãy nhớ rằng chúng ta cần lấy vị trí biểu mẫu trên MouseLeftButtonDown, vì vậy chúng tôi có thể giữ con trỏ chuột được định vị trong cùng một vị trí trên biểu mẫu khi chúng tôi kéo nó xung quanh màn hình.

Bạn cũng sẽ cần phải thêm tài liệu tham khảo sau đây để có được vị trí chuột tương đối so với màn hình: System.Windows.Forms

Thuộc tính cần thiết:

private bool _IsDragInProgress { get; set; } 
private System.Windows.Point _FormMousePosition {get;set;} 

Code:

 protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) 
     { 
      this._IsDragInProgress = true; 
      this.CaptureMouse(); 
      this._FormMousePosition = e.GetPosition((UIElement)this); 
      base.OnMouseLeftButtonDown(e); 
     } 

     protected override void OnMouseMove(MouseEventArgs e) 
     { 
      if (!this._IsDragInProgress) 
       return; 

      System.Drawing.Point screenPos = (System.Drawing.Point)System.Windows.Forms.Cursor.Position; 
      double top = (double)screenPos.Y - (double)this._FormMousePosition.Y; 
      double left = (double)screenPos.X - (double)this._FormMousePosition.X; 
      this.SetValue(MainWindow.TopProperty, top); 
      this.SetValue(MainWindow.LeftProperty, left); 
      base.OnMouseMove(e); 
     } 

     protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e) 
     { 
      this._IsDragInProgress = false; 
      this.ReleaseMouseCapture(); 
      base.OnMouseLeftButtonUp(e); 
     } 
+0

Thật lạ, nhưng DragMove đơn giản() trong sự kiện MouseDown hoạt động tốt, cho đến khi người dùng di chuyển cửa sổ ở phía trên cùng của màn hình nền (khoảng 100px trên cùng).Với giải pháp của bạn, biểu mẫu của tôi có thể được đặt ở bất kỳ nơi nào người dùng muốn. Nếu ai muốn biết, WindowStyle dạng WPF của tôi là None, và hệ điều hành là Windows 7. –

+0

Điều này chỉ làm cho cửa sổ rung (hiện/ẩn nhanh) và nhảy khi nhắm mục tiêu một điều khiển cụ thể làm bề mặt kéo. Có lý do nào tại sao sử dụng Forms.Cursor.Position khác nhau trong một phương thức và e.GetPosition trong một phương thức khác không? – StingyJack

+0

@StingyJack biểu mẫu phải được nhắm mục tiêu làm bề mặt kéo, các nút điều khiển như không được phép kéo biểu mẫu. Khi sử dụng 'e.GetPosition' so với' System.Windows.Forms.Cursor.Position', bạn cần chuyển đổi 'System.Windows.Forms.Cursor.Position' thành' Point'. Nó sẽ trông như thế này 'this._FormMousePosition = new Point (System.Windows.Forms.Cursor.Position.X, System.Windows.Forms.Cursor.Position.Y);' Công việc này, NHƯNG hình thức WPF nhảy khi bạn bước đầu vào nó. 'this._FormMousePosition = e.GetPosition ((UIElement) cái này);' không gây ra dạng nhảy – TheMiddleMan