文本框事件仅触发第二次

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 上,我用文本框更改文本块的可见性,这里我想要全选。 嗯...代替解释,请编辑您的问题并添加完整的可重现代码。这样人们很快就能看到问题。现在我们必须猜测。

以上是关于文本框事件仅触发第二次的主要内容,如果未能解决你的问题,请参考以下文章

Access表单上的文本框传递先前的值

Click事件监听器仅在第二次工作

能触发文本框change事件的操作

C# WinForm 文本框离开焦点事件 问题???

文本框中,回车键触发事件的js代码[多浏览器兼容]

用户在文本框中按下回车的 JQuery 事件?