Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Cyril Sansus

WPF, Interfaces Utilisateurs et .NET
[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 :
Posted: mercredi 30 septembre 2009 07:29 par Vko
Classé sous :

Commentaires

Thomas LEBRUN a dit :

# septembre 30, 2009 09:24

JeremyJeanson a dit :

Tu as été 10 s plus rapide que moi Thomas ;)

# septembre 30, 2009 09:27

Vko a dit :

En fait j'ai déjà modifié mon post pour mettre la solution simple.

L'objectif principal est surtou de faire découvrir le Thumb qui peut avoir plusieurs atouts dans des cas beaucoup plus divers.

je ferrais une ptt application pour illustrer ca.

# septembre 30, 2009 09:33
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Kinect 1.5 is out ! par Cyril Sansus le 05-21-2012, 17:47

- Les actualités de la semaine sur c2i.fr (14 mai - 20 mai) par Richard Clark le 05-21-2012, 08:50

- Reactive Extensions : Consommer des services avec Rx Partie 3, les pièges à éviter par Léonard Labat le 05-20-2012, 23:45

- SharePoint Blog Site, problème d’archives par Le Blog (Vert) d'Arnaud JUND le 05-20-2012, 13:09

- Soirée ALT.NET Mai - 3 présentations par #Rui le 05-18-2012, 11:59

- [ #SharePoint 2010][ #SQLServer 2012] AlwaysOn pour SharePoint (2/4) : Configuration (2e partie)… par Le blog de Patrick [MVP SharePoint] le 05-18-2012, 11:31

- Team Foundation Server 11: tous les trésors cachés du site d’équipe par Philess le 05-16-2012, 19:01

- [PowerShell 3] Télécharger et installer la documentation en ligne par Blog de SPBrouillet (Pierrick BROUILLET) le 05-16-2012, 17:36

- [#SharePoint 2010][#SQLServer 2012] AlwaysOn pour SharePoint (1/4) : Configuration (1ère partie)… par Le blog de Patrick [MVP SharePoint] le 05-16-2012, 12:10

- Job Day @MIC Brussels - .Net Developers on Mobile applications par Le Blog (Vert) d'Arnaud JUND le 05-15-2012, 20:26