文本换行增加了一个新维度来限制 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<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;
}
我通常不使用它来验证内容,但我确实使用它来向工具栏添加按钮,允许用户快速滚动到内容的顶部或底部并切换此类控件的可见性。