0

ここでストレッチに関する提案を試しましたが、うまくいきませんでした。

基本的にItemsPanelを備えた単なるリストボックスであるUserControlをホストするTabItemがあります。ItemsPanelは、ListBoxにその内容を水平方向に表示するように強制します。ListBoxの内容は、ObservableCollection<StackPanelContents>別のUserControlであるにデータバインドされます。 StackPanelContentsそれ自体は基本的に、List視覚化されたオブジェクトを含むだけです(視覚化のためのUIElementが含まれています)。

一般に、コードは、に含まれているすべてのデータをレンダリングするという点で適切に機能しますObservableCollectionが、問題は、ウィンドウが拡大または縮小されたときにアイテムのサイズが変更されないことです。

クラス階層がどのように見えるかの概要は次のとおりです。

代替テキスト

そしてここに結果があります:

代替テキスト

メインウィンドウのXAMLには、TabControlとTabItemがあります。

<Window x:Class="ResizeStackPanelInListBox.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">

    <TabControl>
        <TabItem Header="Test" x:Name="MyTabItem">
            <!-- contents are set in code behind -->
        </TabItem>
    </TabControl>
</Window>

StackPanelContentsを表示するListBoxContainerXAMLは次のようになります。

<UserControl x:Class="ResizeStackPanelInListBox.ListBoxContainer"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="Auto" Width="Auto">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
        </Grid.RowDefinitions>
        <TextBlock>ListBox with StackPanels as its ListBoxItems:</TextBlock>
        <ListBox Grid.Row="1" ItemsSource="{Binding StackPanels}" HorizontalContentAlignment="Stretch">
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal" Width="Auto" Height="Auto" />
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
        </ListBox>
    </Grid>
</UserControl>

また、StackPanelContentsUserControlは次のようになります。

<UserControl x:Class="ResizeStackPanelInListBox.StackPanelContents"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="Auto" Width="Auto">

    <StackPanel>
        <TextBlock Text="StackPanel"></TextBlock>
        <StackPanel x:Name="MyStackPanel">
        </StackPanel>
    </StackPanel>
</UserControl>

これが自動的にサイズ変更されない理由と、これを解決する方法を誰かが説明できますか?これに対処するために独自のカスタムパネルを作成し、使用する必要がMeasureOverrideありArrangeますか?

4

2 に答える 2

1

問題は、StackPanels を使用してアイテムを両方向に配置しているため、ストレッチが失われていることです。StackPanel は、その子が Orientation と反対の方向にのみ伸びることを許可します。もう一方の方向には、残りのアイテムにできるだけ多くのスペースを確保するために、必要なだけのスペースが与えられます。したがって、デフォルトの Vertical StackPanel の場合、内部に配置されたものはすべて水平方向に伸びますが、垂直方向に上に向かって圧縮されます。Horizo​​ntal StackPanel 内に Vertical StackPanels があるため、アイテムは両方の方法で圧迫されています。

アイテムに何をさせたいかによって、いくつかのオプションがあります。DockPanel に変更すると、最後のアイテムが引き伸ばされてスペースを埋めることができます (垂直のものは、ItemContainerStyle で DockPanel.Dock=Top を設定する必要があります)。* サイズの行と列を持つグリッドは、通常のレイアウトではうまく機能しますが、項目ごとに行と列を設定する必要があるため、ItemsControl の場合は機能しません (ItemsControl.AlternationIndex を使用して行うことができますが、面倒で壊れやすいです)。1行/列のUniformGridを使用すると(参照した回答のように)、使用可能なスペースが均等に分割され、アイテムに追加の設定は必要ありません。

さまざまなアイテムがさまざまな量のスペースを取得したり、伸縮動作を行ったりする、より複雑なレイアウト戦略が必要な場合は、カスタム パネルが必要になります。

于 2010-08-04T18:39:10.423 に答える
0

ウィンドウに設定してみてください

    SizeToContent="WidthAndHeight"
于 2010-08-04T17:25:54.403 に答える