2010-09-27 6 views
1

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

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

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

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

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

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

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

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> 

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


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

+0

Так что я подумал, может быть, установив параметр minheight второго столбца столбца на первый параметр высоты столбцов, но он пожаловался ... на любые идеи? – tbischel

+0

команда высоты может быть NaN, я пытался привязать к свойству ActualHeight, но безрезультатно. – tbischel

ответ

1

Я думаю, что 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 как минимум (при замене TextBoxes с другими элементами, вам нужно установить минимальные высоты, чтобы они не исчезли, если они пусты). Поскольку третья строка имеет размер звезды, она будет сама по себе распределяться по всему оставшемуся вертикальному пространству, оставшемуся после размещения первых двух строк. Поэтому, если в первом столбце есть куча контента, третья строка во втором столбце становится выше.

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

На самом деле, нет никаких оснований даже розыгрыши с 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> 
+0

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

+0

Итак, я столкнулся с той же проблемой, что и в прошлый раз. Как привязать сетку к динамическим определениям строк в XAML? – tbischel

 Смежные вопросы

  • Нет связанных вопросов^_^