.net - modales - ¿Cómo se puede mantener el tamaño de la ventana de WPF al contenido con un expansor después del cambio de tamaño?
ventana modal c# (5)
Tengo una ventana de WPF con SizeToContent="Height"
. Esta ventana contiene un <Expander />
que muestra una lista de actividad reciente. 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 importa los colores que hay allí para ayudarme a resolver esto):
Vista normal
texto alternativo http://www.deploylx.com/so/wpfexpander/Open.png
Colapsado
texto alternativo http://www.deploylx.com/so/wpfexpander/Closed.png
Cambia el tamaño al nuevo espacio
texto alternativo http://www.deploylx.com/so/wpfexpander/Expanded.png
Hasta ahora esto funciona genial. El problema surge cuando el <Expander />
se colapsa después de cambiar el tamaño de la ventana. En lugar de que la ventana vuelva a colapsar, la vista de lista simplemente se oculta:
Colapsado después de cambiar el tamaño
texto alternativo http://www.deploylx.com/so/wpfexpander/Collapsed.png
Mi intuición me dice que la Height
de la ventana se establece 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?
Corriente XAML:
<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 Colapsado del expansor y restablecer la propiedad 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.
Como descubrí en mi pregunta , establecer la altura en Double.NaN hace que se restablezca a la felicidad de 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.
Descubrí que poner el cuerpo de mi Ventana en una Vista y luego poner la vista como el único niño en la ventana resolvía problemas similares ...
No es la solución más deseable, pero parece funcionar.
Intente esto, esto debería ajustarse a sus necesidades: SizeToContent = "WidthAndHeight" Height = "Auto" Width = "Auto"
La forma más fácil de hacer frente es quitar el tamaño manual de la ecuación al establecer ResizeMode="NoResize"
en la ventana. Sin embargo , si tiene WindowStyle="None"
, noté que en Vista Aero esto hace que la ventana pierda por completo el "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 tiene dos objetivos conflictivos: 1.) siempre quiere SizeToContent="Height"
cuando contrae el control de expansión, 2.) quiere SizeToContent="Height"
cuando expande el control de expansión a menos que el usuario haya redimensionado manualmente la ventana (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 vuelto a SizeToContent="Height"
en su controlador de eventos colapsados.
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.