IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

Obtenir une fenêtre non-déplaçable C# WPF


Sujet :

Windows Presentation Foundation

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations forums :
    Inscription : Juin 2012
    Messages : 168
    Points : 397
    Points
    397
    Par défaut Obtenir une fenêtre non-déplaçable C# WPF
    Bonjour,

    Dans mon projet C# WPF, j'aimerais avoir sur ma fenêtre principale une option permettant de la rendre non-déplaçable par l'utilisateur, tout en gardant la barre de titre.

    J'ai chercher quelques solution, dont celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
     
    private Point _initialLocation = Point.Empty;
            public Form1()
            {
                InitializeComponent();
                this.Activated += new EventHandler( Form1_Activated );         
                this.LocationChanged += new EventHandler( Form1_LocationChanged );
            }
     
            void Form1_Activated( object sender, EventArgs e )
            {
                _initialLocation = this.Location;
            }
     
            void Form1_LocationChanged( object sender, EventArgs e )
            {
                if (this.Location != _initialLocation && _initialLocation != Point.Empty)
                {
                    Location = _initialLocation;
                }
            }
    Sauf que, avec le WPF, je n'est pas accès a "this.Location".


    Merci de m'indiquer si une solution existe, ou vers quoi je doit me tourner pour que cela fonctionne.

    Cordialement, NahMean.

  2. #2
    Membre expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Points : 3 304
    Points
    3 304
    Par défaut
    Bonjour,

    ceci fonctionne plus ou moins sur le même principe que votre code. Mais j'ai un très léger "flash" lorsqu'on essaie de déplacer la fenêtre. Peut être existe t'il une solution plus propre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    public partial class MainWindow : Window
    {
       private double _PosX;
       private double _PosY;
     
       public MainWindow()
       {
          InitializeComponent();
       }
     
       private void Window_LocationChanged(object sender, EventArgs e)
       {
          if (_PosX != this.Left || _PosY != this.Top)
          {
             this.Left = _PosX;
             this.Top = _PosY;
          }
       }
     
       private void Window_Loaded(object sender, RoutedEventArgs e)
       {
          _PosX = this.Left;
          _PosY = this.Top;
       }
    }
    Articles sur les technologies .NET

    Une réponse vous a aidé ? utilisez le bouton

    Votre problème est résolu ? utilisez le bouton

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations forums :
    Inscription : Juin 2012
    Messages : 168
    Points : 397
    Points
    397
    Par défaut
    Merci de votre aide, c'est vrai que l'on a un petit flash lors du déplacement de la fenêtre, je constate aussi que lorsque ma fenêtre est en plein écran et que je tente de la déplacer, une bordure a droite de mon écran s'affiche (quelques millimètre).

    En attendant,c'est quand même une bonne solution !

  4. #4
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    salut

    j'ai pas le code sous la main mais le plus simple est surement d'intercepter les messages arrivant dans la pompe à message de l'application car les informations qui arrivent sur la barre du "haut" et qui s'appelle la "Non-Client area" ne sont pas accessibles directement en WPF (comme en Winform).

    Donc, en interceptant ces messages, tu dois pouvoir bloquer le déplacement de la fenêtre !!!

    En winform, on fait un override de WndProc pour gérer celà.

    avec un code de ce genre, tu devrais y arriver :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    private void Window_Loaded(object sender, RoutedEventArgs e)
            {
                WindowInteropHelper helper = new WindowInteropHelper(this);
                HwndSource source = HwndSource.FromHwnd(helper.Handle);
                source.AddHook(WndProc);    
            }
     
            const int WM_SYSCOMMAND = 0x0112;
            const int SC_MOVE = 0xF010;
     
            private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
            {
     
                switch (msg)
                {
                    case WM_SYSCOMMAND:
                        int command = wParam.ToInt32() & 0xfff0;
                        if (command == SC_MOVE)
                        {
                            handled = true;
                        }
                        break;
                    default:
                        break;
                }
                return IntPtr.Zero;
            }        
    }
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations forums :
    Inscription : Juin 2012
    Messages : 168
    Points : 397
    Points
    397
    Par défaut
    Parfait, parfait, cela fonctionne à merveille !

    Merci à tous du coup de main !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Rendre une fenêtre non-redimensionnable
    Par TSalm dans le forum Windows
    Réponses: 10
    Dernier message: 15/11/2007, 10h57
  2. Réponses: 2
    Dernier message: 16/03/2007, 09h13
  3. [C# 2.0] Créer une fenêtre non redimensionnable
    Par sqlnoob dans le forum Windows Forms
    Réponses: 4
    Dernier message: 26/06/2006, 11h22
  4. Réponses: 4
    Dernier message: 13/06/2004, 15h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo