Wpf контролировать размер содержимого? - PullRequest
60 голосов
/ 17 ноября 2009

Как сделать элемент управления WPF, чтобы изменить его размер в соответствии с содержимым в нем?

Ответы [ 4 ]

83 голосов
/ 17 ноября 2009

Для большинства элементов управления вы устанавливаете его высоту и ширину на Auto в XAML, и размер будет соответствовать его содержимому.

В коде вы устанавливаете ширину / высоту на double.NaN. Подробнее см. FrameworkElement.Width , в частности, раздел «Примечания».

27 голосов
/ 23 февраля 2010

У меня была такая проблема, когда я указал ширину моего окна, но установил высоту Auto. Дочернему DockPanel было присвоено значение VerticalAlignment для Top, а для Window было установлено значение VerticalContentAlignment для Top, однако Window по-прежнему будет намного выше содержимого.

Используя Snoop, я обнаружил, что ContentPresenter внутри окна (часть окна, а не то, что я там поместил) имеет значение VerticalAlignment, установленное на Stretch, и его нельзя изменить без повторного добавления всего окна. !

После большого разочарования я обнаружил свойство SizeToContent - вы можете использовать его, чтобы указать, хотите ли вы, чтобы размер окна был изменен по вертикали, горизонтали или по обоим, в зависимости от размера содержимого - теперь все хорошо изменяется, Я просто не могу поверить, что мне понадобилось так много времени, чтобы найти эту собственность!

1 голос
/ 25 августа 2015

У меня был пользовательский элемент управления, который находился на странице в свободной форме, без ограничений другого контейнера, и содержимое в пользовательском элементе управления не будет автоматически изменять размер, а будет расширяться до полного размера, передаваемого пользовательскому элементу управления.

Чтобы пользовательский элемент управления просто изменил размер своего содержимого, только для высоты, я поместил его в сетку, для которой в строке установлен автоматический размер, например:

<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 голос
/ 13 января 2012

Если вы используете сетку или аналогичный компонент: В 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>
...