2011-06-30 96 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。

的問題是:在WrapPanel只是水平擴展和dosent膜...

我發現了一些解決方案。

1-絕對寬度的WrapPanel(但隨後劑量調整窗口大小)。

2-將寬度綁定到它的父寬度ItemsControl或ScrollViewer(ScrollViewer在像這樣的有限情況下工作得更好)。

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

這種技術的問題是,如果你在一個StackPanel或網格拿到旁邊有一個控制,則需要將其綁定到它的父大小減去旁邊的控制。我來這裏是很難的事情。我建造我的轉換器適用於數量的數學運算recived這樣的話,我可以。減去一個guiven寬度到它的父寬度:

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

但儘管如此,因爲你不能綁定你傳遞給ConverterParameter值,

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

我希望能夠調整我的應用程序與我的WrapPanel和ScrollViewer中調整好,

我想我的用戶是容易維護,

我希望我的代碼比這些依賴於父控件類型的大型綁定表達式更清潔。

所以我的問題是:什麼是更好的解決方案?

注意:如果有任何不清楚的地方,我可以添加詳細信息。

+0

它在一個網格而不是StackPanel中工作正常,maby它與StackPanel或其他東西有一個調整大小的錯誤? – Gab

+0

我不認爲這是一個錯誤。如果將控件放置在網格單元中,默認情況下它的大小將完全適合該單元格中的可用空間。 StackPanel不會那樣做。是否有理由不能使用具有兩個單元而不是StackPanel的網格? – haagel

+0

雅我可能只是使用網格。當看到代碼時,StackPanel看起來更好看,因爲它看起來更清晰一些,但正如肯特所說,它會導致問題。 – Gab

回答

8

爲什麼在ScrollViewer允許水平滾動時會換行?你應該在ScrollViewer禁用水平滾動:

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

編輯後,您的編輯:這是因爲你的StackPanel處於水平方向。水平導向的StackPanel將給予它的孩子要求的任何寬度 - 它不會限制它。使用正確的面板,你會沒事的。可能你只是想要一個Grid兩欄。

+0

我沒有注意到,ty!它在我的簡單情況下很好地工作,但後來我在我的真實應用程序中嘗試過,它沒有奏效。我用更多的代碼更新我的問題,這樣你就可以看到什麼是錯的。我在一個StackPanel中有2個滾動查看器。 – Gab

+0

@Gab:編輯後添加了一個編輯 –