WPF中TextBox调用SelectAll()首次不生效仅第二次触发是什么原因
问题原因与修复方案
根因分析
- 代码执行顺序错误:当前逻辑先执行
SelectAll(),之后才给MyTextBox.Text赋值。第一次触发时SelectAll()执行时文本还未写入,后续的文本赋值操作会自动清空选中状态,因此第一次全选不生效。后续触发时TextBox已存在对应文本,相同文本覆盖不会清空选中状态,因此功能正常。 - WPF界面渲染存在异步调度逻辑:刚修改控件可见性、调用
Focus()后,控件状态还未完成渲染更新,直接调用SelectAll()可能因控件未就绪导致失效。
修复代码
调整代码执行顺序,先完成文本赋值,再通过Dispatcher调度全选逻辑,等界面完成当前渲染任务后再执行全选:
private void mniRename_Click(object sender, RoutedEventArgs e) { prevSelected.MyTextBlock.Visibility = Visibility.Collapsed; prevSelected.MyTextBox.Visibility = Visibility.Visible; // 先完成文本赋值 prevSelected.MyTextBox.Text = prevSelected.MyTextBlock.Text; prevSelected.MyTextBox.Focus(); // 调度全选逻辑到UI渲染完成后执行 Dispatcher.BeginInvoke(new Action(() => { prevSelected.MyTextBox.SelectAll(); }), System.Windows.Threading.DispatcherPriority.Input); }
MouseLeftButtonDown事件中的重命名逻辑也按上述规则调整即可。
内容的提问来源于stack exchange,提问作者bidibi
相关产品推荐
相关产品推荐

