2009-07-15 71 views
26

我在使用包含ItemsControl的我的堆棧面板周圍的scrollviewer控件。當ItemsControl中有很多項目時,它應該滾動,但由於某種原因,它只是削減了項目。下面是代碼:ScrollViewer無法在WPF中滾動

<StackPanel> 
    <ScrollViewer CanContentScroll="True" VerticalScrollBarVisibility="Visible"> 
     <ItemsControl Name="icEvents" Width="Auto" Height="100" Background="AliceBlue" 
         ItemsSource="{Binding Path=EventSources}"> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <StackPanel> 
         <TextBlock Text="Source:"/> 
         <TextBlock Text="{Binding Path=Source}" /> 
         <TextBlock Text="Original Source:"/> 
         <TextBlock Text="{Binding Path=OriginalSource}" /> 
        </StackPanel> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 
    </ScrollViewer> 
</StackPanel> 

回答

40

試試你ScrollViwer代替StackPanel周圍的網格。我認爲StackPanel將提供與內部內容一樣多的高度,因此Scrollviwer無法正常工作,因爲其高度不受其父級控制的限制。

您可以從下面的示例中瞭解問題。

<StackPanel> 
    <ScrollViewer> 
     <ItemsControl > 
      <Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" StrokeThickness="4" Width="200"/> 
      <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/> 
      <Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" StrokeThickness="4" Width="200"/> 
      <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/> 
      <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/> 
     </ItemsControl> 
    </ScrollViewer> 
</StackPanel> 

上面的代碼與您的類似,它不會給您滾動條。但看到下面的代碼中,我不僅改變了StackPanelGrid(其尊重其子女的基礎上面板尺寸大小的任何面板,但StackPanel中沒有)

<Grid> 
    <ScrollViewer> 
     <ItemsControl > 
      <Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" StrokeThickness="4" Width="200"/> 
      <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/> 
      <Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" StrokeThickness="4" Width="200"/> 
      <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/> 
      <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/> 
     </ItemsControl> 
    </ScrollViewer> 
</Grid> 

UPDATE:但如果你真的需要使用StackPanel,那麼你可能需要設置大小爲您ScrollViwer獲取內容滾動

2

ItemsControl應包含ScrollViewer,而不是周圍的其他方式。所有ScrollViewer知道的是ItemsControl本身在你的情況 - 它不知道內在的項目。

嘗試這樣:

<ItemsControl Name="icEvents" Width="Auto" Height="100" 
    Background="AliceBlue" 
    ItemsSource="{Binding Path=EventSources}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <TextBlock Text="Source:"/> 
       <TextBlock Text="{Binding Path=Source}" /> 
       <TextBlock Text="Original Source:"/> 
       <TextBlock Text="{Binding Path=OriginalSource}" /> 
      </StackPanel> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
    <ItemsControl.Template> 
     <ControlTemplate TargetType="ItemsControl"> 
      <ScrollViewer VerticalScrollBarVisibility="Auto"> 
       <ItemsPresenter Margin="5" /> 
      </ScrollViewer> 
     </ControlTemplate> 
    </ItemsControl.Template> 
</ItemsControl> 
+0

這是沒有必要有一個scrollviwer,在討論的問題是StackPanel的。 – 2009-07-15 18:16:26

+1

但是,您需要某個ScrollViewer,因爲默認情況下ItemsControl不會滾動。我已經使用這個代碼,它的工作原理,雖然你的答案也可能工作。 – Andy 2009-07-15 18:18:44

+0

是的,你的代碼也可以工作,只有當他移除外層StackPanel時,它並不重要,你在ControlTemplate內部或ItemsControl外部的滾動條都幾乎相同。 – 2009-07-15 18:22:15

21

必須解決的ScrollViewer的高度,但可以很容易綁定到StackPanel中的ActualHeight:
(測試代碼)

<StackPanel Name="mypanel"> 
    <ScrollViewer Height="{Binding ElementName=mypanel, Path=ActualHeight}"> 
     <ItemsControl> 
      <Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" Width="200"/> 
      <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" /> 
      <Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" Width="200"/> 
      <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" /> 
      <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" /> 
     </ItemsControl> 
    </ScrollViewer> 
</StackPanel> 

或者更好的是,如果你不能改變的StackPanel的名稱:

<StackPanel> 
    <ScrollViewer Height="{Binding RelativeSource={RelativeSource FindAncestor, 
         AncestorType={x:Type StackPanel}}, Path=ActualHeight}"> 
     <ItemsControl> 
      <Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" Width="200"/> 
      <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" /> 
      <Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" Width="200"/> 
      <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" /> 
      <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" /> 
     </ItemsControl> 
    </ScrollViewer> 
</StackPanel> 

它是一種「你先」的問題,該StackPanel中要求的ScrollViewer的高度和ScrollViewer中問它可以是最大高度的StackPanel。

0

Scroll需要是調整大小的子級的父級,因此請將調整大小控件(在此示例中是堆棧面板)放在其中。

<ScrollViewer> 
    <StackPanel> 
     <Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" StrokeThickness="4" Width="200"/> 
     <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/> 
     <Rectangle Stroke="#FFC3C3C3" Height="300" Fill="Black" StrokeThickness="4" Width="200"/> 
     <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/> 
     <Rectangle Stroke="#FFC3C3C3" Width="200" Height="300" Fill="Black" StrokeThickness="4"/> 
    </StackPanel> 

0

我有一個問題,其中我在網格中才能看到滾動條呈ItemsControl,我不得不放棄這個網格單元*尺度的高度。

但是,這意味着ItemsControl總是填滿單元格,即使只有少數值。

我想ItemsControl只能顯示它的大小,但如果它有太多的項目,我希望它滾動。換句話說,我希望這隻適用於任何尺寸的顯示器。

這段代碼在Loaded事件工作對我來說:

Size x = new Size(double.PositiveInfinity, double.PositiveInfinity); 
myItemscontrol.Measure(x);