【问题标题】:WPF Sizing Grid.Row to contentWPF 调整 Grid.Row 到内容的大小
【发布时间】:2013-09-14 17:16:43
【问题描述】:

我有一个使用SizeToContent="WidthAndHeight" 的窗口,并且我有一个包含三行的列。行是这样定义的:

<Grid.RowDefinitions>
    <RowDefinition />
    <RowDefinition />
    <RowDefinition />
</Grid.RowDefinitions>

内容由上面每一行的另一个网格面板组成。这些面板中的每一个都包含一个标签和一个列表框。 ListBox 动态添加或删除其内容。因此,它可能只有一项,也可能有 100 项。

我的问题是:当我的应用程序启动时,上述三行的大小会根据其中的内容进行调整。所以它看起来很整洁。如果第一行在 ListBox 中只包含一个项目,它将调整它的大小以适合这些项目。另外两行(如果内容过多)会将剩余的空间分成两半,如果用户想要查看每一行的溢出,则它们的滚动条可见。但是,一旦我重新调整主窗口的大小,这三行将立即重新调整自己的大小,使每一行的高度完全相同。

我尝试在外部网格的行定义中使用Height="Auto";但是,这会将每一行的大小调整为精确地适合内容,从而导致它们溢出屏幕,而无需启用滚动条。

我已经尝试了所有我知道的设置(关键:知道),但我无法解决它。现在我摆脱了SizeToContent,这样就不会发生那个奇怪的错误,但是无论行中的内容量如何,行的大小都是相互成比例的......我希望它是另一种方式。我不希望每一行都有一个静态高度,而是让它们根据其中的内容量动态调整自己的大小,而不会离开屏幕。

有没有办法解决这个问题?

【问题讨论】:

    标签: c# wpf listbox gridpanel sizetocontent


    【解决方案1】:

    在您的 XAML 中,您可以绑定到 ViewModel 中的属性

    <Grid.RowDefinitions>
        <RowDefinition Height="{Binding Row1Height}"/>
        <RowDefinition Height="{Binding Row2Height}"/>
        <RowDefinition Height="{Binding Row3Height}"/>
    </Grid.RowDefinitions>
    

    然后在你的 ViewModel 中

    public int Row1Height { get; set; }
    public int Row2Height { get; set; }
    public int Row3Height { get; set; }
    

    一旦有了内容,就可以进行一些计算来填充该值。

    【讨论】:

    • 似乎是个好主意。就计算而言,做了大量工作,但我还没有找到其他可以完成此任务的方法。
    【解决方案2】:

    要做到这一点,您必须创建自己的自定义Panel,它比标准Grid 更智能地处理大小分布。这个项目可能是一个很好的起点:ConstrainingStackPanel

    【讨论】:

    • 这是一个很棒的链接。这非常像我想要完成的。它包含可用空间内的所有内容。非常感谢!
    【解决方案3】:

    假设我正确理解了您的问题,您是否尝试将其包装在 ScrollViewer 中并关闭 ListView 的 scollbar?

    我发现 WPF 中的布局渲染既可以是积极因素,也可以是拐杖。在调整内容大小时,要让它正常工作有时会让人头疼。

    如果 ScrollViewer 不是您想要采用的方法,您可以通过编写某种附加行为来轻松完成类似的事情(我过去曾这样做过),但在这种情况下,这有点矫枉过正。

    ScrollViewer 方法示例:

    <Grid>
      <ScrollViewer>
            <ListView ItemsSource="{Binding Something}" ScrollViewer.VerticalScrollBarVisibility="Hidden">
      :
      :
      :
      </ScrollViewer>
    </Grid>
    

    【讨论】:

    • 我试过这种方法;但是,如果我将所有这些都添加到 ScrollViewer,那么我将同时滚动浏览所有三个。问题在于,如果第一个有大量内容,那么另外两个将在屏幕外的某个地方。我希望所有三个同时可见。如果每一个都被包裹到 ScrollViewer 中,那么就会出现与我之前类似的结果。
    • 我明白了……如果我是你,我可能会看看编写一个附加的行为来处理自动调整大小。这将使您完全控制尺寸。不幸的是,我现在没有足够的资金坐下来做这件事。不过我知道这是可行的。
    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多