调整WPF列表或网格中的字体大小以正确使用空间

时间:2009-03-11 09:55:54

标签: wpf listview datagrid listbox

我有一个显示体育联盟排名表的应用程序。这些表基本上是不同列的网格,代表每个团队的统计数据,如比赛,赢,输,得分和得分等。因此,联赛表有一个有趣的属性:对于给定的比赛,我们总是有相同的数量行(代表团队)。由于WPF控件是无形的,我可能直接使用ListBox,ListView,ItemsControl,甚至是DataGrid。不应该那么重要。

但是,我想要一些我还没有实现的东西:给定表格大小(实际上,窗口大小),所有团队应始终可见(无垂直滚动),所有统计数据列(由用户选择)应该是可见的,字体大小应该反映这一点,以便它尽可能大,而没有任何列变得太大,内容不适合。

我可以轻松使用UniformGrid来实现无垂直滚动的部分。但是,调整字体大小似乎并不那么容易。

当然有ViewBox,它允许每个表格单元格的内容单独调整自己的大小,但这可能会导致丑陋,因为你最终会得到一堆不同大小的单元格

我不希望得到一个简单的答案,但如果可能的话,我很乐意听到它。总结:

  1. 表格应调整窗口大小,同时始终显示没有滚动条的所有数据。

  2. 字体大小应设置为最大可能的大小,允许每行的每一列显示其所有内容。

  3. 所有列的大小都应尽可能小,以便所有内容都可见,但是一列“* -sizing”以占用剩余空间。

  4. 那么......有什么聪明的方法吗? :)

2 个答案:

答案 0 :(得分: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>

整个内容始终可见,最大可能的字体大小。所有文本均匀缩放。

答案 1 :(得分:1)

您可以使用字体大小执行此类操作。将FontSize设置为绑定表达式,该表达式使用自定义IValueConverter({Binding RelativeSource={x:Static RelativeSource.Self}, Converter={StaticResource FontSizeConverter}}或类似的东西)绑定到TextBox本身。

在转换器中,您现在可以使用TextBox来获取文本内容,控件大小,父控件(网格)的大小等等。您可以使用这些信息可以即时计算。

如果您需要TextBoxes基于彼此做出此决定,您可以在Convert方法中调用页面级别的静态回调,这将确定您是否仍处于调整大小模式并保持跟踪任何其他信息(已计算的最小或最大字体大小等)。这是一个复杂的过程,但应该有几种方法可以做到这一点。您甚至可以首先隐藏所有框中的文本,循环显示所有文本框(最小字体大小),然后以编程方式设置字体大小并将其淡入视图。