web-dev-qa-db-fra.com

Wpf contrôle la taille du contenu?

Comment puis-je créer un contrôle WPF pour modifier sa taille en fonction de son contenu?

62
Shimmy

Pour la plupart des contrôles, vous définissez sa hauteur et sa largeur sur Auto dans le XAML, et il sera dimensionné pour s'adapter à son contenu.

Dans le code, vous définissez la largeur/hauteur sur double.NaN. Pour plus de détails, voir FrameworkElement.Width , en particulier la section "remarques".

84
Reed Copsey

J'ai eu un problème comme celui-ci où j'avais spécifié la largeur de ma fenêtre, mais j'avais la hauteur définie sur Auto. L'enfant DockPanel avait son VerticalAlignment défini sur Top et la fenêtre avait son VerticalContentAlignment défini sur Top, mais la fenêtre serait toujours beaucoup plus grande que le contenu.

En utilisant Snoop, j'ai découvert que le ContentPresenter dans la fenêtre (une partie de la fenêtre, pas quelque chose que j'avais mise là) a son VerticalAlignment réglé sur Stretch et ne peut pas être changé sans remodeler la fenêtre entière!

Après beaucoup de frustration, j'ai découvert la propriété SizeToContent - vous pouvez l'utiliser pour spécifier si vous souhaitez que la fenêtre soit dimensionnée verticalement, horizontalement ou les deux, en fonction de la taille du contenu - tout est maintenant bien dimensionné, Je n'arrive pas à croire qu'il m'a fallu si longtemps pour trouver cette propriété!

29
TabbyCool

Si vous utilisez la grille ou un composant similaire: Dans XAML, assurez-vous que les éléments de la grille ont défini Grid.Row et Grid.Column, et assurez-vous qu'ils n'ont pas de marges. Si vous avez utilisé le mode concepteur ou Expression Blend, il pourrait avoir affecté des marges par rapport à la grille entière plutôt qu'à des cellules particulières. Quant au dimensionnement des cellules, j'ajoute une cellule supplémentaire qui remplit le reste de l'espace:

    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
1
Amadeusz Wieczorek

J'avais un contrôle utilisateur qui était assis sur la page sous une forme libre, non contraint par un autre conteneur, et le contenu du contrôle utilisateur ne se redimensionnait pas automatiquement mais se développait à la taille complète de ce que le contrôle utilisateur avait été remis.

Pour que le contrôle utilisateur redimensionne simplement son contenu, pour la hauteur uniquement, je l'ai placé dans une grille avec une ligne définie sur la taille automatique, comme ceci:

<Grid Margin="0,60,10,200">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <controls1:HelpPanel x:Name="HelpInfoPanel"
                         Visibility="Visible"
                         Width="570"
                         HorizontalAlignment="Right"
                         ItemsSource="{Binding HelpItems}"
                         Background="#FF313131" />
</Grid>
1
ΩmegaMan