【问题标题】:Setting focus on Passwordbox将焦点放在 Passwordbox 上
【发布时间】:2019-09-03 07:26:45
【问题描述】:

所以我有一个带有登录窗口的 C# WPF 应用程序。在这个窗口中,我还有一个复选框,用于在他下次启动此应用程序时保护用户名(就像“记住我”)。

这个窗口的正常焦点显然是用户名。但是如果用户选择了记住我复选框,密码框应该是焦点(因为用户名已经填写)。

所以我写了这段代码:

在 Xaml 中:

<PasswordBox
    Name="PW"
    Grid.Row="2"
    Grid.Column="1"
    Margin="10 0 10 0"
    VerticalContentAlignment="Center"
    Height="45"/>

<CheckBox
    Name="CB"
    Grid.Row="1"
    Grid.Column="1"
    VerticalAlignment="Bottom"
    Margin="10"
    Content="Remember me"/>

<TextBox
    Name="Tbx"
    Grid.Row="1"
    Grid.Column="1"
    Margin="10 0 10 0"
    Text="{Binding Path=User}"
    VerticalContentAlignment="Center"
    Height="45"/>

<Button
    Name="Btn"
    Grid.Row="3"
    Grid.Column="1"
    Content="Login"
    Height="40"
    Width="100"
    VerticalAlignment="Center"
    HorizontalAlignment="Center"
    Command="{Binding Path=LoginUser}"
    Click="Btn_Click" 
    IsDefault="True"/>

Textbox中的Binding只是一个Property,它获取输入的Value。

Button 中的 Binding 也只是一个 Property,它检查用户名和密码,然后打开另一个窗口(所以我不认为,那是必要的)。

在 xaml.cs 中

private void Btn_Click(object sender, RoutedEventArgs e)
    {
        if (Cb.IsChecked == true)
        {
        Properties.Settings.Default.Username = Tbx.Text;
        }
    }

因此,使用此 Button_Click 我可以保护输入的用户名,以便应用程序下次可以记住它。 这可以正常工作。

现在是有趣的部分,Window_Loaded 事件:

try
    {
    IsolatedStorageFile isolatedStorage = IsolatedStorageFile.GetUserStoreForAssembly();
    StreamReader srReader = new StreamReader(new IsolatedStorageFileStream("isotest", FileMode.OpenOrCreate, isolatedStorage));

    string Input = srReader.ReadLine().TrimStart();
    string InputCut = Input.Substring(0, Input.Length - 25);
    Tbx.Text = InputCut;
    Cb.IsChecked = true;
    Pb.Focus()
    }
    catch(Exception ex)
    {}

因此,如果 CheckBox 被选中,他将通过 try 部分,并且正在使用 Pb.Focus() (我已经通过它),但不知何故密码框不会获得焦点。 然后我想,可能是因为 Try - Catch,所以我尝试将 Focus 设置在此之外,但出现了同样的问题。 Passwortbox 不会获得焦点。

我已经在谷歌上搜索过那个确切的问题,但我找不到任何东西(只有关于如何在密码框上设置焦点的普通问题)

我也在这里检查了 stackoverflow,但我发现的唯一内容是: Set focus on PasswordBox when application starts 这显然不是我的问题,我已经在 Window_Loaded 中获得了焦点。

预期的结果是,密码框获得焦点,但不知何故它不会。 我什至没有收到任何错误消息,所以我无法提供任何错误消息。

如果您需要更多信息,请联系我,然后我将编辑问题。 我希望你们中的任何人都知道这个问题,并且可以在这里帮助我。 谢谢!

【问题讨论】:

  • 您是否调试过您的代码以查明对Pb.Focus() 的调用是否被实际执行? Keyboard.Focus(Pb);呢?
  • 是的,正如我所说。 Pb.Focus() 正在执行。我刚刚尝试了 Keyboard.Focus(pb),它也被执行了,但是 Passwordbox 仍然没有得到焦点。
  • Focus() 是否返回 true?
  • 是的。我只是选择了“var a = Pb.Focus()”,当我通过时,a 是真的
  • 请提供您的问题的MCVE

标签: c# wpf focus passwordbox


【解决方案1】:

我猜你的问题可能被你的空捕获隐藏了。

IE 你有一个错误,但捕获只是“吃掉”它,所以你永远看不到它。

你可以跨过而没有注意到它跳到了陷阱,这似乎很奇怪。

当然,单步执行会打乱任何专注。

这是工作标记和代码:

    <StackPanel>
        <TextBox
            Name="Tbx" Height="45"/>
        <PasswordBox
            Name="PW" Height="45"/>
        <CheckBox
           Name="CB" Content="Remember me"/>
        <Button
          Name="Btn"  Height="40"  Width="100" IsDefault="True"/>
    </StackPanel>


    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        string InputCut = "Blaa";
        Tbx.Text = InputCut;
        CB.IsChecked = true;
        PW.Focus();
    }

创建一个新的解决方案。

不是你现在拥有的。

因为任何错误都可能存在于您未向我们展示的代码中。

将上述标记和代码粘贴到主窗口中。

确保你连接了加载的事件。

观看它的工作。

我的建议是:

删除你的 try catch 并且不再使用空的 catch 块。

修复从隔离存储中读取该字符串的代码,使其更加健壮。

对于 wpf,更常用的是

 Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 

哪个是用户的appdata漫游根。

如果您的代码仍然无法正常工作或出错,请将您的应用程序部分添加到您创建的新解决方案中,直到您在其中重现您的问题。

【讨论】:

  • 感谢您的快速回答,但您对空 Catch 的猜测肯定是不正确的。我刚刚在那里添加了一个 MessageBox 进行测试,但仍然是同样的问题。 (消息框甚至没有显示,所以应用程序肯定不会进入 Catch)
  • 如我所说。我发布的代码和标记有效。如果你的没有,那么你的解决方案中还有一些你没有向我们展示的东西。
猜你喜欢
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
  • 2020-07-04
  • 2013-03-28
  • 2020-04-30
  • 1970-01-01
  • 2018-08-31
  • 2015-08-16
相关资源
最近更新 更多