wake-up-neo.com

Holen Sie sich die Höhe/Breite von Window WPF

Ich habe den folgenden Code

<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">

Bei jedem Versuch, die Höhe/Breite zu erhalten, wird NaN oder 0.0 zurückgegeben

Kann mir jemand sagen, wie ich es bekommen kann?

Diese 2 Methoden funktionieren nicht

//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;
}

Die Anwendung wird nicht im Vollbildmodus ausgeführt.

9
Welsh King

Sie können die Breite und Höhe ermitteln, die das Fenster im Konstruktor haben soll, nachdem InitializeComponent ausgeführt wurde. Sie geben dann NaN nicht zurück. Die tatsächliche Höhe und Breite müssen warten, bis das Fenster angezeigt wird.

Wenn WindowState == Normal Sie können dies von Width / Height nach IntializeComponent() tun.

Wenn WindowState == Maximized Sie können die Bildschirmauflösung für diese mit erhalten 

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

Sie müssen versuchen, die ActualWidth/ActualHeight-Werte abzurufen, sobald das Fenster in der Benutzeroberfläche geladen ist. In Window_Loaded funktioniert das gut.

5
David Bekham

XAML

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

CS MainWindow () nach InitializeComponent ();

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

1.) Abonnieren Sie das Fenster für die Größenänderung im Code hinter:

this.SizeChanged += OnWindowSizeChanged;

2.) Verwenden Sie das SizeChangedEventArgs-Objekt 'e', ​​um die benötigten Größen zu ermitteln:

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;
}

Denken Sie daran, dass dies ein sehr allgemeiner Fall ist. Möglicherweise müssen Sie (möglicherweise auch nicht) einige Überprüfungen durchführen, um sicherzustellen, dass Sie Größenwerte von 0 haben.

Ich habe dies verwendet, um ein Listenfeld dynamisch anzupassen, wenn sich das Hauptfenster ändert. Alles, was ich wollte, war die Höhe dieses Steuerelements, um die gleiche Höhe zu ändern, in der sich die Höhe des Fensters ändert, so dass das übergeordnete "Bedienfeld" bei allen Fensteränderungen gleich bleibt.

Hier ist der Code dafür, genaueres Beispiel:

NOTEIch habe eine private Instanz-Ganzzahl namens 'resizeMode', die im Konstruktor hinter dem Window-Code auf 0 gesetzt ist. 

Hier ist der OnWindowSizeChanged-Ereignishandler:

    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 führt die Erstellung von Steuerelementen und Fenstern verzögert durch. Bis das Fenster zum ersten Mal angezeigt wird, ist es möglicherweise noch nicht durch das Layouting gegangen, also keine ActualWidth/ActualHeight. Sie können warten, bis das Fenster geladen ist, und dann die Eigenschaften abrufen oder noch besser diese Eigenschaften an ein Ziel binden, an dem Sie sie benötigen. Sie können das Layout auch über UpdateLayout() erzwingen.

Ich möchte nur hinzufügen: Versuchen Sie, die Größe der von der Größe abhängigen Logik zu minimieren, es ist fast immer möglich, sie zu vermeiden. Es sei denn, Sie schreiben natürlich ein Layout-Panel.

1
dowhilefor

Beachten Sie, dass wenn Sie Steuerelemente mit 100% von mit verwenden, diese bis zur Darstellung eine NaN-Größe haben

Sie können ActualHeigh oder ActualWidth nur überprüfen, wenn das Loaded-Ereignis ausgelöst wird. Versuchen Sie jedoch niemals, dies zu überprüfen, bevor die Windows-Steuerelemente erstellt werden. Vergessen Sie die Idee, dies im Konstruktor zu steuern.

Meiner Meinung nach ist der SizeChanged-Event der beste Ort, um diese Art von Dingen zu kontrollieren

1
Edheo