2012-06-13 15 views
6

tengo el siguiente códigoObtener la altura/anchura de la ventana de WPF

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

Cualquier intento de obtener la altura/anchura de NaN o 0.0

¿Puede alguien decirme una manera de hacer las cosas?

Estos 2 métodos no funcionan

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

La aplicación no va a correr pantalla completa.

+3

¿Dónde está usted tratando este código? Si está intentando en el Constructor para la Ventana, no funcionará, de lo contrario, 'this.ActualHeight' le dará la altura real de la ventana – Habib

+0

, así que tengo que hacerlo después de window_loaded? buen punto ¿cómo puedo dimensionar una ventana que aún no existe :) –

+0

Exactamente, no se puede obtener el tamaño de la ventana si no está cargada – Habib

Respuesta

1

WPF realiza la creación de controles y ventanas de manera diferida. Por lo tanto, hasta que se visualice la ventana por primera vez, es posible que todavía no haya pasado por el diseño, por lo tanto, no ActualWidth/ActualHeight. Puede esperar hasta que se cargue la ventana y obtener las propiedades, o aún mejor vincular estas propiedades a un destino donde las necesite. También puede forzar el diseño a través del UpdateLayout().

Solo quiero agregar: intente minimizar la cantidad de lógica dependiente del tamaño, casi siempre es posible evitarla. A menos que esté escribiendo un panel de diseño, por supuesto.

6

Puede obtener el ancho y alto de la ventana en el constructor después de ejecutar InitializeComponent, no devolverán NaN, la altura y el ancho reales tendrán que esperar hasta que se visualice la ventana .

Cuando WindowState == Normal Puede hacer esto desde Width/Height después de IntializeComponent().

Cuando WindowState == Maximized Usted podría conseguir la resolución de la pantalla de éste con

System.Windows.SystemParameters.PrimaryScreenHeight; 
System.Windows.SystemParameters.PrimaryScreenWidth; 
+0

Este es el alto y el ancho de la pantalla principal del monitor, no necesariamente la pantalla actual. – user2481095

+0

La pregunta no se trata de obtener los valores de "pantalla actual", es una pregunta sobre por qué el operador recibe NaN en lugar de un valor. – Andy

5

Tienes que tratar de obtener los valores de ActualWidth/ActualHeight una vez que la ventana se carga en la interfaz de usuario. Hacerlo en Window_Loaded funciona bien.

1

1.) Suscríbete al evento tamaño de la ventana nueva en el código detrás:

this.SizeChanged += OnWindowSizeChanged; 

2.) Utilice el objeto SizeChangedEventArgs 'e' para obtener los tamaños que usted necesita:

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

Tenga en cuenta que este es un caso muy general, PUEDE (tampoco puede) tener que verificar para asegurarse de que tiene valores de tamaño de 0.

Utilicé esto para cambiar el tamaño de un cuadro de lista dinámicamente como principal cambios de ventana. Esencialmente, todo lo que quería era la altura de este control para cambiar la misma cantidad en la que cambia la altura de la ventana, por lo que su "panel" parental se ve coherente a lo largo de cualquier cambio de ventana.

Aquí está el código para eso, ejemplo más específico:

NOTA Tengo un número entero de instancia privada llamada 'resizeMode' que se establece en 0 en el constructor del código Ventana atrás.

Aquí es el controlador de eventos 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; 
    } 
+0

Esta debería ser la respuesta –

3

XAML

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

CS MainWindow() después de InitializeComponent();

Back_Image.Width = Grid1.Width; 
    Back_Image.Height = Grid1.Height; 
+1

Bienvenido a Desbordamiento de pila. Cuando publique una respuesta, ayude al afiche y a los futuros buscadores explicando en su respuesta cómo su respuesta resuelve su pregunta. – SnareChops

1

Tenga en cuenta que cuando se utiliza controles con 100% de con, tienen un tamaño NaN hasta que están siendo representados

Puede comprobar el ActualHeigh o ActualWidth justo cuando se dispara el evento Loaded, pero nunca intente verificarlo antes de que se creen los controles de Windows. Olvídate de la idea de controlar eso en el constructor.

en mi opinión, el mejor lugar para controlar este tipo de cosas es el evento SizeChanged

Cuestiones relacionadas