WPF:窗口关闭时,从LostFocus处理程序调用TextBox.Clear()会导致NullReferenceException

时间:2020-03-06 14:57:40  来源:igfitidea点击:

下面的示例有两个TextBoxes。第二个TextBox具有一个LostFocus事件的处理程序,该事件自己调用Clear()。在两个文本框之间更改焦点效果很好;但是,如果在关闭窗口时将焦点放在第二个文本框上,则TextBox.Clear()会生成NullReferenceException。这是WPF中的错误吗?如何轻松检测到这种情况,从而避免在窗口关闭时避免调用Clear()?

编辑:可能相关窗口是应用程序的主窗口。在调用Clear()时,测试不为null。异常是从调用中的某个地方引发的。

谢谢,
戴夫

using System.Windows;

namespace TextBoxClear
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        private void Test_LostFocus(object sender, RoutedEventArgs e)
        {
            Test.Clear();
        }
    }
}

<Window x:Class="TextBoxClear.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <StackPanel>
        <TextBox />
        <TextBox LostFocus="Test_LostFocus" Name="Test" />
    </StackPanel>
</Window>

程序集参考:

  • mscorlib,版本= 2.0.0.0,文化=中性,PublicKeyToken = b77a5c561934e089
  • PresentationCore,版本= 3.0.0.0,文化=中性,PublicKeyToken = 31bf3856ad364e35
  • PresentationFramework,版本= 3.0.0.0,文化=中性,PublicKeyToken = 31bf3856ad364e35
  • 系统,版本= 2.0.0.0,文化=中性,PublicKeyToken = b77a5c561934e089
  • WindowsBase,版本= 3.0.0.0,文化=中性,PublicKeyToken = 31bf3856ad364e35

解决方案

触发LostFocus事件时,Test属性是否可以为null?

尝试:

private void Test_LostFocus(object sender, RoutedEventArgs e)
    {
        if (Test != null)
            Test.Clear();
    }

编辑:我在用我们发布的代码重现NullReferenceException时遇到问题。我们正在使用哪个版本的.NET?

挂钩LostKeyboardFocus而不是LostFocus可以在我的情况下正常运行,并停止事件处理程序引发异常。