Comment puis-je créer un contrôle WPF pour modifier sa taille en fonction de son contenu?
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".
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é!
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>
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>