WPF / XAML - 文字可以自动调整大小吗?

4
对于一个固定大小的可换行文本区域,是否有任何方法可以根据文本的数量尽可能地增大字体大小?
例如,如果您有一个500x500的区域,其中包含文本“Hello”,那么字体大小将非常大。但是,如果您有一段文本,则字体大小将较小以适应该区域。
我已经查看了Viewbox,但无法看到它可以与可换行文本一起使用。
任何能够实现此功能的XAML或代码都将有所帮助(不必是特定控件)。
1个回答

3

你所询问的比听起来要复杂,但我会给你一个想法:

<DockPanel x:Name="LayoutRoot">
    <TextBox x:Name="text" Text="this is some text and some more text I don't see any problems..." DockPanel.Dock="Top" TextChanged="text_TextChanged"/>
    <TextBlock DockPanel.Dock="Top" Text="{Binding ElementName=tb, Path=FontSize}"/>
    <Border Name="bd" BorderBrush="Black" BorderThickness="1">
        <TextBlock Name="tb" Text="{Binding ElementName=text, Path=Text}" TextWrapping="Wrap"/>
    </Border>
</DockPanel>

在后端代码中:

public MainWindow()
{
    this.InitializeComponent();
    RecalcFontSize();
    tb.SizeChanged += new SizeChangedEventHandler(tb_SizeChanged);
}

void tb_SizeChanged(object sender, SizeChangedEventArgs e)
{
    RecalcFontSize();
}

private void RecalcFontSize()
{
    if (tb == null) return;
    Size constraint = new Size(tb.ActualWidth, tb.ActualHeight);
    tb.Measure(constraint);
    while (tb.DesiredSize.Height < tb.ActualHeight)
    {
        tb.FontSize += 1;
        tb.Measure(constraint);
    }
    tb.FontSize -= 1;
}

private void text_TextChanged(object sender, TextChangedEventArgs e)
{
    RecalcFontSize();
}

试一试,拖动它,改变文本...


它适用于(200,200),但不幸的是,它不适用于(440,330)。如果您尝试该约束条件,您会注意到底部线被剪裁了。如果有屏幕截图和示例应用程序,那将有所帮助。有什么想法吗? - whitneyland
现在尝试。请注意,这只是一个引导,可能有更好的方法来达到最佳字体大小,而不需要逐步增加1... - Aviad P.
通过最后一次修订,它似乎在所有情况下都能完美工作 - 谢谢。看起来只使用高度是关键。我现在要开发一个自定义控件,以便可以轻松地将其添加到Xaml中而不更改窗口代码。我已将您的答案标记为正确。 - whitneyland
没有问题 - 我会尝试发布带有二进制和源代码的版本,以便与可能发现它有用的任何人分享。 - whitneyland
仍然不起作用 - 将此文本添加到上面的示例中“有问题的东西”。当缩小窗口时,单词“有问题的”会分成单独的字母,而不是缩小文本。WPF无法被驯服! - whitneyland
显示剩余2条评论

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