7

これが私のコードです。StackPanelは直接UserControlにあることに注意してください。

<UserControl>
    <StackPanel Orientation="Horizontal">

        <ScrollViewer Width="450"
                      VerticalScrollBarVisibility="Auto"
                      HorizontalScrollBarVisibility="Disabled">

            <Rectangle Width="400" Height="4000" Fill="BlanchedAlmond"/>
        </ScrollViewer>

        <ScrollViewer VerticalScrollBarVisibility="Auto"
                      HorizontalScrollBarVisibility="Disabled">

            <ItemsControl BorderBrush="Green"
                          BorderThickness="2"
                          ItemsSource="{Binding Path=MyObservableCollection}"
                          ItemTemplate="{StaticResource FatTemplate}">

                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <WrapPanel Orientation="Horizontal"/>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>

            </ItemsControl>
        </ScrollViewer>

    </StackPanel>
</UserControl>

コード編集済み

そのスクロールビューアのコンテンツは無関係であるため、長方形がちょうどそこにあることに注意してください。

問題は、WrapPanelが水平方向に拡張するだけで、ラップしないことです...

私はいくつかの解決策を見つけました:

  1. WrapPanelに絶対幅を指定します(ただし、ウィンドウに合わせてサイズは変更されません)。

  2. 幅をその親の幅にバインドする-ItemsControlまたはScrollViewerのいずれか(ScrollViewerは、このような限られた状況でより適切に機能しました)。

    Width="{Binding RelativeSource=
        {RelativeSource FindAncestor,
        AncestorType={x:Type ScrollViewer}},
        Path=ActualWidth}"
    

この手法の問題は、StackPanelまたはGridでコントロールがその横にある場合、その親サイズから隣のコントロールを引いたものにバインドする必要があることです。次に、難しいものがあります。受信した数値に数学演算を適用するコンバーターを作成したので、親の幅から特定の幅を引くことができます。

Width="{Binding RelativeSource=
    {RelativeSource FindAncestor,
    AncestorType={x:Type UserControl}},
    Path=ActualWidth,
    Converter={StaticResource Convertisseur_Size_WXYZ}, 
    ConverterParameter=-260}"

ただし、それでも、ConverterParameterに渡す値をバインドすることはできないため、

ConverterParameter={Binding ...} (doesn't work)

が欲しいです:

  • WrapPanelとScrollViewerのサイズ変更を適切に使用してアプリのサイズを変更できるようにするには、
  • 私のUserControlは簡単に保守できます。
  • 親コントロールのタイプに依存するこれらの大きなバインディング式よりもクリーンなコードです。

より良い解決策は何ですか?

注:不明な点がある場合は、詳細を追加できます。

4

1 に答える 1

9

ScrollViewer水平スクロールが許可されているのに、なぜラップするのでしょうか。:で水平スクロールを無効にする必要がありScrollViewerます

<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled">

編集後に編集する:それはあなたStackPanelが水平に向いているからです。水平方向StackPanelは、子が要求する幅を与えます-それはそれをまったく制約しません。右のパネルを使用すれば、大丈夫です。Gridおそらく、2つの列を持つだけが必要です。

于 2011-06-30T18:22:26.597 に答える