1

ItemsControl があり、CustomObject からいくつかの文字列を表示したいと考えています。

みたいな

String A
String B
String C

ここで、文字列 A と B は複数行の長さにできますが、C はできません。私が考えHeight="Auto"ていたのは DockPanel です。ただし、ストリング A の高さは、ある必要があります。ストリングBも。

これは私がこれまでに思いついたものです:

<ScrollViewer ScrollViewer.VerticalScrollBarVisibility="Auto" Background="Black">
    <ItemsControl Name="ItemsControl1">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Vertical" />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Border BorderBrush="#FF126eb1" BorderThickness="1.5" CornerRadius="8,8,8,8" Background="#FF074e84" Width="350" Height="Auto">
                    <DockPanel Width="350" Margin="0,10,0,0" Height="Auto" Background="Transparent">
                        <Canvas DockPanel.Dock="Top" Height="Auto" Width="350" Margin="0,10,0,0">
                            <TextBlock Text="{Binding Headline}" Canvas.Left="5" Canvas.Top="5" Foreground="White" FontSize="15" FontWeight="Bold" MaxWidth="340" TextWrapping="Wrap" Height="Auto"/>
                        </Canvas>
                        <Canvas DockPanel.Dock="Top" Height="Auto" Width="350" Margin="0,10,0,0">
                            <TextBlock Text="{Binding Description}" Canvas.Left="5" Canvas.Top="20" Foreground="White" FontSize="13" MaxWidth="340" TextWrapping="Wrap" Height="Auto" />
                        </Canvas>
                        <Canvas DockPanel.Dock="Top" Width="350" Height="40" Margin="0,10,0,0" Background="Transparent">
                            <TextBlock Text="{Binding DeadlineOn, StringFormat='Deadline: {0}'}" Canvas.Left="5" Canvas.Top="5" Foreground="White"/>
                             <!-- and other controls -->
                        </Canvas>
                    </DockPanel>
                </Border>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</ScrollViewer>

残念ながら、margin プロパティだけが文字列 A と B の高さを作っています。

各アイテムの高さが不明な場合、どうすればよいですか?

4

1 に答える 1

2

多くのレイアウト要素があり、これにより多くの選択肢が与えられますが、特定の状況でどのレイアウト要素を使用するのが適切かを判断するのは難しい場合があります.

一般に、Canvasは便利な固定位置機能で役立ちます。Canvas.LeftおよびCanvas.Top添付プロパティを使用して、あらゆるものをどこにでも配置できます。ただし、 a のサイズCanvasは固定されており、その子に依存しないため、可変サイズのコンテンツに使用するのは困難です。の親はCanvasの子のサイズから「隔離」されておりCanvas、これは状況によっては実際に役立ちます。

対照的に、 aGridははるかに柔軟なレイアウト要素であり、行と列を含むグリッドのレイアウト、スパンの有無などに役立ちます。これが、新しいWindoworを作成するときのデフォルトである理由ですUserControl。ただし、 a とは異なりCanvas、 のサイズがGrid指定されておらず、使用可能なスペースに拡張されていない場合、そのすべての子のサイズの和集合になります。

AGridには、複数の子があり、それらが行または列に配置されていない場合、互いの上にオーバーレイされ、後の子が Z オーダーで上位になるというプロパティもあります。これは と のようなものですCanvasが、Canvas.LeftとはCanvas.Topありません。どうすれば子の位置を細かく制御できるでしょうか。

例を見てみましょう。これはCanvas、少しスペースを空けて並べて配置された 2 つの長方形とGrid、同じことを行う です。

<Grid>
    <StackPanel>
        <Canvas Height="120">
            <Rectangle Canvas.Left="10" Canvas.Top="10" Height="100" Width="100" Fill="Red"/>
            <Rectangle Canvas.Left="120" Canvas.Top="10" Height="100" Width="100" Fill="Green"/>
        </Canvas>
        <Grid HorizontalAlignment="Left">
            <Rectangle Margin="10,10,10,10" Height="100" Width="100" Fill="Red" HorizontalAlignment="Left"/>
            <Rectangle Margin="120,10,10,10" Height="100" Width="100" Fill="Green" HorizontalAlignment="Left"/>
        </Grid>
    </StackPanel>
</Grid>

最初のケースでは、Canvasサイズが自動調整されないため、高さを指定する必要がありました。2 番目のケースでは、絶対配置Marginシミュレートし、サイズはそのコンテンツのGridサイズに適応します。

于 2011-06-26T22:35:24.133 に答える