使用带有Canvas的ItemsControl的ScrollViewer作为ItemsPanel

时间:2018-02-12 22:53:51

标签: wpf canvas scrollviewer itemscontrol

我有一个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,但解决方案对我不起作用,因为我需要画布能够使用内容调整大小(否则滚动条始终可见)。

提前谢谢你!

1 个答案:

答案 0 :(得分:1)

未明确设置时画布的宽度/高度将从ItemsControl继承。 &#34;动态调整&#34;您期望的行为并不是面板尺寸和布局如何开箱即用。

您可以选择:

  1. 明确设置ItemsControl宽度/高度。
  2. 明确设置画布宽度/高度。