如何使用 XAML 和 C# 在 UWP 中的 TextBox 中设置行数限制

分享于2022年07月17日 c# uwp xaml 问答
【问题标题】:如何使用 XAML 和 C# 在 UWP 中的 TextBox 中设置行数限制(How can I set limit of Lines in TextBox in UWP using XAML and C#)
【发布时间】:2022-01-27 18:31:59
【问题描述】:

我想设置启用 TextWrap 的文本框中的最大行数。我为这个答案尝试了多个地方,但我失败了。请帮我找出答案。

更新: 当前的解决方案建议要么计算字符总数,要么通过换行符分割内容并计算行数,但这些解决方案在启用文本换行时无法提供预期的结果。

  • 先生,您能帮忙找到答案吗?@Roy Li - MSFT
  • 不能轻易同时使用 行数 文字换行 ,因为文字换行会由宽度决定使用的字体和字样,尤其是当你的 UI 是响应式的,这是 XAML 中的默认设置。这就是为什么我们传统上按字符总长度而不是像素宽度或高度进行过滤的原因。

【解决方案1】:

文本换行增加了一个新维度来限制 TextBox 中的 行数 ,为此我们需要注意行数可能会受到分辨率和缩放系数的影响操作系统级别,而且 UWP 布局中使用的许多布局概念通常是相对的或动态的,并且影响视觉状态的方式很难对所有用户保持一致。

例如,在一个用户的运行时中仅适合两行的文本可能很容易为另一个用户换成 3 行,或者当表单的宽度发生变化时。

即使在尽力将换行的文本框限制为特定的行数之后,我们也必须预料到,随着时间的推移,我们会弄错,如果行数出于布局原因很重要,那么您可能会考虑修剪或截断文本,甚至使用 RichTextBlockOverflow

您可以从 How can I measure the Text Size in UWP Apps? 尝试此解决方案,然后根据文本的高度进行验证,而不是具体的行数。

但是,我过去也通过将 TextBox 设置为固定高度(当然还有宽度)并针对 Scrollbar 状态进行了验证,从而获得了成功。不幸的是,很难直接访问垂直滚动条的可见性,但我们可以在 ScrollViewer 模板内的 ScrollViewer 元素上使用 ExtentHeight ViewportHeight

如果 ExtentHeight 大于 ViewportHeight ,那么滚动条应该是可见的。如果可视布局只允许您想要支持的总行数,那么滚动条应该永远不可见。

访问 ScrollViewer 很有趣,这里讨论了选项 How do access the scrollviewer of a TextBox in code

所以试试这个作为对 solution from @10 Develops 的改编:

private void textBox_TextChanged(object sender, RoutedEventArgs e)
{
    var scroller = (sender as TextBox).FindChild();
    if (scroller.ExtentHeight > scroller.ViewportHeight)
    {
        Debug.WriteLine("Limit reached");
        //your code here
    }
}

在静态类中定义此扩展方法:
使用模式匹配,所以和原来引用的帖子有点不同

public static T FindChild(this DependencyObject parent) where T : UIElement
{
    if (parent is T matchedParent) return matchedParent;
    int children = VisualTreeHelper.GetChildrenCount(parent);
    for (int i = 0; i < children; i++)
    {
        DependencyObject child = VisualTreeHelper.GetChild(parent, i);
        if (child is T matchedChild)
            return matchedChild;
        else
        {
            T tChild = FindChild(child);
            if (tChild != null) return tChild;
        }
    }
    return null;
}

我通常不使用它来验证内容,但我确实使用它来向工具栏添加按钮,允许用户快速滚动到内容的顶部或底部并切换此类控件的可见性。< /p>

  • 先生,我需要更多帮助,我想尝试使用 jQuery,然后我必须做什么? @Chris Schaller
  • 您应该将其作为一个新问题发布,技术相同,但语法明显不同。查看这篇文章以检测滚动条的可见性: stackoverflow.com/a/29188509/1690217 或这篇文章可能会帮助您开始 测量文本 解决方案: stackoverflow.com/a/66597679/1690217
  • 非常感谢先生,但我也尝试了这些,但我有一个问题,除了 Enter 键外,手机的键盘无法正常工作。