2009-05-08 7 views
50

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 je voudrais, c'est que lorsque l'expandeur est agrandi, la fenêtre grossit proportionnellement. Lorsque caché, la fenêtre se redimensionne proportionnellement. Si la fenêtre est redimensionnée, l'expanseur et sa vue de liste contenue devraient croître pour utiliser le nouvel espace. (Ne me dérange pas les couleurs là là pour me aider à comprendre cela):Comment gardez-vous la fenêtre WPF de taille au contenu d'un élargisseur après redimensionnez

Vue normale

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

Collapsed

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

redimensionnée à nouveau

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

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

Collapsed après Redimensionner

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

Mon intuition me dit que la Height de la fenêtre est en cours d'lorsque la fenêtre est redimensionnée et remplace donc la propriété SizeToContent. Alors, comment puis-je obtenir la fenêtre pour garder sa taille au comportement du contenu après qu'il a été redimensionné?

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> 

MISE À JOUR: J'ai essayé d'écouter l'événement Effondré de l'extension et la réinitialisation de la propriété de Windows SizeToContent. Cela fonctionne presque. Cela l'obligera à replier la fenêtre à nouveau, mais quand il sera à nouveau déployé, il reviendra à la hauteur initiale de 100 pixels. Alors qu'il est possible de stocker et de capturer cette information, il sent hacky et sujettes à des erreurs.

Répondre

1

Comme je l'ai découvert dans my question, réglage de la hauteur à Double.NaN il provoque pour rétablir le bonheur SizeToContent. Je ne sais pas si elle 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 contenant.

+0

Ouais ... réinitialiser la propriété SizeToContent a le même effet de base, mais alors vous perdez étendu : –

+0

Est-ce que quelqu'un peut expliquer ce que Tom veut dire? Comment définir la hauteur ou la largeur de Double.NaN? – DeveloperDan

+0

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

1

J'ai trouvé que mettre le corps de ma fenêtre dans une vue, puis mettre le point de vue que l'enfant seul dans la fenêtre résoudre des problèmes similaires ...

pas la solution la plus souhaitable, mais il semble travail.

57

Vous devez faire votre fenêtre non redimensionnable si vous allez utiliser SizeToContent. En outre, vous ne devez pas utiliser SizeToContent = "Height", puis définissez une hauteur explicite. Pensez-y: que devrait-on penser de WPF pour la hauteur de la fenêtre, le réglage de l'utilisateur ou le contenu? Il ne peut pas simplement basculer entre les deux.

10

La méthode la plus simple consiste à supprimer le redimensionnement manuel de l'équation en définissant ResizeMode="NoResize" sur la fenêtre. Cependant, si vous avez WindowStyle="None", j'ai remarqué que sur Vista Aero cela provoque la fenêtre à complètement supprimer le "chrome" et la fenêtre semble maladroite. En outre, c'est un peu un flic car il semble que vous voulez donner à l'utilisateur des capacités de redimensionnement.

Le problème est que vous avez deux objectifs contradictoires: 1.) que vous voulez toujours SizeToContent="Height" lors de l'effondrement du contrôle d'extension, 2.) que vous voulez SizeToContent="Height" lors de l'extension du contrôle d'expansion à moins l'utilisateur a redimensionné manuellement la fenêtre (SizeToContent = "Manuel"), auquel cas vous souhaitez revenir à la hauteur du manuel de l'utilisateur.

Yikes. Je ne pense pas que vous puissiez vous déplacer en sauvant la taille agrandie vous-même. WPF ne se souvient pas de la hauteur manuelle de l'utilisateur lors de l'expansion une fois que vous êtes revenu à SizeToContent="Height" dans votre gestionnaire d'événements réduit.

2

Essayez ceci, cela devrait répondre à vos besoins: SizeToContent = « WidthAndHeight » height = « Auto » width = « Auto »

Questions connexes