Как заставить элемент управления WPF изменять его размер в соответствии с содержимым в нем?
Размер управления Wpf для контента?
Ответ 1
Для большинства элементов управления вы устанавливаете высоту и ширину в Auto
в XAML, и размер будет соответствовать его содержимому.
В коде вы устанавливаете ширину/высоту на double.NaN
. Подробнее см. FrameworkElement.Width, в частности раздел "Замечания".
Ответ 2
У меня была такая проблема, когда я указал ширину моего окна, но имел высоту, равную Auto
. Ребенок DockPanel
установил для него VerticalAlignment
значение "Верх", а в окне было установлено значение "Вертикальное соответствие" для Версии, но Окно все равно будет намного выше, чем содержимое.
Используя Snoop, я обнаружил, что ContentPresenter
внутри Window (часть окна, а не то, что я там положил) имеет VerticalAlignment
, установленный в Stretch
и не может быть изменен без повторного просмотра всего окна
После многих разочарований я обнаружил свойство SizeToContent
- вы можете использовать это, чтобы указать, хотите ли вы, чтобы Окно имел размер по вертикали, по горизонтали или по обоим, в зависимости от размера содержимого - теперь все красиво оформляется, Я просто не могу поверить, что мне потребовалось столько времени, чтобы найти эту собственность!
Ответ 3
Если вы используете сетку или аналогичный компонент: В XAML убедитесь, что в элементах сетки определены Grid.Row и Grid.Column, и убедитесь, что они не имеют полей. Если вы использовали режим дизайнера или Expression Blend, он мог бы назначать поля по отношению ко всей сетке, а не к определенным ячейкам. Что касается размера ячейки, я добавляю дополнительную ячейку, которая заполняет остальную часть пространства:
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
Ответ 4
У меня был пользовательский элемент управления, который сидел на странице в свободной форме, а не ограничивался другим контейнером, а содержимое в пользовательском элементе не было автоматически изменено, а расширялось до полного размера того, что было передано пользователем.
Чтобы пользовательский элемент управления мог просто размер его содержимого, только для высоты, я поместил его в сетку с строкой, установленной для автоматического размера, например:
<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>