ScrollViewer未在WPF中滚动

ScrollViewer未在WPF中滚动,wpf,scrollviewer,Wpf,Scrollviewer,我正在堆栈面板周围使用scrollviewer控件,其中包含ItemsControl。当ItemsControl中有许多项时,它会滚动,但由于某些原因,它只会剪切这些项。代码如下: <StackPanel> <ScrollViewer CanContentScroll="True" VerticalScrollBarVisibility="Visible"> <ItemsControl Name="icEvents" Width="Auto

我正在堆栈面板周围使用scrollviewer控件,其中包含ItemsControl。当ItemsControl中有许多项时,它会滚动,但由于某些原因,它只会剪切这些项。代码如下:

<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>

项目控件应包含滚动查看器,而不是相反。在您的例子中,
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>

尝试在您的
ScrollViwer
周围放置网格,而不是
堆栈面板
。我认为
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>

更新:但是如果您真的需要使用
StackPanel
,那么您可能需要设置
ScrollViwer
的大小,以获取内容滚动

您必须固定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询问可以达到的最大高度。

卷轴需要是调整大小子项的父项,因此,将调整大小控件(在本例中为堆栈面板)放入其中

<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>


我遇到了一个问题,我在网格中显示了一个
ItemsControl
,为了查看滚动条,我必须给出这个网格单元格*大小的高度

但是,这意味着即使只有几个值,
ItemsControl
也始终填充单元格

我希望
ItemsControl
的大小只足以显示它有什么,但是如果它有太多的项目,那么我希望它滚动。换句话说,我希望它只适用于任何尺寸的显示器

加载事件中的此代码对我有效:

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

没有必要安装scrollviwer,问题是StackPanel。不过,您需要在某个地方安装ScrollViewer,因为默认情况下ItemsControl不滚动。我用过这个代码,它很有效,虽然你的答案可能也会起作用。是的,你的代码只有在他移除外部StackPanel的情况下才能起作用,这并不重要,你在控件模板内或控件外有一个滚动条,两者几乎相同。这是我的问题-我用了错误的方法-优秀的人感谢这可能不可能,因为所有东西都在StackPanel内。页面上没有网格。仅主stackpanel包含两个其他stackpanel。当我说stackpanel的高度为100时,这种情况甚至会发生。问题是窗口上的每个控件都包含在主堆栈面板控件中。但是如果你真的需要使用StackPanel,那么你可能需要设置ScrollViwer的大小来获取内容滚动,因为正如我前面所说的,StackPanel不尊重其子对象的高度或宽度。因此,当我们使用StackPanel时,我们必须设置高度和宽度。我在ScrollViewer上设置了高度,它成功了!谢谢!检查我的答案:它解决了绑定到StackPanel实际高度的问题。感谢您提供的信息丰富的答案!这一定会派上用场的!
<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>
Size x = new Size(double.PositiveInfinity, double.PositiveInfinity);
myItemscontrol.Measure(x);