2009-05-08 18 views
50

Tengo una ventana de WPF con SizeToContent="Height". Esta ventana contiene un <Expander /> que muestra una lista de actividades recientes. Lo que me gustaría es que cuando se expande el expansor, la ventana crezca en tamaño proporcionalmente. Cuando está oculta, la ventana vuelve a cambiar de tamaño proporcionalmente. Si se cambia el tamaño de la ventana, el expansor y su vista de lista contenida deberían crecer para usar el nuevo espacio. (No les importa los colores que hay allí para ayudarme a resolver esto):¿Cómo se puede mantener el tamaño de la ventana de WPF al contenido con un expansor después de cambiar el tamaño

Vista normal

alt text http://www.deploylx.com/so/wpfexpander/Open.png

colapsado

alt text http://www.deploylx.com/so/wpfexpander/Closed.png

redimensionada a la nueva espacio

alt text http://www.deploylx.com/so/wpfexpander/Expanded.png

Hasta ahora, esto funciona muy bien. El problema surge cuando el <Expander /> se contrae después de cambiar el tamaño de la ventana. En lugar de la ventana de colapsar de nuevo, la vista de lista es simplemente oculta:

se derrumbó después de cambiar el tamaño

alt text http://www.deploylx.com/so/wpfexpander/Collapsed.png

Mi intuición me dice que el Height de la ventana se está estableciendo cuando la ventana cambia de tamaño y por lo tanto, anula la propiedad SizeToContent. Entonces, ¿cómo puedo obtener la ventana para mantener su tamaño al comportamiento del contenido después de que ha sido redimensionado?

XAML actual:

<Window x:Class="DeployLX.Licensing.Nlm.Admin.v3.DashboardWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Dashboard" Width="504" SizeToContent="Height" Height="275"> 

    <DockPanel> 
    <Menu DockPanel.Dock="Top"> 
     <MenuItem Header="_File"> 
     <MenuItem Header="E_xit" Command="{Binding Path=CloseCmd}" /> 
     </MenuItem> 
    </Menu> 
    <Grid DockPanel.Dock="Top" Margin="8" ShowGridLines="True"> 
     <Grid.RowDefinitions> 
     <RowDefinition /> 
     <RowDefinition /> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
     <ColumnDefinition /> 
     <ColumnDefinition /> 
     </Grid.ColumnDefinitions> 

     <Grid Grid.RowSpan="2" Grid.Row="0" Grid.Column="0" Margin="0,0,8,0"> 
     <Rectangle Fill="Red" /> 
     <TextBlock>ActiveCount</TextBlock>   
     </Grid> 

     <Grid Grid.Row="0" Grid.Column="1" Margin="0,0,0,4"> 
     <Rectangle Fill="Green" /> 
     <TextBlock>Authorization</TextBlock> 
     </Grid> 
     <Grid Grid.Row="1" Grid.Column="1" Margin="0,4,0,0"> 
     <Rectangle Fill="Blue" /> 
     <TextBlock>Authorization</TextBlock> 
     </Grid>  
    </Grid> 
    <Expander Header="Recent Activity" Margin="8" IsExpanded="True"> 
     <ListView IsSynchronizedWithCurrentItem="True" MinHeight="100"> 
     <ListView.View> 
      <GridView> 
      <GridViewColumn Header="Status"/> 
      </GridView> 
     </ListView.View> 
     </ListView> 
    </Expander> 
    </DockPanel> 
</Window> 

ACTUALIZACIÓN: He intentado escuchar el evento colapsada del expansor y restablecer la propiedad de Windows SizeToContent. Esto casi funciona Causará que vuelva a colapsar la ventana, pero cuando se expanda nuevamente, volverá a la altura original de 100 píxeles. Si bien es posible almacenar y capturar esta información, huele malhumorado y propenso a errores.

Respuesta

1

Como descubrí en my question, establecer la altura en Double.NaN hace que se restablezca a la felicidad SizeToContent. Sin embargo, no sé si recordará el tamaño de su expansor. Puede intentar el control del tamaño de Kent para mover el comportamiento del tamaño al expansor en lugar de la ventana que lo contiene.

+0

Sí ... restablecer la propiedad SizeToContent tiene el mismo efecto básico, pero entonces se pierde ampliado estado :(. Aún trabajando en esto. –

+0

¿Alguien puede explicar lo que significa Tom? ¿Cómo se establece la altura o el ancho en Double.NaN? – DeveloperDan

+0

En respuesta a ciertos eventos, puede establecer Control.Height = Double.Nan; – Thomas

1

He descubierto que poner el cuerpo de mi ventana en una vista y luego poner la vista como el único niño en la ventana resuelto problemas similares ...

No es la solución más conveniente, pero parece trabajo.

57

Tienes que hacer que tu ventana no se pueda redimensionar si vas a usar SizeToContent. Además, no debe usar SizeToContent = "Height", y luego establecer una altura explícita. Piénselo: ¿cuál debería creer WPF por la altura de la ventana, la configuración del usuario o el contenido? No puede simplemente ir y venir entre los dos.

10

La manera más fácil de hacer frente es quitar el tamaño manual de la ecuación estableciendo ResizeMode="NoResize" en la ventana. Sin embargo, si tiene WindowStyle="None" me he dado cuenta de que en Vista Aero esto hace que la ventana se desprenda completamente del "cromo" y la ventana se ve incómoda. Además, esto es algo así como una excepción, ya que parece que quieres otorgarle al usuario capacidades de cambio de tamaño.

El problema es que usted tiene dos objetivos en conflicto: 1.) uno siempre quiere SizeToContent="Height" al derrumbarse el control de expansión, 2.) que desea SizeToContent="Height" al expandir el control de expansión menos el usuario ha cambiado el tamaño de la ventana manualmente (SizeToContent = "Manual"), en cuyo caso desea volver a la altura del manual del usuario.

Yikes. No creo que pueda evitar salvar la altura expandida usted mismo. WPF no recordará la altura del manual del usuario al expandirse una vez que haya retrocedido a SizeToContent="Height" en su controlador de eventos colapsados.

2

Prueba de esto, este debe adaptarse a sus necesidades: SizeToContent = "WidthAndHeight" height = width = "Auto" en "Auto"

Cuestiones relacionadas