WPF:Scrollviewer 不将内容限制为窗口大小

Posted

技术标签:

【中文标题】WPF:Scrollviewer 不将内容限制为窗口大小【英文标题】:WPF: Scrollviewer not limiting content to size of window 【发布时间】:2022-01-16 19:56:54 【问题描述】:

我有一个带有滚动查看器的树视图。当树视图变得充满树节点时,我希望滚动条出现。但无论树视图有多大,它都不会出现。树视图在窗口外生长,但不会限制在窗口内。

目前的结构是: MainWindow 包含一个显示页面的 Frame,该页面包含一个用户控件,该用户控件包含一个树视图。

用户控件设置为“拉伸”,但不是拉伸以适应其父级(限制空间并因此显示滚动条),而是拉伸以适应其所有子级(从而拉伸到屏幕外)。

我将如何继续将“自动”大小限制为它的父级,而不是让它显示所有子级?

How i would like it to look/work like

How it actually looks/works like

代码,有点无关紧要,我只是想知道我应该如何应用滚动视图:

主窗口:

        <Frame Source="View/Pages/StartPage.xaml" x:Name="MainFrame" NavigationUIVisibility="Hidden"/>
    </DockPanel>

主页:

<Grid>
<Frame Source="ParamFrameV.xaml" x:Name="pageFrame" HorizontalAlignment="Center" VerticalAlignment="Stretch"/>

ParamFrameV(用户控件):

    <Grid>
<ScrollViewer VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Disabled" VerticalAlignment="Top" MaxHeight="I WANNA LIMIT HEIGHT SO THAT IT WONT GO OFF SCREEN" Width="283">
        <TreeView ItemsSource="Binding Nodes" ItemContainerStyle="StaticResource TreeViewItemExpandedStyle">
        //irrelevant code for this question
        </TreeView>
</ScrollViewer>

【问题讨论】:

如果你设置或绑定Frame.Height 那么一切都应该工作。 您基本上要做的是隐藏树视图的原始滚动查看器并添加一个单独的滚动查看器来替换树视图。有两种方法可以在代码中执行此操作,因为纯 xaml 不支持绑定滚动索引或类似的 ***.com/questions/15151974/… 或为树视图项提供填充,从而产生滚动查看器一直移动到树视图之外的错觉 Rekshino) 绑定到什么?我不确定你是什么意思。 Denis)嗯,但我无法让滚动查看器在树视图上工作。即使在执行以下操作时:“ ”它也不起作用。滚动条显示但灰显,无论树视图中有多少项目,滚动条都不起作用。树视图仍然在窗口之外增长,而不是将其大小限制为父容器。父容器与树视图/滚动视图的行为无关 我写下了一个有点像你正在尝试做的事情的问题,看看这是否有帮助。我简化了您的代码,并使其成为一个最小的可重现示例,因为我的 ofc 没有您的自定义控件和 itemoruces 【参考方案1】:

这对我来说很好用:

<Grid>
    <ScrollViewer Height="Binding ElementName=ParentGridName, Path=ActualHeight"" VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Disabled" VerticalAlignment="Top" Width="283">
        <TreeView Width="50" ScrollViewer.VerticalScrollBarVisibility="Disabled">
            <TreeViewItem Header="hi"></TreeViewItem> 
            <TreeViewItem Header="hi2"></TreeViewItem> 
            <TreeViewItem Header="hi3"></TreeViewItem> 
            <TreeViewItem Header="hi4"></TreeViewItem> 
            <TreeViewItem Header="hi5"></TreeViewItem> 
            <TreeViewItem Header="hi6"></TreeViewItem> 
            <TreeViewItem Header="hi7"></TreeViewItem> 
            <TreeViewItem Header="hi8"></TreeViewItem> 
        </TreeView>
    </ScrollViewer>
</Grid>

注意: 在树视图本身上滚动不会滚动,因为它会捕获您的滚动事件,但我敢打赌有办法解决这个问题

【讨论】:

它适用于我,就像它适用于你一样,但这不是我想要的。这样高度限制为 50,因此如果里面的项目组合超过 50,那么滚动条就会出现。问题是我没有固定大小。如果我调整窗口大小,那么我希望能够看到更多的树视图。树视图需要将其高度限制为其父控件的大小。看看“它的实际外观/工作方式”,树视图的高度变得大于包含树视图的用户控件的高度。我需要限制高度才能达到我想要的效果。 我编辑了你可以考虑将heigt绑定到父容器的答案 Binding ParentGridName, Path=ActualHeight 不起作用。它甚至不是一个有效的绑定表达式。使用 ElementName 或 RelativeSourceBinding。 @Clemens jup 你是对的,更新了 但是请注意,这样的绑定几乎从不需要,也不应该推荐。假设 ScrollViewer 的 Grid 父级已正确调整大小 - 通过布局 - 它也会调整其子元素的大小。然而,我们对该网格一无所知 - 例如。它是否是 UserControl 的 XAML 中的***元素,或者是否有其他父元素以某种方式干扰标准布局机制。

以上是关于WPF:Scrollviewer 不将内容限制为窗口大小的主要内容,如果未能解决你的问题,请参考以下文章

ScrollViewer 鼠标滚轮不滚动

WPF: 实现 ScrollViewer 滚动到指定控件处

WPF: 实现 ScrollViewer 滚动到指定控件处

无法让 WPF ScrollViewer 工作

如何删除WPF ScrollViewer边框

WPF自定义控件与样式-ScrollViewer与ListBox自定义样式