2009-05-15 14 views
14

私はそれをクリックしてマウスで移動することで画面上にドラッグすることができるC#WPFフォームを作成しようとしています。フォームの特性には、完全に透明であり、1つの画像のみを含むことが含まれる。これは、ウィンドウスタイルがnoneであり、タスクバーに表示されていないと言われています。だから、本質的には、アプリが実行されているときに見ることができるのはちょっとしたイメージです。マウスの左ボタンをクリックしたままにして移動すると理想的です。デスクトップの周りにWPFフォームをドラッグ

これを達成するための簡単な方法を知っている人はいますか?

ありがとうございました。

+0

ありがとう、私はちょうどそのような答えのための2日を見ていた:) –

答えて

18

ウィンドウのマウスダウンイベントでWindow.DragMoveメソッドを使用できます。

+0

あなたは私がこれを行う方法のコードexmapleを提供することができますか? – Grant

+0

DragMoveメソッドのドキュメントには、何をしようとしているのかを正確に示すコード例がありますが、文字通り3行です。ウィンドウのMouseLeftButtonDownイベントを処理し、ウィンドウ上でDragMoveメソッドを呼び出します。 – Josh

20

答えに打つ前の答えが、完全な例はこれです:あなたは、私のように、DoDragMove(約もう少しコントロールを持っているしたい場合)

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

MouseLeftButtonDownだけを使用し、チェックは不要です –

1

- 持っている、と言いますウィンドウは常に現在のデスクトップの境界にとどまり、私はこれを作った。

使用法:

public partial class MainWindow : Window 
{ 
    private WindowsDragger _dragger; 

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

ヘルパークラス:窓の負荷やグリッドloadイベントにHow to get the size of the current screen in WPF?

0

あなたがトリガするために、デリゲートを使用することができます。WpfScreenはこちらから

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; 
    } 
} 

DragMove()関数。ここで {

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

    }` 
3

`ます。private void Grid_Loaded(オブジェクト送信者、RoutedEventArgs e)は、画面の周りにWPFフォームをドラッグするためにいくつかの単純化されたコードです。別の投稿でこのコードの一部を見たことがあるかもしれませんが、WPFフォームをドラッグする必要性に合わせて変更しました。

MouseLeftButtonDownでフォームの位置を取得する必要があるので、マウスポインタをフォーム上の同じ場所に配置して、画面上でドラッグします。

あなたはまた、画面にマウス位置を取得するには、次の参照を追加する必要があります。必要なのSystem.Windows.Forms

プロパティ:

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

コード:

 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

MouseDownイベントのDragMove()は奇妙ですが、ユーザーがデスクトップの上端(トップ100px程度)にウィンドウを移動するまでは正常です。あなたのソリューションでは、私のフォームはユーザーが望む場所に配置することができます。もし誰かが知りたいのであれば、私のWPFフォームのWindowStyleはNoneで、OSはWindows 7です。 –

+0

これは、特定のコントロールをドラッグサーフェスとしてターゲット設定したときにウインドウをばたつき(表示/非表示)させます。 1つのメソッドで異なるForms.Cursor.Positionを使用し、別のメソッドでe.GetPositionを使用する理由はありますか? – StingyJack

+0

@StingyJackフォームをドラッグサーフェスとしてターゲティングする必要があります。ボタンなどのコントロールでフォームをドラッグできないようにする必要があります。 'e.GetPosition'と' System.Windows.Forms.Cursor.Position'を使用する限り、 'System.Windows.Forms.Cursor.Position'を' Point'に変換する必要があります。それはこのようなものに見えます。 'this._FormMousePosition = new Point(System.Windows.Forms.Cursor.Position.X、System.Windows.Forms.Cursor.Position.Y);'これは動作しますが、最初にクリックするとWPFフォームがジャンプします。 'this._FormMousePosition = e.GetPosition((UIElement)this);'フォームがジャンプすることはありません – TheMiddleMan

関連する問題