Précédent   Forum du club des développeurs et IT Pro > Dotnet > Développement Windows > Windows Presentation Foundation
Windows Presentation Foundation Forum d'entraide sur le développement d'applications Windows avec Windows Presentation Foundation
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 09/01/2013, 09h43   #1
NahMean
Membre régulier
 
Homme
Inscription : juin 2012
Messages : 63
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Eure (Haute Normandie)

Informations forums :
Inscription : juin 2012
Messages : 63
Points : 96
Points : 96
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 :
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.
NahMean est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 17h15   #2
infosam76
Membre Expert
 
Homme Eric Metz
Développeur informatique
Inscription : avril 2006
Messages : 515
Détails du profil
Informations personnelles :
Nom : Homme Eric Metz
Âge : 36
Localisation : Belgique

Informations professionnelles :
Activité : Développeur informatique
Secteur : Santé

Informations forums :
Inscription : avril 2006
Messages : 515
Points : 1 601
Points : 1 601
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 :
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;
   }
}
infosam76 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/01/2013, 08h40   #3
NahMean
Membre régulier
 
Homme
Inscription : juin 2012
Messages : 63
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Eure (Haute Normandie)

Informations forums :
Inscription : juin 2012
Messages : 63
Points : 96
Points : 96
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 !
NahMean est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2013, 08h47   #4
theMonz31
Expert Confirmé
 
Homme Geek forever
Chef de projet NTIC
Inscription : septembre 2006
Messages : 2 832
Détails du profil
Informations personnelles :
Nom : Homme Geek forever
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 : 2 832
Points : 3 823
Points : 3 823
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 :
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
Si vous avez un poste de Chef de projet Technique ou expert .Net, contactez-moi !!!
theMonz31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/01/2013, 10h17   #5
NahMean
Membre régulier
 
Homme
Inscription : juin 2012
Messages : 63
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Eure (Haute Normandie)

Informations forums :
Inscription : juin 2012
Messages : 63
Points : 96
Points : 96
Parfait, parfait, cela fonctionne à merveille !

Merci à tous du coup de main !
NahMean est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 22h26.


 
 
 
 
Partenaires

Hébergement Web