【问题标题】:Using a ScrollViewer with an ItemsControl with a Canvas as the ItemsPanel使用带有画布作为 ItemsPanel 的 ItemsControl 的 ScrollViewer
【发布时间】:2018-02-13 07:11:00
【问题描述】:

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

提前谢谢您!

【问题讨论】:

    标签: wpf canvas scrollviewer itemscontrol


    【解决方案1】:

    如果未明确设置画布的宽度/高度,将继承自 ItemsControl。您所期望的“动态调整大小”行为并不是开箱即用的面板大小调整和布局方式。

    你的选择是:

    1. 显式设置ItemsControl 宽度/高度。
    2. 显式设置画布宽度/高度。

    【讨论】:

    • 啊,这就是我所担心的。如果我在添加它们时计算画布内容的大小并以这种方式更新宽度/高度,也许它会起作用?编辑:是的,它确实可以按我的需要工作。感谢您帮助解决这个问题,迈克尔!
    猜你喜欢
    • 2020-07-15
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多