【问题标题】:How can I set limit of Lines in TextBox in UWP using XAML and C#如何使用 XAML 和 C# 在 UWP 中的 TextBox 中设置行数限制
【发布时间】:2022-01-27 18:31:59
【问题描述】:

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

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

【问题讨论】:

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

标签: c# xaml uwp


【解决方案1】:

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

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

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

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

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

如果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<ScrollViewer>();
    if (scroller.ExtentHeight > scroller.ViewportHeight)
    {
        Debug.WriteLine("Limit reached");
        //your code here
    }
}

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

public static T FindChild<T>(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<T>(child);
            if (tChild != null) return tChild;
        }
    }
    return null;
}

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

【讨论】:

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

所以基本上你可以计算行数并做一些限制。要计算行数,请使用以下代码:

    private void textBox_TextChanged(object sender, RoutedEventArgs e)
    {
        int t = textBox.Text.Split('\n').Length;  
        if(t > 9)
        {
            Debug.WriteLine("Limit reached");
            //your code here
        }
    }

这是一个基本的代码,但原理是一样的。要限制行数,您可以禁用进一步插入新行字符或其他限制。

【讨论】:

  • 嗨@Develops,我的代码中不支持该文档,我尝试了相同的代码但也不支持文档。你能帮我知道为什么它不起作用吗?
  • 我正在使用文本框。
  • 对于文本框,它是 YourTextBoxName.Text 而不是 YourTextBoxName.GetText()
  • 我已恢复为原始代码,现在是 TextBox 代码。
  • @ShashankSingh 如果您需要特定的实现,您应该包含minimal reproducible example。文本换行意味着您想要测量文本,这可以做到,但更具体的是您的视图实现。
【解决方案3】:

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

在 UWP TextBox 中没有办法完美地做到这一点。与 WPF 的 TextBox 有一个TextBox.MaxLines Property 不同,UWP 中的 TextBox 类没有这样的内置属性。就像@10 Devlops 所说的那样,您需要自己完成。

除了@10开发提供的解决方案之外,我的建议是使用TextBox.MaxLength Property,它可以限制TextBox中文本的最大长度。您可以将此属性与 @10 开发提供的解决方案相结合,以获得取决于您自己的方案的新解决方案。

【讨论】:

  • 谢谢先生,在你们的帮助下我得到了答案。
  • 先生,如果我想用 jQuery 做同样的事情,那么我必须做什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-11
  • 2017-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多