我尝试检测TextBox是否溢出。我使用这样的代码:
textbox.UpdateLayout;
textbox.ExtentWidth > textbox.ViewportWidth
我在以下事件处理程序中使用它:
Loaded
TextChanged
TargetChanged
(绑定使用NotifyOnTargetUpdated = True
和UpdateSourceTrigger=PropertyChanged
,IsAsync = False
)
这很好。除了一种情况。如果TextBox开始溢出,则不会检测到。如果Textbox.Text
使用绑定,则即使在TargetChanged
事件处理程序中,ExtentWidth也为零。如果它是诸如"123"
之类的纯文本,它将获得正确的值。我想念什么?
谢谢。
答案 0 :(得分:1)
应该可以。 TextBoxBase.TextChanged
有时表现与预期不同。在文本更改后 执行一些内部操作,例如,插入符号定位或测量。测量会影响TextBoxBase.ExtendWidth
和TextBoxBase.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;
});
}