文本框事件仅触发第二次
Posted
技术标签:
【中文标题】文本框事件仅触发第二次【英文标题】:Textbox event only fires the second time 【发布时间】: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 语句毫无用处。它的行为是相同的:在第一次单击时,它会触发两个事件,但只呈现焦点事件。接下来它也会渲染焦点和全选。 【参考方案1】:不确定你想要达到什么目标。但是您描述的可以通过以下代码实现:
XAML
<StackPanel Orientation="Horizontal">
<TextBox x:Name="MyTextBox" LostFocus="MyTextBox_OnLostFocus" Width="100"/>
<TextBlock x:Name="MyTextBlock" Text="Binding ElementName=MyTextBox, Path=Text" MouseLeftButtonDown="MyTextBlock_OnMouseLeftButtonDown"/>
</StackPanel>
C#
private void MyTextBox_OnLostFocus(object sender, RoutedEventArgs e)
MyTextBox.Visibility = Visibility.Hidden;
MyTextBlock.Visibility = Visibility.Visible;
private void MyTextBlock_OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
MyTextBlock.Visibility = Visibility.Collapsed;
MyTextBox.Visibility = Visibility.Visible;
MyTextBox.Focus();
MyTextBox.SelectAll();
【讨论】:
我试过了,但 selectall 从来没有用过。我可以提供更好的解释:我希望在文本块上的 MouseLeftButtonDown 上选择全选,并单击上下文菜单选项。我在 MainWindow 中有一个树视图,并且我有一个带有文本块的堆栈面板和不同文件中的文本框,我根据用户的操作将其动态添加到树视图中。当我单击 StackPanel 时,第一次单击突出显示它,双击时,它打开一个页面,在 MouseLeftButtonDown 上,我用文本框更改文本块的可见性,这里我想要全选。 嗯...代替解释,请编辑您的问题并添加完整的可重现代码。这样人们很快就能看到问题。现在我们必须猜测。以上是关于文本框事件仅触发第二次的主要内容,如果未能解决你的问题,请参考以下文章