如何使用 XAML 和 C# 在 UWP 的文本框中设置行数限制
How can I set limit of Lines in TextBox in UWP using XAML and C#
我想在启用了 TextWrap 的文本框中设置最大行数。我为这个答案尝试了多个地方,但我失败了。请帮我找到答案。
UPDATE: The current solutions suggest either counting the total number of characters or splitting the content by line breaks and counting the lines, but these solutions do not provide the expected result when text wrapping is enabled.
所以基本上你可以计算行数并做一些限制。要计算行数,请使用此代码:
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
}
}
这是基本代码,但原理是一样的。要限制行数,您可以禁用进一步插入新行字符或其他限制。
How can I set limit of Lines in TextBox in UWP using XAML and C#
在 UWP TextBox 中无法完美地做到这一点。与WPF的TextBox有一个TextBox.MaxLines Property不同,UWP中的TextBoxclass没有内置这样一个属性。就像@10 Devlops 说的,你需要自己做。
除了@10开发者提供的方案外,我的建议是使用TextBox.MaxLength Property,可以限制TextBox中文本的最大长度。您可以将此 属性 与@10 开发提供的解决方案结合起来,以获得取决于您自己的场景的新解决方案。
Text wrapping 添加了一个新维度来限制 TextBox 中的行数,为此我们需要注意行数会受到分辨率和在操作系统级别应用的缩放因子,以及 UWP 布局中使用的许多布局概念通常是相对的或动态的,影响视觉状态的方式很难为所有用户保持一致。
例如,在一个用户的运行时只能占两行的文本,对于另一个用户或更改表单宽度时可能很容易换成 3 行。
Even after doing your best to limit a wrapped text box to a specific number of lines, we have to expect that over time, we will get it wrong, if the number of lines is important for layout reasons then you might consider trimming or truncating the text or even using RichTextBlockOverflow
您可以尝试 中的解决方案,然后根据文本的高度(而不是具体的行数)进行验证。
不过,我过去也通过将 TextBox 设置为固定高度(当然还有宽度)并针对 Scrollbar 状态进行验证而取得了成功。不幸的是,很难直接访问垂直滚动条的可见性,但我们可以在 TextBox
模板内的 ScrollViewer
元素上使用 ExtentHeight
和 ViewportHeight
。
If the ExtentHeight
is greater than the ViewportHeight
then the scrollbar should be visible. If the Visual layout only allows the total number of lines that you want to support then the scrollbar should not ever be visible.
访问 ScrollViewer
变得有趣,这里讨论选项 How do access the scrollviewer of a TextBox in code
所以试试这个作为对 的改编:
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
}
}
在静态中定义此扩展方法class:
(使用模式匹配,所以与引用的原文有点不同post)
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;
}
I don't normally use this for validation of content, but I do use it to add buttons to toolbars that allow the user to quickly scroll to the top or bottom of the content and to toggle the visibility of such controls.
我想在启用了 TextWrap 的文本框中设置最大行数。我为这个答案尝试了多个地方,但我失败了。请帮我找到答案。
UPDATE: The current solutions suggest either counting the total number of characters or splitting the content by line breaks and counting the lines, but these solutions do not provide the expected result when text wrapping is enabled.
所以基本上你可以计算行数并做一些限制。要计算行数,请使用此代码:
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
}
}
这是基本代码,但原理是一样的。要限制行数,您可以禁用进一步插入新行字符或其他限制。
How can I set limit of Lines in TextBox in UWP using XAML and C#
在 UWP TextBox 中无法完美地做到这一点。与WPF的TextBox有一个TextBox.MaxLines Property不同,UWP中的TextBoxclass没有内置这样一个属性。就像@10 Devlops 说的,你需要自己做。
除了@10开发者提供的方案外,我的建议是使用TextBox.MaxLength Property,可以限制TextBox中文本的最大长度。您可以将此 属性 与@10 开发提供的解决方案结合起来,以获得取决于您自己的场景的新解决方案。
Text wrapping 添加了一个新维度来限制 TextBox 中的行数,为此我们需要注意行数会受到分辨率和在操作系统级别应用的缩放因子,以及 UWP 布局中使用的许多布局概念通常是相对的或动态的,影响视觉状态的方式很难为所有用户保持一致。
例如,在一个用户的运行时只能占两行的文本,对于另一个用户或更改表单宽度时可能很容易换成 3 行。
Even after doing your best to limit a wrapped text box to a specific number of lines, we have to expect that over time, we will get it wrong, if the number of lines is important for layout reasons then you might consider trimming or truncating the text or even using RichTextBlockOverflow
您可以尝试
不过,我过去也通过将 TextBox 设置为固定高度(当然还有宽度)并针对 Scrollbar 状态进行验证而取得了成功。不幸的是,很难直接访问垂直滚动条的可见性,但我们可以在 TextBox
模板内的 ScrollViewer
元素上使用 ExtentHeight
和 ViewportHeight
。
If the
ExtentHeight
is greater than theViewportHeight
then the scrollbar should be visible. If the Visual layout only allows the total number of lines that you want to support then the scrollbar should not ever be visible.
访问 ScrollViewer
变得有趣,这里讨论选项 How do access the scrollviewer of a TextBox in code
所以试试这个作为对
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
}
}
在静态中定义此扩展方法class:
(使用模式匹配,所以与引用的原文有点不同post)
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;
}
I don't normally use this for validation of content, but I do use it to add buttons to toolbars that allow the user to quickly scroll to the top or bottom of the content and to toggle the visibility of such controls.