1

次のプロパティを必要とする再帰的に定義されたユーザーコントロールがあります。

2つの列があります

最初のテキストには、テキストの周囲に1つの境界線が含まれています

2番目の列には、これらの同じタイプのコントロールのスタックが含まれています(再帰部分)

最初の列のボックスが2番目の列の積み重ねられたボックスの全高よりも短い場合は、ボックスを拡張して両方の列を同じ高さにする必要があります。

2番目の列の合計の高さが最初の列のボックスよりも短い場合は、2番目の列のスタックの最後のアイテムが同じ高さになるように拡張する必要があります。

たとえば、次のようになります。

代替テキスト

さて、これまでのところ、最初の項目が境界線とテキストを含むドックパネルである水平スタックパネルを作成しています... 2番目の列は、サブリストにバインドされた垂直スタックパネルであり、再帰的なユーザーコントロールを作成します。 .. このような..

<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>

これで、積み重ねられた列が高い場合はうまく機能しますが、最初の列が高い場合は機能せず、ギャップが生じます。この相互の高さの依存関係を処理する方法はありますか?


更新:右側の列のスタックパネルの周囲に境界線を追加することで、スタックパネルが実際に最小の高さの変更を受け取ったことを確認できました。ただし、拡張する余地はありましたが、スタックパネルの子は自動的に更新されませんでした。手前のスタックパネルのミンハイトを大きなものに固定すると、子供たちがいっぱいになります。私が理解する必要があるのは、スタックパネルの最小の高さの変更に基づいて子供の高さを更新する方法です。

4

1 に答える 1

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>

の 3 つの行はすべて、最小で aGridの高さにTextBoxなります (TextBox を他の要素に置き換える場合、空の場合にそれらが消えないように、最小の高さを設定する必要があります)。3 番目の行はスター サイズであるため、最初の 2 行を配置した後に残っているすべての垂直方向のスペースに合わせてサイズが調整されます。したがって、最初の列に大量のコンテンツがある場合、2 列目の 3 行目の高さが高くなります。

編集

実際、この場合、 a をいじる理由さえありません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>
于 2010-09-28T08:57:30.050 に答える