C# 弹出窗口中的文本框不';无法在WPF应用程序中获得焦点

C# 弹出窗口中的文本框不';无法在WPF应用程序中获得焦点,c#,wpf,textbox,popup,focus,C#,Wpf,Textbox,Popup,Focus,我正在为一个信息亭应用程序构建一个窗口,该应用程序有一个管理屏幕,可以连接到wifi网络。实际上,我正在移植一个已有的WinForms应用程序,它已经做到了这一点,但并没有给我们想要创建更有趣的UI的灵活性。所以,我们要转到WPF 这个窗口非常简单,它有一个列表视图来显示它找到的网络,如果你点击其中一个,它就会连接到它。为了连接,如果需要,我们需要提示输入该网络的安全代码。为此,我们打开一个弹出窗口,它有三个部分:顶部的“dialog-y”提示部分、间隔行和空白边框,空白边框位于屏幕键盘后面,但

我正在为一个信息亭应用程序构建一个窗口,该应用程序有一个管理屏幕,可以连接到wifi网络。实际上,我正在移植一个已有的WinForms应用程序,它已经做到了这一点,但并没有给我们想要创建更有趣的UI的灵活性。所以,我们要转到WPF

这个窗口非常简单,它有一个列表视图来显示它找到的网络,如果你点击其中一个,它就会连接到它。为了连接,如果需要,我们需要提示输入该网络的安全代码。为此,我们打开一个弹出窗口,它有三个部分:顶部的“dialog-y”提示部分、间隔行和空白边框,空白边框位于屏幕键盘后面,但有漂亮的圆角

顶部部分有一个标题、一个文本框和两个按钮,即“连接”和“取消”。再说一次,没什么复杂的

所有这些都有效。你点击一个网络,我们会显示弹出窗口和键盘,除了:密码文本框永远不会得到焦点。即使你点击它。没有焦点。我发现让它聚焦的唯一诀窍是点击关闭弹出窗口(就像回到listview,如果弹出窗口打开,它已经忽略点击,所以它是安全的),然后点击文本框上的后退,瞧!集中我真的不想把它放在用户手册里

以下是xaml的弹出部分:

<Popup x:Name="popPasscode" Placement="Top" HorizontalOffset="50" VerticalOffset="1000" AllowsTransparency="True" >
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="50" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <Border Grid.Row="0"  Background="White" CornerRadius="20" Width="600" Height="400">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="*" />
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>
                <Border Grid.Row="0" Background="#464646" Height="50" Margin="8,10,8,0" CornerRadius="25" >
                    <Label x:Name="lblTitleSecurityCode" Content="Enter the security code" Foreground="White" FontFamily="Arial" FontSize="30" FontWeight="Bold" HorizontalAlignment="Center"/>
                </Border>
                <TextBox Grid.Row="1" x:Name="tbPasscode" Height="50" FontFamily="Arial" FontSize="30" Margin="40,0,40,0"/>
                <StackPanel Grid.Row="2" Orientation="Horizontal" Margin="10,0,10,10" HorizontalAlignment="Center">
                    <Controls:ImageButton x:Name="btnCodeConnect" Content="Connect" Height="70" Width="275" Foreground="Black" Style="{DynamicResource PlainButton}" FontFamily="Arial" FontSize="30" FontWeight="Bold" Click="btnCodeConnect_Click"  HorizontalAlignment="Center" VerticalAlignment="Center"  />
                    <Controls:ImageButton  x:Name="btnCodeCancel" Content="Cancel" Height="70"  Width="275" Foreground="Black" Style="{DynamicResource PlainButton}" FontFamily="Arial" FontSize="30" FontWeight="Bold" Click="btnCodeCancel_Click"  HorizontalAlignment="Center" VerticalAlignment="Center"  />
                </StackPanel>
            </Grid>
        </Border>
        <Border Grid.Row="2" x:Name="brdrKbd" Background="White" CornerRadius="20" Width="1200" Height="420"/>
    </Grid>
</Popup>
我已经为tbPasscode的DependencyElement尝试了两种不同的方法,但是我真的不知道我在做什么,或者我在做什么有什么不同。哦,我有没有提到我刚刚完成了WPF编码的第一周?是的,WPF新手警报


我看到了,但没有多大帮助,因为我认为我已经在做这些了。

注册到
ListView/ListViewItem
上的
MouseUp
事件,而不是
MouseDown
。 在处理程序中,您可以执行以下操作:

     popPasscode.IsOpen = true;
     Keyboard.Focus(tbPasscode);

ListView上的
MouseUp
将焦点从
Popup
上移开,所以在MouseUp中打开你的Popup而不是MouseDown

你能分享你如何打开Popup的代码吗?它在第二个代码部分的第一行,是ListView的点击事件处理程序,我在弹出窗口中将IsOpen设置为true。睡眠是一件多么美妙的事情。屏幕键盘是一个旧的C++应用程序,它打开了NOVAc激活设置。如果这就是问题所在呢?所以我试着不打开键盘,我可以点击文本框,无需点击背景就可以聚焦。在打开osk后,通过添加对Activate()的调用解决了最初的问题-显然,您可以随心所欲地设置焦点,但它不会激活,至少与我的预期相反。现在,它仍然没有将焦点设置在我想要的地方…我没有使用mousedown,我使用的是onselection,但是很明显,这发生在mousedown期间。我交换了mouseup,使用在这里找到的代码()来获取行,它成功了。谢谢哦,在读了更多的书之后,我用一个简单的键盘替换了所有的FocusManager垃圾;更易于维护。
     popPasscode.IsOpen = true;
     Keyboard.Focus(tbPasscode);