【发布时间】:2021-11-08 21:27:36
【问题描述】:
已编辑问题以提供更好的解释
我正在使用一个树视图,该树视图由一个带有文本块和内部文本框的堆栈面板组成。我想要实现的是文本框出现时文本的全部选择。 通过双击或从上下文菜单中选择一个选项,文本块会消失,从而可以看到文本框以重命名项目。 我想在文本块上的 MouseLeftButtonDown 上选择全选,并点击上下文菜单选项。
我的树视图包含在 MainWindow 中,并且堆栈面板(带有文本块和文本框)位于不同的文件中,我根据用户的操作将其动态添加到树视图中。
当我单击 StackPanel 时,第一次单击会突出显示它,双击它会打开一个页面,然后在 MouseLeftButtonDown 上(并单击上下文菜单选项)我使用文本框更改文本块的可见性,在这里我想要selectall() 事件被触发。
我尝试了以下代码,但它只工作了一半:
private void mniRename_Click(object sender, RoutedEventArgs e)
{
prevSelected.MyTextBlock.Visibility = Visibility.Collapsed;
prevSelected.MyTextBox.Visibility = Visibility.Visible;
prevSelected.MyTextBox.Focus();
if (prevSelected.MyTextBox.IsFocused)
{
prevSelected.MyTextBox.SelectAll();
}
prevSelected.MyTextBox.Text = prevSelected.MyTextBlock.Text;
}
问题是 SelectAll() 事件在第一次点击时不起作用,而 Focus() 起作用,然后在接下来的点击中一切正常。
代码总是以相同的方式执行。
有人知道为什么会这样吗?
【问题讨论】:
-
WPF 有时对于实际实例化可能会很奇怪。我会让更了解的人来实际回答这个问题,但我的猜测是,第一次,控件试图完成实际的初始渲染,但还不能集中注意力。时机,真的。第二次,它完全充实并且焦点有效。有时会发生这种情况,当控件最初没有显示,但稍后变得可见时,就像您正在做的那样。
-
你好,如果你删除if语句会发生什么,我的意思是如果你只写prev.Selected.MyTextBox.SelectAll();没有如果?
-
我想你可能会使用 Inputbinding,就像here 中描述的那样。如果您不熟悉命令,我可以编写一些示例代码作为答案。 :-)
-
@DonBoitnott 你好,很抱歉,我没有提到第一次呈现焦点事件而不是全选!
-
@DarkTemplar 你好!实际上,if 语句毫无用处。它的行为是相同的:在第一次单击时,它会触发两个事件,但只呈现焦点事件。接下来它也会渲染焦点和全选。