web-dev-qa-db-fra.com

Obtenir la hauteur/largeur de la fenêtre WPF

J'ai le code suivant

<Window x:Class="Netspot.DigitalSignage.Client.MainWindow"
        xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
        Title="MainWindow" WindowStyle="SingleBorderWindow" 
        WindowStartupLocation="CenterScreen"
        WindowState="Normal" Closing="Window_Closing">

Toute tentative pour obtenir le retour hauteur/largeur NaN ou 0.0

Quelqu'un peut-il me dire un moyen de l'obtenir?

Ces 2 méthodes ne fonctionnent pas

//Method1
var h = ((System.Windows.Controls.Panel)Application.Current.MainWindow.Content).ActualHeight;
var w = ((System.Windows.Controls.Panel)Application.Current.MainWindow.Content).ActualWidth;

//Method2
double dWidth = -1;
double dHeight = -1;
FrameworkElement pnlClient = this.Content as FrameworkElement;
if (pnlClient != null)
{
     dWidth = pnlClient.ActualWidth;
     dHeight = pnlClient.ActualWidth;
}

L'application ne fonctionnera pas en plein écran.

9
Welsh King

Vous pouvez obtenir la largeur et la hauteur que la fenêtre était censée être dans le constructeur après que InitializeComponent ait été exécuté. Ils ne renverront pas NaN. La hauteur et la largeur réelles devront attendre que la fenêtre soit affichée.

Quand WindowState == Normal Vous pouvez le faire à partir de Width / Height après IntializeComponent().

Quand WindowState == Maximized Vous pourriez obtenir la résolution d'écran de celui-ci avec 

System.Windows.SystemParameters.PrimaryScreenHeight;
System.Windows.SystemParameters.PrimaryScreenWidth;
9
Andy

Vous devez essayer d'obtenir les valeurs ActualWidth/ActualHeight une fois la fenêtre chargée dans l'interface utilisateur. Le faire dans Window_Loaded fonctionne bien.

5
David Bekham

XAML

<Grid x:Name="Grid1">
      <Image x:Name="Back_Image" HorizontalAlignment="Left" VerticalAlignment="Top"/>
</Grid>

CS MainWindow () après InitializeComponent ();

    Back_Image.Width = Grid1.Width;
    Back_Image.Height = Grid1.Height;
3
Vilintritenmert

1.) Abonnez-vous à l'événement window re size dans le code derrière:

this.SizeChanged += OnWindowSizeChanged;

2.) Utilisez l'objet SizeChangedEventArgs 'e' pour obtenir les tailles dont vous avez besoin:

protected void OnWindowSizeChanged(object sender, SizeChangedEventArgs e)
{
    double newWindowHeight = e.NewSize.Height;
    double newWindowWidth = e.NewSize.Width;
    double prevWindowHeight = e.PreviousSize.Height;
    double prevWindowWidth = e.PreviousSize.Width;
}

Gardez à l'esprit que c'est un cas très général, vous POUVEZ (vous ne pouvez pas non plus) faire quelques vérifications pour vous assurer que vous avez des valeurs de taille de 0.

J'ai utilisé cela pour redimensionner une zone de liste dynamiquement lorsque la fenêtre principale change. Tout ce que je voulais, c’était que la hauteur de ce contrôle change de la même manière que la hauteur de la fenêtre, de sorte que le «panneau» parent paraisse cohérent dans tous les changements de fenêtre.

Voici le code pour cela, exemple plus spécifique:

NOTEJ'ai un entier d'instance privé appelé 'resizeMode' qui est défini sur 0 dans le constructeur, derrière le code Window. 

Voici le gestionnaire d'événement OnWindowSizeChanged:

    protected void OnWindowSizeChanged (object sender, SizeChangedEventArgs e)
    {
        if (e.PreviousSize.Height != 0)
        {
            if (e.HeightChanged)
            {
                double heightChange = e.NewSize.Height - e.PreviousSize.Height;
                if (lbxUninspectedPrints.Height + heightChange > 0)
                {
                    lbxUninspectedPrints.Height = lbxUninspectedPrints.Height + heightChange;
                }
            }
        }
        prevHeight = e.PreviousSize.Height;
    }
2
kformeck

WPF crée des contrôles et des fenêtres de manière différée. Ainsi, tant que la fenêtre n’est pas affichée pour la première fois, elle n’a peut-être pas encore été mise en page, donc pas de variable ActualWidth/ActualHeight. Vous pouvez attendre que la fenêtre soit chargée et obtenir les propriétés à ce moment-là, ou encore mieux lier ces propriétés à une cible où vous en avez besoin. Vous pouvez également forcer la mise en page via UpdateLayout().

Je veux juste ajouter: essayez de minimiser la quantité de logique dépendante de la taille, il est presque toujours possible de l'éviter. Sauf si vous écrivez un panneau de présentation bien sûr.

1
dowhilefor

Notez que lorsque vous utilisez des contrôles avec 100% de avec, ils ont une taille de NaN jusqu'à ce qu'ils soient représentés

Vous pouvez vérifier ActualHeigh ou ActualWidth juste au moment où l'événement Loaded est déclenché, mais ne jamais essayer de le vérifier avant la création des contrôles Windows. Oubliez l'idée de contrôler cela dans le constructeur.

À mon avis, l'événement The SizeChanged est le meilleur endroit pour contrôler ce genre de choses.

1
Edheo