размер панели стека - PullRequest
       4

размер панели стека

1 голос
/ 28 сентября 2010

У меня есть рекурсивно определенный пользовательский элемент управления, которому необходимы следующие свойства:

есть две колонки

первый содержит одну рамку вокруг текста

второй столбец содержит стек элементов управления того же типа (рекурсивная часть)

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

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

так, например, это может выглядеть так:

alt text

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

<StackPanel Orientation="Horizontal" Background="AliceBlue">
        <local:TMRequirementView Requirement="{Binding Baseline}" />
        <StackPanel Orientation="Vertical">
            <ItemsControl ItemsSource="{Binding Requirements}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <local:TMGridView Baseline="{Binding}" />
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </StackPanel>

Где требование выглядит так:

    <DockPanel>
        <Border MinHeight="50"
                BorderBrush="Black" BorderThickness="2">
            <TextBlock Text="{Binding Description}" 
                       TextWrapping="Wrap" Background="Transparent" Height="Auto" />
        </Border>
    </DockPanel>

Теперь это прекрасно работает, если столбец с накоплением выше, но не работает, если первый столбец выше, и я получаю пробелы. Любая идея, как справиться с этой взаимной зависимостью от высоты?


Обновление: Таким образом, добавив рамку вокруг правой панели столбцов, я смог увидеть, что панель стека действительно получила изменения минимальной высоты. Однако даже при наличии возможности расширения дочерние элементы панели стека не обновлялись автоматически. Если я исправлю минимальную высоту панели стека перед рукой на что-то большое, дети заполнятся. Мне нужно выяснить, как обновить высоту детей в зависимости от изменений минимальной высоты панели стека.

1 Ответ

1 голос
/ 28 сентября 2010

Я думаю, Grid в этом макете делает то, что вы описываете. Я положил его в DockPanel, чтобы вы могли видеть, как он изменяется. Попробуйте набрать вещи в текстовые поля и посмотрите, как они себя ведут:

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <DockPanel>  
    <Grid DockPanel.Dock="Top">
      <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
      </Grid.ColumnDefinitions>
      <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
      </Grid.RowDefinitions>
      <TextBox AcceptsReturn="True" Grid.Row="0" Grid.Column="0" Grid.RowSpan="3"></TextBox>
      <TextBox AcceptsReturn="True" Grid.Row="0" Grid.Column="1"></TextBox>
      <TextBox AcceptsReturn="True" Grid.Row="1" Grid.Column="1"></TextBox>
      <TextBox AcceptsReturn="True" Grid.Row="2" Grid.Column="1"></TextBox>
    </Grid>
    <TextBlock/>
  </DockPanel>
</Page>

Все три строки Grid будут иметь высоту TextBox как минимум (когда вы заменяете TextBox на другие элементы, вам необходимо установить минимальную высоту, чтобы они не исчезали, если пусто). Поскольку третий ряд имеет звездообразный размер, он будет масштабироваться по всему оставшемуся вертикальному пространству, оставленному после того, как первые два ряда расположены. Так что если в первом столбце есть куча контента, третья строка во втором столбце становится выше.

Редактировать

На самом деле, в данном случае нет никаких причин даже использовать Grid: то, что вы описываете, на самом деле - это поведение DockPanel:

<DockPanel>
  <DockPanel DockPanel.Dock="Top">      
    <DockPanel.Resources>
      <Style TargetType="Label">
        <Setter Property="DockPanel.Dock" Value="Top"/>
        <Setter Property="Background" Value="Lavender"/>
        <Setter Property="Margin" Value="1"/>
      </Style>
    </DockPanel.Resources>
    <DockPanel LastChildFill="True">
      <Label>Foo</Label>
    </DockPanel>
    <DockPanel LastChildFill="True">
      <Label>Foo</Label>
      <Label>Bar</Label>
      <Label>Baz</Label>
      <Label>Bat</Label>
    </DockPanel>
  </DockPanel>
  <Label/>
</DockPanel>
...