[WPF] Déplacer des Windows sans bordure
WPF offre la possibilité de masquer la bordure et la barre de titre. Parfait pour créer des fenêtres arrondies, rondes, etc. Mais attention sans barre de titre, il n’est plus possible de déplacer une fenêtre !! “Don’t panic”, il existe un contrôle très sympas en WPF qui va nous aider : le Thumb.
Obtenir une fenêtre ronde en WPF
Pour créer une fenêtre ronde en WPF, il y a deux choses à faire. Premièrement il faut modifier deux propriétés de la fenêtre afin de masquer la barre de titre. Les propriétés en question sont : AllowsTransparency et WindowsStyle.
Deuxièmement, il faut modifier le Template de base de la fenêtre en remplaçant la bordure par défaut par une ellipse. On peut réaliser tout ceci via le style (version très épurée) de la fenêtre :
<Window.Style>
<Style TargetType="{x:Type Window}">
<Setter Property="AllowsTransparency" Value="True" />
<Setter Property="WindowStyle" Value="None" />
<Setter Property="Background" Value="Black" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Window}">
<Grid>
<Ellipse Fill="{TemplateBinding Background}"
Stroke="{TemplateBinding BorderBrush}"
StrokeThickness="{TemplateBinding BorderThickness}" />
<ContentPresenter />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Style>
On obtient ainsi une “jolie” fenêtre ronde mais il n’est pas possible de la déplacer (A noter que Alt+F4 permet de fermer la fenêtre).
Déplacer la fenêtre
La solution la plus simple (merci Lionel) est d’ajouter un élément quelconque et de se brancher sur l’évènement MouseLeftButtonDown. Ensuite il suffit d’utiliser la méthode DragMove de la fenêtre … et hop magie !
Le code XAML :
<Grid>
<Rectangle Width="50" Height="50" Fill="White"
MouseLeftButtonDown="Rectangle_MouseLeftButtonDown"/>
</Grid>
Le code C# :
private void Rectangle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
DragMove();
}
Autre possibilité, utiliser le controle Thumb.
Le contrôle Thumb est un contrôle prévu pour les opérations de déplacement (Drag&Drop par exemple). Il permet de s’abstraire de la gestion de la souris (capture et calcul du delta de déplacement) et fournit directement un évènement DragDelta qui est levé à chaque fois que vous faites du drag au niveau du Thumb … bon là je suis pas clair, mieux vaut le code.
Voici dons le code XAML et CS qui permettra de mettre en place le Thumb :
<Grid>
<Thumb Width="50" Height="50" DragDelta="Thumb_DragDelta" />
</Grid>
private void Thumb_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e)
{
this.Left += e.HorizontalChange;
this.Top += e.VerticalChange;
}
Hop, vous obtenez une magnifique fenêtre ronde et déplaçable.
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :