C# TextBox.Focus()仅在后面有MessageBox.Show()时才起作用?

C# TextBox.Focus()仅在后面有MessageBox.Show()时才起作用?,c#,.net,wpf,textbox,focus,C#,.net,Wpf,Textbox,Focus,好的,显然还有很多,但这里是基本的。这似乎是一件很简单的事情,但它不起作用 我有一个标签。 我有一个文本框 标签的ZIndex=“1” 文本框的ZIndex=“0” i、 它们相互重叠,文本框不可见 当用户单击标签时(现在通过PreviewMouseLeftButtonDown,但在“生效”后将成为ViewModel中的命令),应用程序应将焦点设置为文本框 简单对吧?错了 如果我有这个代码…它不工作 private void inVisTxtBox_PreviewMouseLeftBut

好的,显然还有很多,但这里是基本的。这似乎是一件很简单的事情,但它不起作用

我有一个标签。 我有一个文本框

标签的ZIndex=“1” 文本框的ZIndex=“0”

i、 它们相互重叠,文本框不可见

当用户单击标签时(现在通过PreviewMouseLeftButtonDown,但在“生效”后将成为ViewModel中的命令),应用程序应将焦点设置为文本框

简单对吧?错了

如果我有这个代码…它不工作

    private void inVisTxtBox_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            inVisTxtBox.Focus();
//            TextBox_MouseDown(sender, e);
        }
如果我有这个代码…它确实有效

 private void inVisTxtBox_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            inVisTxtBox.Focus();
//            TextBox_MouseDown(sender, e);
            MessageBox.Show("This is ridiculous");
        }
最后是XAML:

 <Ctrls:AControl x:Class="<location of class>"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:CommandControls="clr-namespace:<location of custom controls>" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
    <Grid Margin="0,15,15,15">
        <!--<Button Height="50" Click="Button_Click">FOC</Button>-->
        <TextBox x:Name="inVisTxtBox" Focusable="True" Grid.ZIndex="0" Width="100" Margin="5"/>
        <Label Grid.ZIndex="1" Margin="5" Content="243234234234234" HorizontalAlignment="Left" Width="100" PreviewMouseLeftButtonDown="inVisTxtBox_PreviewMouseLeftButtonDown" 
               x:Name="KeyPress_TextBox"/>
    </Grid>
</Ctrls:AControl>

我复制了您的代码,它对我来说运行良好,即使使用previewmouseclick,似乎还有其他问题


在PreviewMouseLeftButtonDown事件触发后,向上抛出消息框可能会阻止焦点转移到它将要转移到的任何位置。也许用户控件本身正在获得关注

你提到文本框是不可见的?为什么呢?如果它实际上是看不见的,那么在不让它真正可见的情况下聚焦它又有什么意义呢?它本身不是“看不见的”。在标签后面。原因是我正在创建一个“按键”控件,它没有焦点,但会显示用户键入的内容。示例:1。用户点击标签。2.文本框获得焦点。3.用户开始输入。4.标签已绑定到TextBox文本属性。5.标签已更新,但用户并没有看到闪烁的光标等。现在我感到困惑。但是,如果您所要做的只是“在单击标签时将焦点设置为文本框”,那么上面的代码应该可以工作,而不需要MessageBox。你确定你把活动安排在了正确的地方吗?从事件处理程序的名称来看,它似乎是为文本框生成的。我100%同意……代码应该可以工作。你是不是碰巧试过?它不起作用。文本框永远不会聚焦。光标从不闪烁。永远不会应用键盘焦点。事件命名很奇怪,因为我一直在尝试不同的事情。事件已正确连接…我已设置断点进行确认。这真的很奇怪。我肯定这是件小事,很愚蠢……但我想知道发生了什么事。如果我用一个按钮替换它,它确实可以工作,谢谢你的骰子…我已经尝试了你可以尝试的每一个鼠标按下事件,我也尝试了每一个e.handled=true的事件,只是为了踢。如果您已经为WPF打开了您的开发环境,那么如果您想知道我是否疯了,那么很容易尝试和复制它:)。创建标签,创建文本框。选择一个mousedown事件作为标签,然后说“TextBox”。Focus()@user1631520我复制了你的代码,它对我来说运行良好,即使使用previewmouseclick,似乎还有其他问题。感谢尝试KDiTraglia。知道这一点其实很有帮助。我刚换成了MouseLeftButtonUP,现在可以用了。“我的UserControl中一定有什么东西在一路上抓住了焦点。@User163152是的,很可能向上抛出消息框会阻止焦点在触发
PreviewMouseLeftButtonDown
事件后转移到它要转移到的任何位置。也许用户控件本身正在获得关注?如果你能将你最后的评论作为答案发布,我将很高兴标记它。
<Button x:Name="KeyPress_TextBox" Grid.ZIndex="1" Margin="5" Content="243234234234234" HorizontalAlignment="Left" Width="100" Click="KeyPress_TextBox_Click">
    <Button.Template>
        <ControlTemplate TargetType="Button">
            <Label Content="{TemplateBinding Content}"/>
        </ControlTemplate>
    </Button.Template>
</Button>
Keyboard.Focus(inVisTxtBox);
FocusManager.SetFocusedElement(MainGrid,inVisTxtBox);
Keyboard.Focus(inVisTxtBox);