2009-05-15 18 views
14

J'essaie de créer un formulaire C# WPF où je peux le faire glisser sur l'écran en cliquant dessus et en bougeant avec la souris. les caractéristiques des formes comprennent une transparence totale et une seule image. Ceci étant dit, le style de la fenêtre est none et il n'est pas affiché dans la barre des tâches. Donc, tout ce que vous pouvez voir quand l'application est en cours d'exécution est une petite image - et idéalement, je veux être en mesure de le faire glisser sur le bureau si je clique sur le bouton gauche de la souris et le déplace.Faites glisser un formulaire WPF autour du bureau

Est-ce que quelqu'un sait d'une manière simple je peux accomplir ceci ou ai-je négligé une fonction de construction?

Merci.

+0

Merci beaucoup, je cherchais juste 2 jours pour une telle réponse :) –

Répondre

18

Vous pouvez utiliser la méthode Window.DragMove dans l'événement de souris vers le bas de la fenêtre.

+0

pourriez-vous fournir un code exmaple de la façon dont je pourrais le faire? – Grant

+0

Il existe un exemple de code dans la documentation de la méthode DragMove qui montre exactement ce que vous essayez de faire, mais il est littéralement de 3 lignes - gérer l'événement MouseLeftButtonDown de la fenêtre, appeler la méthode DragMove sur la fenêtre. – Josh

20

réponses précédentes ont frappé sur la réponse, mais l'exemple complet est le suivant:

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

Il suffit d'utiliser MouseLeftButtonDown et aucune vérification n'est nécessaire –

1

Si vous, comme moi, veulent avoir un peu plus de contrôle sur le DoDragMove() - dit, avoir la fenêtre toujours rester dans la bordure du bureau actuel, j'ai fait cela.

Utilisation:

public partial class MainWindow : Window 
{ 
    private WindowsDragger _dragger; 

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

Classe d'assistance:

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

où WpfScreen est d'ici: How to get the size of the current screen in WPF?

0

sur les fenêtres de charge ou l'événement de charge du réseau, vous pouvez utiliser un délégué pour déclencher la Fonction DragMove().

`(expéditeur d'objet, RoutedEventArgs e) privé vide Grid_Loaded {

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

    }` 
3

Voici un code simplifié pour faire glisser la forme WPF autour de votre écran. Vous avez peut-être vu une partie de ce code sur différents messages, je l'ai juste modifié pour répondre aux besoins de glisser le formulaire WPF. Gardez à l'esprit que nous devons saisir la position du formulaire sur le MouseLeftButtonDown, afin que nous puissions conserver le pointeur de la souris au même endroit sur le formulaire que nous le faisons glisser autour de l'écran.

Vous devrez également ajouter la référence suivante pour obtenir la position de la souris par rapport à l'écran: System.Windows.Forms

Propriétés Nécessaires:

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

C'est étrange, mais simple DragMove() dans l'événement MouseDown fonctionne très bien, jusqu'à ce que l'utilisateur déplace la fenêtre sur le dessus du bureau (environ 100px haut).Avec votre solution, mon formulaire peut être placé partout où l'utilisateur veut. Si quelqu'un veut savoir, WindowStyle de mon formulaire WPF est None, et OS est Windows 7. –

+0

Cela fait juste flotter la fenêtre (afficher/masquer rapidement) et sauter lorsque vous ciblez un contrôle spécifique comme une surface de traînée. Y a-t-il une raison pour utiliser différents Forms.Cursor.Position dans une méthode et e.GetPosition dans une autre? – StingyJack

+0

@StingyJack Le formulaire doit être ciblé comme une surface de glissement, les contrôles tels que les boutons ne doivent pas être autorisés à faire glisser le formulaire. En ce qui concerne l'utilisation de 'e.GetPosition' vs' System.Windows.Forms.Cursor.Position', vous devrez convertir 'System.Windows.Forms.Cursor.Position' en' Point'. Cela ressemblera à quelque chose comme ça. 'this._FormMousePosition = new Point (System.Windows.Forms.Cursor.Position.X, System.Windows.Forms.Cursor.Position.Y);' Cela fonctionne, MAIS le saut de formulaire WPF lorsque vous cliquez initialement dessus. 'this._FormMousePosition = e.GetPosition ((UIElement) this);' ne provoque pas le saut du formulaire – TheMiddleMan