使用带有 Canvas 作为 ItemsPanel 的 ItemsControl 的 ScrollViewer
Using a ScrollViewer with an ItemsControl with a Canvas as the ItemsPanel
我有一个 ItemsControl 并将 ItemsPanel 设置为 Canvas。 Canvas 需要能够根据我放入其中的内容动态调整大小,并且我需要能够在内容超出控件边界时滚动。问题是我无法让内容滚动。我将滚动条可见性设置为自动,所以当内容超出边缘时我不会看到滚动条弹出。
我尝试将 ItemsControl 放入 ScrollViewer 中,并尝试在 ItemsControl 的模板中使用 ScrollViewer。
这是 ScrollViewer 中的 ItemsControl:
<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
<ItemsControl ItemsSource="{Binding Tiles}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Canvas.Left" Value="{Binding Left}" />
<Setter Property="Canvas.Top" Value="{Binding Top}" />
</Style>
</ItemsControl.ItemContainerStyle>
<ItemsControl.ItemTemplateSelector>
...
</ItemsControl.ItemTemplateSelector>
</ItemsControl>
</ScrollViewer>
这是模板中的 ScrollViewer:
<ItemsControl ItemsSource="{Binding Tiles}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Canvas.Left" Value="{Binding Left}" />
<Setter Property="Canvas.Top" Value="{Binding Top}" />
</Style>
</ItemsControl.ItemContainerStyle>
<ItemsControl.Template>
<ControlTemplate>
<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
<ItemsPresenter />
</ScrollViewer>
</ControlTemplate>
</ItemsControl.Template>
<ItemsControl.ItemTemplateSelector>
...
</ItemsControl.ItemTemplateSelector>
</ItemsControl>
This post on MSDN 看起来很有希望,但是在我的代码中实现它,或者甚至明确地用 Canvas 代替 WrapPanel 都没有用(或者,我应该说,我没有能够让它工作)。
我也查看了 this post,但该解决方案对我不起作用,因为我需要 canvas 才能根据内容调整大小(否则滚动条是始终可见)。
提前谢谢您!
canvas的width/height在未明确设置时,将从ItemsControl
继承。 "dynamic sizing" 您期望的行为并不是开箱即用的面板大小调整和布局方式。
您的选择是:
- 明确设置
ItemsControl
Width/Height。
- 显式设置 Canvas Width/Height。
我有一个 ItemsControl 并将 ItemsPanel 设置为 Canvas。 Canvas 需要能够根据我放入其中的内容动态调整大小,并且我需要能够在内容超出控件边界时滚动。问题是我无法让内容滚动。我将滚动条可见性设置为自动,所以当内容超出边缘时我不会看到滚动条弹出。
我尝试将 ItemsControl 放入 ScrollViewer 中,并尝试在 ItemsControl 的模板中使用 ScrollViewer。
这是 ScrollViewer 中的 ItemsControl:
<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
<ItemsControl ItemsSource="{Binding Tiles}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Canvas.Left" Value="{Binding Left}" />
<Setter Property="Canvas.Top" Value="{Binding Top}" />
</Style>
</ItemsControl.ItemContainerStyle>
<ItemsControl.ItemTemplateSelector>
...
</ItemsControl.ItemTemplateSelector>
</ItemsControl>
</ScrollViewer>
这是模板中的 ScrollViewer:
<ItemsControl ItemsSource="{Binding Tiles}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Canvas.Left" Value="{Binding Left}" />
<Setter Property="Canvas.Top" Value="{Binding Top}" />
</Style>
</ItemsControl.ItemContainerStyle>
<ItemsControl.Template>
<ControlTemplate>
<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
<ItemsPresenter />
</ScrollViewer>
</ControlTemplate>
</ItemsControl.Template>
<ItemsControl.ItemTemplateSelector>
...
</ItemsControl.ItemTemplateSelector>
</ItemsControl>
This post on MSDN 看起来很有希望,但是在我的代码中实现它,或者甚至明确地用 Canvas 代替 WrapPanel 都没有用(或者,我应该说,我没有能够让它工作)。
我也查看了 this post,但该解决方案对我不起作用,因为我需要 canvas 才能根据内容调整大小(否则滚动条是始终可见)。
提前谢谢您!
canvas的width/height在未明确设置时,将从ItemsControl
继承。 "dynamic sizing" 您期望的行为并不是开箱即用的面板大小调整和布局方式。
您的选择是:
- 明确设置
ItemsControl
Width/Height。 - 显式设置 Canvas Width/Height。