WPF TextBox检测文本是否溢出

时间:2020-08-15 18:30:00

标签: c# wpf

我尝试检测TextBox是否溢出。我使用这样的代码:

textbox.UpdateLayout;
textbox.ExtentWidth > textbox.ViewportWidth

我在以下事件处理程序中使用它:

Loaded
TextChanged
TargetChanged 

(绑定使用NotifyOnTargetUpdated = TrueUpdateSourceTrigger=PropertyChangedIsAsync = False

这很好。除了一种情况。如果TextBox开始溢出,则不会检测到。如果Textbox.Text使用绑定,则即使在TargetChanged事件处理程序中,ExtentWidth也为零。如果它是诸如"123"之类的纯文本,它将获得正确的值。我想念什么?

谢谢。

1 个答案:

答案 0 :(得分:1)

应该可以。 TextBoxBase.TextChanged有时表现与预期不同。在文本更改后 执行一些内部操作,例如,插入符号定位或测量。测量会影响TextBoxBase.ExtendWidthTextBoxBase.ViewportWidth

解决方案是推迟所有打算由TextChanged事件触发的自定义操作。 TextBox的所有内部操作完成后,应执行自定义代码。
您可以通过将代码异步排队到调度程序的队列中来推迟执行代码。当前所有调度程序操作完成后,将执行异步调度程序操作:

private void TextBoxBase_OnTextChanged(object sender, TextChangedEventArgs e)
{
  this.Dispatcher.InvokeAsync(
    () =>
    {
      var textBox = sender as TextBox;
      bool textBoxHasOverflowContent = textBox.ExtentWidth > textBox.ViewportWidth;
    });
}