132 votes

Rendre la fenêtre WPF déplaçable, quel que soit l'élément sur lequel on clique.

Ma question est double, et j'espère qu'il y a des solutions plus faciles pour les deux, fournies par WPF plutôt que les solutions standard de WinForms (que Christophe Geers a fourni, avant que je ne fasse cette clarification).

Tout d'abord, existe-t-il un moyen de rendre la fenêtre glissante sans capturer et traiter les événements de clics de souris + glissades ? Je veux dire que la fenêtre peut être glissée par la barre de titre, mais si je configure une fenêtre qui n'en a pas et que je veux quand même pouvoir la faire glisser, y a-t-il un moyen de rediriger les événements vers ce qui gère le glissement de la barre de titre ?

Deuxièmement, existe-t-il un moyen d'appliquer un gestionnaire d'événement à tous les éléments de la fenêtre ? Par exemple, faire en sorte que la fenêtre puisse être glissée, quel que soit l'élément sur lequel l'utilisateur clique et glisse. Évidemment sans ajouter le gestionnaire manuellement, à chaque élément. Il suffit de le faire une fois quelque part ?

3voto

loi.efy Points 61

Tout cela est nécessaire !

private void UiElement_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.LeftButton == MouseButtonState.Pressed)
        {
            if (this.WindowState == WindowState.Maximized) // In maximum window state case, window will return normal state and continue moving follow cursor
            {
                this.WindowState = WindowState.Normal;
                Application.Current.MainWindow.Top = 3;// 3 or any where you want to set window location affter return from maximum state
            }
            this.DragMove();
        }
    }

2voto

Christophe Geers Points 4595

Il est possible de glisser-déposer un formulaire en cliquant n'importe où sur le formulaire, et pas seulement sur la barre de titre. C'est pratique si vous avez un formulaire sans bordure.

Cet article sur CodeProject démontre une solution possible pour mettre en œuvre cette solution :

http://www.codeproject.com/KB/cs/DraggableForm.aspx

En fait, un descendant du type de formulaire est créé, dans lequel les événements de descente, de montée et de déplacement de la souris sont traités.

  • Souris vers le bas : mémoriser la position
  • Déplacement de la souris : enregistrer le nouvel emplacement
  • Souris vers le haut : positionner le formulaire au nouvel emplacement

Et voici une solution similaire expliquée dans un tutoriel vidéo :

http://www.youtube.com/watch?v=tJlY9aX73Vs

Je ne voudrais pas autoriser le déplacement du formulaire lorsqu'un utilisateur clique sur un contrôle dudit formulaire. Les utilisateurs obtiennent des résultats différents lorsqu'ils cliquent sur des contrôles différents. Si mon formulaire se met soudain à bouger parce que j'ai cliqué sur une liste déroulante, un bouton, une étiquette, etc.

0 votes

Bien sûr, il ne bougerait pas en cliquant sur un contrôle, mais si vous cliquiez et glissiez, ne vous attendriez-vous pas à ce que le formulaire bouge ? Je veux dire qu'on ne s'attendrait pas à ce qu'un bouton ou une boîte de liste se déplace par exemple si on le clique et le fait glisser, le mouvement du formulaire est une attente naturelle si vous essayez de cliquer et de faire glisser un bouton dans le formulaire, je pense.

0 votes

Je suppose que ce ne sont que des goûts personnels. Quoi qu'il en soit, .... les contrôles devront gérer les mêmes événements de souris. Vous devrez notifier ces événements au formulaire parent, car ils n'apparaissent pas dans les bulles.

0 votes

De plus, bien que je sois conscient de la solution WinForms à ce problème, j'espérais qu'un moyen plus facile d'exister dans WPF, je suppose que je devrais rendre cela plus clair dans la question (pour l'instant, c'est juste une balise).

1voto

<Window
...
WindowStyle="None" MouseLeftButtonDown="WindowMouseLeftButtonDown"/>
<x:Code>
    <![CDATA[            
        private void WindowMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            DragMove();
        }
    ]]>
</x:Code>

source

0voto

dexiang Points 27

La méthode la plus utile, tant pour WPF que pour Windows form, exemple WPF :

    [DllImport("user32.dll")]
    public static extern IntPtr SendMessage(IntPtr hWnd, int wMsg, int wParam, int lParam);

    public static void StartDrag(Window window)
    {
        WindowInteropHelper helper = new WindowInteropHelper(window);
        SendMessage(helper.Handle, 161, 2, 0);
    }

0voto

mail278 Points 1

Ajoutez ceci à votre style de fenêtre (je pense que les propriétés sont explicites)

<Setter Property="WindowChrome.WindowChrome">
  <Setter.Value>
    <WindowChrome GlassFrameThickness="0" ResizeBorderThickness="3" CornerRadius="0" CaptionHeight="40" />
  </Setter.Value>
</Setter>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X