2010-09-27 85 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