2011-06-30 15 views
7

これは私のコードです。 StackPanelはUserControlに直接存在することに注意してください。WrapPanelを親の幅に合わせる

<StackPanel Orientation="Horizontal"> 
    <ScrollViewer 
    Width="450" 
    VerticalScrollBarVisibility="Auto" 
    HorizontalScrollBarVisibility="Disabled" 
    > 
     <Rectangle Width="400" Height="4000" Fill="BlanchedAlmond"></Rectangle> 
    </ScrollViewer> 

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

    <ItemsControl 
     BorderBrush="Green" 
     BorderThickness="2" 
     ItemsSource="{Binding Path=MyObservableCollection}" 
     ItemTemplate="{StaticResource FatTemplate}" 
     > 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <WrapPanel 
         Orientation="Horizontal" 
         > 
       </WrapPanel> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
    </ItemsControl> 

</ScrollViewer> 
</StackPanel> 

コードEDITED)は、スクロールビューアの内容はirrevelantあるbeacause長方形がちょうどTHERであることを

注意。

問題がある:WrapPanelはちょうど水平にしてdosentラップを拡大...

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

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

2 ItemsControlまたはScrollViewer(このような限られた状況でScrollViewerがうまく機能しました)の親幅に幅をバインドします。

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

この手法の問題点は、あなたがのStackPanelやグリッドでそれに次のコントロールを得た場合、あなたはそれの横に、親のサイズマイナスコントロールのにバインドする必要があるということです。彼らはハードのものを来る。

、あなたがConverterParameterに渡す値をバインドカント以来

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

しかし、それでもまだ、私は数では、数学的な演算を適用し、私のコンバータは、それは親の幅だとそう、私はguiven幅をsubstractできrecived建て

ConverterParameter={Binding ...} (dosent work) 

私は

、私は私のユーザーコントロールを簡単に保守になりたい

、私のWrapPanelとScrollViewerのがよくリサイズに私のアプリのサイズを変更できるようにしたいです0

親コントロールのTypeに依存している大規模なバインディング式よりもコードをきれいにしたいと思います。

私の質問は次のとおりです。もっと良い解決策はありますか?

注:不明な点があれば、詳細を追加できます。

+0

StackPanelの代わりにグリッドでうまく動作しますか、それはStackPanelなどのサイズ変更バグです。 – Gab

+0

私はそれがバグだとは思わない。グリッドセル内にコントロールを配置すると、デフォルトではそのセルの空き領域に完全に収まるサイズになります。 StackPanelはそれをしません。 StackPanelの代わりに2つのセルを持つGridを使用できない理由はありますか? – haagel

+0

私はちょうどグリッドを使用するかもしれません。StackPanelは、コードを見ると少し目立たないように見えましたが、ケント氏によると、問題が発生します。 – Gab

答えて

8

ScrollViewerが水平スクロールを許可すると、なぜラップされますか?あなたはScrollViewerで水平スクロールを無効にする必要があります。

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

EDIT YOUR編集した後:あなたのStackPanelが水平に配向されているからです。水平方向のStackPanelは、その子が要求する幅を何でも与えます。それはまったく制約しません。右のパネルを使うと、あなたは大丈夫でしょう。 2列のGridがほしいと思うでしょう。

+0

私は気づいた、ty!私の単純なケースではverryをうまく処理しましたが、実際のアプリケーションで試してみました。私の質問をより多くのコードで更新して、何が間違っているかを確認できます。私は1つのStackPanelに2つのスクロールビューアを持っています。 – Gab

+0

@Gab:編集後に編集を追加しました –

関連する問題