Размер элемента управления Wpf для содержимого?

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

4 ответов


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

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


у меня была такая проблема, как это, когда я указал ширину моего окна, но имел высоту Auto. Ребенка DockPanel это VerticalAlignment установить на верх, и окно было установлено на VerticalContentAlignment, но окно все равно было бы намного выше, чем содержимое.

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

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


Если вы используете сетку или похожих компонентов: В XAML, убедитесь, что элементы в сетке, у сетки.Ряд и сетка.Столбец определен и убедитесь, что у них нет полей. Если вы использовали режим конструктора или смешение выражений, он мог назначить поля относительно всей сетки, а не для отдельных ячеек. Что касается размера ячейки, я добавляю дополнительную ячейку, которая заполняет остальную часть пространства:

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

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

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

<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>