WPF — изменение размера столбцов и строк в сетке

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

То есть форма всплывает с определенными начальными размерами столбцов для элементов управления... если пользователь ИЗМЕНЯЕТ РАЗМЕР формы... я хочу, чтобы некоторые поля типа "памятки" расширялись. Как это сделать? Кажется, я могу увеличить высоту ВСЕХ «вторых» столбцов... а не только 1 (последнего)... или конкретных.

Спасибо за любую помощь!!

Вот макет ... как я могу изменить размер «длинного» текста с изменением размера формы и сохранить кнопку приклеенной к нижней части формы ??? TX

<DockPanel VerticalAlignment="Top">
    <Grid DockPanel.Dock="Top" VerticalAlignment="Top" HorizontalAlignment="Stretch" Grid.Column="0" Margin="10,10,10,10" >
      <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"></ColumnDefinition>
        <ColumnDefinition MinWidth="150" ></ColumnDefinition>        
      </Grid.ColumnDefinitions>

      <Grid.RowDefinitions>
        <RowDefinition></RowDefinition>
        <RowDefinition MinHeight="80" Height="Auto"></RowDefinition>
        <RowDefinition ></RowDefinition>
      </Grid.RowDefinitions>

      <Label Grid.Column="0" Grid.Row="0" Content="Test1"/>
      <Label Grid.Column="0" Grid.Row="1" Content="Test2 -Long notes"/>
      <Label Grid.Column="0" Grid.Row="2" Content="Test3"/>

      <TextBox Height="Auto" Grid.Column="1" Grid.Row="0" />
      <TextBox Height="Auto" Grid.Column="1" Grid.Row="1" TextWrapping="Wrap" AcceptsReturn="True" VerticalScrollBarVisibility="Auto" />
      <TextBox Height="Auto" Grid.Column="1" Grid.Row="2" />

    </Grid>
    <StackPanel DockPanel.Dock="Bottom" Orientation="Horizontal" HorizontalAlignment="Right" MinHeight="20" Margin=" 0,0,10,10">
      <Button Content="OK" Margin="0,0,10,0" Width="75" IsDefault="True"/>
      <Button Content="Cancel" Width="75" IsCancel="True" />
    </StackPanel>
  </DockPanel>

(добавлено после 1-го «ответа») Теперь, если я уберу нижнюю панель стека (кнопки «ОК», «Отмена») из уравнения, чтобы упростить это, и я установлю 1-ю и 2-ю строки на фиксированное значение... я, кажется, могу заставить это работать (хотя я не хочу устанавливать максимальную высоту) ... о, и мне нужно изменить вертикальный выравнивание на «растянуть». Но как только я снова добавляю StackPanel для кнопок... растягивание больше не работает... так что вот следующая исправленная версия...

<DockPanel VerticalAlignment="Stretch">
    <Grid DockPanel.Dock="top"  VerticalAlignment="Stretch" Grid.Column="0"  Margin="10,10,10,10" >
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"></ColumnDefinition>
            <ColumnDefinition MinWidth="150" Width="*"></ColumnDefinition>
        </Grid.ColumnDefinitions>

        <Grid.RowDefinitions>
            <RowDefinition MaxHeight="30"></RowDefinition>
            <RowDefinition MinHeight="80" Height="*"></RowDefinition>
            <RowDefinition MaxHeight="30"></RowDefinition>
        </Grid.RowDefinitions>

        <Label Grid.Column="0" Grid.Row="0" Content="Test1"/>
        <Label Grid.Column="0" Grid.Row="1" Content="Test2 -Long notes"/>
        <Label Grid.Column="0" Grid.Row="2" Content="Test3"/>

        <TextBox Grid.Column="1" Grid.Row="0" />
        <TextBox Grid.Column="1" Grid.Row="1" TextWrapping="Wrap" AcceptsReturn="True" VerticalScrollBarVisibility="Auto" />
        <TextBox Grid.Column="1" Grid.Row="2" />
    </Grid>

    <StackPanel DockPanel.Dock="Bottom" VerticalAlignment="Bottom" HorizontalAlignment="Right" Orientation="Horizontal" MinHeight="20" Margin=" 0,0,10,10">
        <Button Content="OK" Margin="0,0,10,0" Width="75" IsDefault="True"/>
        <Button Content="Cancel" Width="75" IsCancel="True" />
    </StackPanel>
</DockPanel>

Так что у меня все еще есть проблемы...


person appWoW    schedule 18.07.2010    source источник


Ответы (3)


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

Если вам нужно несколько столбцов, чтобы разделить доступное пространство в разных процентах, вы можете добавить префикс * с числом, например, «2*» и «3*». По умолчанию "" означает 1.

HTH,
Беррил

person Berryl    schedule 18.07.2010
comment
Привет, спасибо за ответ. Проблема здесь в том, как указать НЕТ высоты изменения размера для всех строк, кроме определенной. * поддерживается только для определения столбца и определения строки, так как же получить поперечное сечение? 2-й ряд, 2-й столбик действовать только так. Как видно из примера, нижние кнопки не приклеиваются к нижней части, И последняя строка, последний столбец не изменяет размер. замена авто на '*' не помогает. - person appWoW; 19.07.2010
comment
Я пересмотрел приведенный выше пример кода... но все еще есть проблемы. - person appWoW; 19.07.2010
comment
Привет приложениеВау. Я немного запутался в том, что вы пытаетесь сделать здесь. Указание НЕТ изменения размера, кроме одного, означает, что эта одна и только одна строка имеет высоту = . Это отличается от определения размеров отдельных ячеек в сетке — лучший способ сделать это — вложить одну сетку в другую и использовать размер звезды для этой ячейки (2-й ряд, 2-й столбец) Width=. ХТН - person Berryl; 19.07.2010

Кажется, я могу решить проблемы только путем включения StackPanel в свою собственную строку сетки и столбец. Вот мое решение. Не уверен, что в этом случае необходима док-панель ... но без дополнительных усилий ... это мое текущее решение. Если кто-нибудь может объяснить мне, как заставить его работать с панелью стека. ОК, кнопки «Отмена» «вне» сетки, я бы хотел знать. Между тем, это решение доступно для тех из вас, кто занимается проблемой такого рода. Как видите, вам нужно использовать Auto во всех других определениях строк. * где вы хотите, чтобы он расширялся.

<DockPanel VerticalAlignment="Stretch">
        <Grid DockPanel.Dock="top"  VerticalAlignment="Stretch" Grid.Column="0"  Margin="10,10,10,10" >
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"></ColumnDefinition>
                <ColumnDefinition MinWidth="150" Width="*"></ColumnDefinition>
            </Grid.ColumnDefinitions>

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

            <Label Grid.Column="0" Grid.Row="0" Content="Test1"/>
            <Label Grid.Column="0" Grid.Row="1" Content="Test2 -Long notes"/>
            <Label Grid.Column="0" Grid.Row="2" Content="Test3"/>

            <TextBox Grid.Column="1" Grid.Row="0" />
            <TextBox Grid.Column="1" Grid.Row="1" TextWrapping="Wrap" AcceptsReturn="True" VerticalScrollBarVisibility="Auto" />
            <TextBox Grid.Column="1" Grid.Row="2" />

            <StackPanel Grid.Column="1" Grid.Row="3" VerticalAlignment="Bottom" HorizontalAlignment="Right" Orientation="Horizontal" MinHeight="20" Margin=" 0,10,0,0">
                <Button Content="OK" Margin="0,0,10,0" Width="75" IsDefault="True"/>
                <Button Content="Cancel" Width="75" IsCancel="True" />
            </StackPanel>
        </Grid>
    </DockPanel>
person appWoW    schedule 19.07.2010
comment
DockPanel делает то, что вы хотите (вроде), потому что по умолчанию делает LastChildFill=true. Ваша StackPanel является последним дочерним элементом. Идея верна в том, что у вас есть одна панель (сетка), вложенная в другую (DockPanel). Если вам нужен более точный контроль, как вам кажется, измените DockPAnel на Grid. ХТН - person Berryl; 19.07.2010

Если вы хотите изменить размер только одного из квадратов, созданных определениями строк и столбцов, вы должны добавить сетку или любой другой контейнерный элемент внутри одного из квадратов. Затем вы сделаете сетку внутри квадрата соответствующим образом изменив размер. Таким образом, все определения не будут изменять размер, вместо этого изменится размер сетки и ее элементов внутри и, таким образом, не изменятся другие элементы. Это необычно, но вы можете иметь столько панелей стека и сеток и при необходимости настроить их видимость. Иногда, когда что-то не работает, вставьте их внутрь чего-то другого и поэкспериментируйте с этим. Вы можете просто получить его случайно, но вы все равно получите его.

person Jader J Rivera    schedule 19.07.2013