2010-09-27 56 views
1

予有需要下述性能的递归定义用户控制:帧间相关堆叠面板浆纱

有两列

第一包含周围的一些文本

第二列包含一个单一的边界这些相同类型的控件(递归部分)的堆栈

如果第一列中的框比第二列中的堆叠框的总高度更短,则框应扩展为使两列都为s ame高度。

如果第二列的总高度比第一列的框高,那么第二列堆栈中的最后一项应该展开,因此它们的高度相同。

因此,例如,它可能是这样的:

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> 

现在,如果堆叠的柱子更高,但它不起作用,如果第一列更高,并且我得到了空隙。任何想法如何处理这种相互依赖的高度?


更新: 因此,通过添加边框右侧列四周堆叠面板,我能看到的StackPanel其实并收到最小高度的变化。但是,即使有扩展空间,堆叠面板的孩子也不会自动更新。如果我在手之前修好堆叠面板的高度,那么孩子们会填满。我需要弄清楚的是,如何根据堆栈面板的最小高度更改来更新孩子的身高。

+0

所以我想,也许将第二列堆栈面板的minheight参数设置为第一列高度参数,但它抱怨...有任何想法? – tbischel 2010-09-28 00:14:49

+0

高度命令可以是NaN,我尝试绑定到ActualHeight属性,但无济于事。 – tbischel 2010-09-28 00:47:48

回答

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的高度最小(当您更换与其他元素的文本框,你需要设置最低高度以防止它们在空的时候消失)。由于第三行是星形大小的,它将根据前两行排列后剩下的所有剩余垂直空间进行大小调整。因此,如果第一列中有大量内容,则第二列中的第三列变得更高。

编辑

其实,有没有理由,即使在这种情况下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 2010-09-28 18:58:53

+0

因此,我遇到了与上次相同的问题..如何将网格绑定到XAML中的动态行定义? – tbischel 2010-10-01 16:57:01