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


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

4 59

4 ответа:

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

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

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

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

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

Если вы используете сетку или похожих компонентов: В 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>