56 votes

Comment maintenir la taille de la fenêtre WPF au niveau du contenu avec un Expander après redimensionnement ?

J'ai une fenêtre WPF avec SizeToContent="Height" . Cette fenêtre contient un <Expander /> qui affiche une liste des activités récentes. Ce que j'aimerais, c'est que lorsque l'expandeur est étendu, la fenêtre s'agrandisse proportionnellement. Lorsqu'il est masqué, la fenêtre se redimensionne à nouveau proportionnellement. Si la fenêtre est redimensionnée, l'expandeur et la liste qu'il contient doivent s'agrandir pour utiliser le nouvel espace. (ne faites pas attention aux couleurs qui sont là pour m'aider à comprendre) :

Vue normale

texte alternatif http://www.deploylx.com/so/wpfexpander/Open.png

Effondré

texte alternatif http://www.deploylx.com/so/wpfexpander/Closed.png

Redimensionné au nouvel espace

texte alternatif http://www.deploylx.com/so/wpfexpander/Expanded.png

Jusqu'à présent, cela fonctionne très bien. Le problème survient lorsque le <Expander /> se replie après le redimensionnement de la fenêtre. Plutôt que de réduire à nouveau la fenêtre, la vue de liste est simplement cachée :

Effondré après le redimensionnement

texte alternatif http://www.deploylx.com/so/wpfexpander/Collapsed.png

Mon intuition me dit que le Height de la fenêtre est définie lorsque la fenêtre est redimensionnée et remplace donc l'option SizeToContent propriété. Alors, comment puis-je faire en sorte que la fenêtre conserve son comportement de taille par rapport au contenu après avoir été redimensionnée ?

XAML actuel :

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

UPDATE : J'ai essayé d'écouter l'événement "Collapsed" de l'expandeur et de réinitialiser les paramètres de Windows. SizeToContent propriété. Cela fonctionne presque. La fenêtre se referme, mais lorsqu'elle est à nouveau agrandie, elle retrouve sa hauteur initiale de 100 pixels. Bien qu'il soit possible de stocker et de capturer cette information, cela sent le bricolage et est sujet à des erreurs.

66voto

Paul Betts Points 41354

Vous devez rendre votre fenêtre non redimensionnable si vous souhaitez utiliser SizeToContent. De même, vous ne devez pas utiliser SizeToContent="Height", puis définir une hauteur explicite. Réfléchissez-y : à qui WPF doit-il faire confiance pour la hauteur de la fenêtre, au paramètre de l'utilisateur ou au contenu ? Il ne peut pas faire l'aller-retour entre les deux.

11voto

Rob Sobers Points 5528

Le moyen le plus simple de s'en sortir est d'éliminer le redimensionnement manuel de l'équation en définissant les paramètres suivants ResizeMode="NoResize" sur la fenêtre. Cependant si vous avez WindowStyle="None" J'ai remarqué qu'avec Vista Aero, la fenêtre perd complètement son "chrome" et a l'air bizarre. De plus, c'est un peu une dérobade puisqu'il semble que vous vouliez donner à l'utilisateur des capacités de redimensionnement.

Le problème est que vous avez deux objectifs contradictoires : 1.) vous voulez toujours SizeToContent="Height" lors de la réduction de la commande de l'expandeur, 2.) vous voulez SizeToContent="Height" lors de l'expansion du contrôle de l'expandeur sauf si l'utilisateur a redimensionné manuellement la fenêtre (SizeToContent="Manual"), auquel cas vous souhaitez revenir à la hauteur manuelle de l'utilisateur.

Oups. Je ne pense pas qu'il soit possible de sauvegarder la hauteur étendue par vous-même. WPF ne se souviendra pas de la hauteur manuelle de l'utilisateur lors de l'expansion, une fois que tu seras retourné en mode SizeToContent="Height" dans le gestionnaire de l'événement "collapsed".

10voto

Marcel Kuster Points 101

Essayez ceci, ça devrait correspondre à vos besoins :

<Window ...
        SizeToContent="WidthAndHeight"  
        Height="Auto" 
        Width="Auto">

0 votes

Fonctionne comme un charme pour la grille avec datagrid à l'intérieur. Mais l'utilisateur peut toujours changer la taille de la fenêtre. C'est bien, mais après l'avoir fait, la taille ne s'ajuste plus automatiquement.

2voto

John Weldon Points 19132

J'ai trouvé que mettre le corps de ma fenêtre dans une vue et ensuite mettre la vue comme seul enfant dans la fenêtre a résolu des problèmes similaires...

Ce n'est pas la solution la plus souhaitable, mais elle semble fonctionner.

1voto

Thomas Points 1902

Comme je l'ai découvert dans ma question Si vous définissez la hauteur à Double.NaN, vous serez réinitialisé au bonheur de SizeToContent. Je ne sais pas s'il se souviendra de la taille de votre expandeur. Vous pouvez essayer le contrôle Resizer de Kent pour déplacer le comportement de dimensionnement vers l'expandeur plutôt que vers la fenêtre qui le contient.

0 votes

Oui... la réinitialisation de la propriété SizeToContent a le même effet de base mais on perd l'état étendu :(. Je travaille toujours sur ce sujet.

0 votes

Quelqu'un peut-il expliquer ce que Tom veut dire ? Comment définir la hauteur ou la largeur à Double.NaN ?

0 votes

En réaction à certains événements, vous pourriez définir Control.Height = Double.Nan ;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X