在WPF列表或网格中调整字体大小以充分利用空间

5
我有一个应用程序,用于显示体育联赛的联赛表。这些表格基本上是网格,每个团队的不同列代表统计数据,例如比赛场次、胜利、失败、进球和失球等。因此,联赛表具有一个有趣的属性:对于给定的比赛,我们始终拥有相同数量的行(代表团队)。由于WPF控件没有外观,我可以直接使用ListBox、ListView、ItemsControl甚至DataGrid。这并不重要。
然而,我想要的是一些我尚未能够实现的东西:在表格大小(实际上是窗口大小)确定的情况下,所有团队应始终可见(无需垂直滚动),所有统计列(由用户选择)应可见,并且字体大小应反映这一点,以便尽可能大而不会使任何列变得太大而无法容纳内容。
我可以轻松地使用UniformGrid来实现无垂直滚动部分。然而,调整字体大小似乎并不那么容易。
当然,有ViewBox,它允许每个表格单元格的内容自行调整大小,以尽可能大,但这可能会导致丑陋的结果,因为您最终会得到一堆大小不同的单元格。
我不指望得到一个简单的答案,但如果有可能,我很想听听。总之:
1.表格应随窗口大小调整,同时始终显示所有数据而无需滚动条。 2.字体大小应设置为允许每行的每个列显示其全部内容的最大可能大小。 3.除了一个使用“* - sizing”来占用剩余空间的列之外,所有列都应尽可能地缩小以使所有内容可见。
那么..有没有聪明的方法来做到这一点? :)
2个回答

7

你可以将窗口的子元素设为ViewBox,把所有内容放在其中,这样行得通吗?我不确定你的具体操作是否能够实现,但以下是一个极其简单的示例:

<Window x:Class="ZoomTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1">
    <Viewbox>
        <StackPanel>
            <TextBlock>2</TextBlock>
            <TextBlock>Getting longer</TextBlock>
            <TextBlock>Here is some really long text...</TextBlock>
        </StackPanel>
    </Viewbox>
</Window>

整个内容始终可见,字体大小最大化,所有文本等比例缩放。

没错!我这个人真是太蠢了,还多亏了你让我加深了印象。我一直以为要在每个单元格内设置视图框,但那当然是完全愚蠢的想法。我只需要掌握好Stretch属性就可以轻松搞定了 - 谢谢! - Rune Jacobsen

1

你可以通过设置字体大小来完成这个功能。将FontSize设置为绑定表达式,该表达式绑定到具有自定义IValueConverter的TextBox本身({Binding RelativeSource={x:Static RelativeSource.Self}, Converter={StaticResource FontSizeConverter}}或类似的东西)。

在转换器内部,现在你已经有了一个对TextBox的引用,可以用它来获取文本内容、控件的大小、父控件(网格)的大小等。你可能可以使用这些信息来实时计算它。

如果你需要TextBox根据彼此做出决定,你可以在页面级别上拥有一个静态回调,在Convert方法中调用它,从而确定是否仍处于调整模式,并跟踪任何其他信息(已经计算出的最小或最大字体大小等)。这是一个复杂的过程,但应该有几种方法可以实现。你甚至可以先隐藏所有框中的文本,循环遍历所有文本框,做出这种决定(最小字体大小),然后以编程方式设置字体大小并淡入视图。


谢谢您的回复 - 我想我知道如何这样做,但是Daniel Pratt的答案解决了问题,而且没有额外的工作,所以我接受了他的答案。还是谢谢! - Rune Jacobsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接