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