从技术上讲, 我们在我们的应用程序中使用System.Windows.Forms.MessageBox。这在Windows7和Windows8操作系统中表现不同。
实际上, 我通过一个简单的示例应用程序重新创建了该问题。 我创建了一个示例应用程序,当(TextBox)textBox1 PreviewLostKeyboardFocus()发生时,它将启动MessageBox。
我首先在Windows7中运行了示例应用程序。现在,我从textbox1按下了tab,所以,PreviewLostKeyboardFocus()被调用; MessageBox调用;我点击了MessageBox->“确定”按钮; MessageBox关闭;焦点保留在textbox1中。
现在,我在Windows8中运行了相同的示例解决方案。现在,我从textbox1中按Tab键,调用PreviewLostKeyboardFocus();调用MessageBox;我点击了MessageBox->“确定”按钮; MessageBox关闭;再一次 PreviewLostKeyboardFocus()已被调用;我点击了MessageBox->“确定”按钮; MessageBox关闭;同样调用了PreviewLostKeyboardFocus()。 所以会发生什么,MessageBox没有关闭。它一次又一次地来。 我无法编辑我的textbox1。 所以,我需要从任务管理器关闭整个应用程序。
我在这里提供了示例应用程序代码以供参考。这似乎是一个简单的问题。但我们在Big Application中的更多地方使用此功能。因此,任何简单的解决方案都将帮助我们节省更多时间。 此问题在.Net Framework 4.0 / 4.5中创建。对于.Net Framework 3.5,它在OS的
中都可以正常工作<Window x:Class="wpf_forms_msg_box.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<TextBox x:Name="txt1" Width="200" Height="35" Margin="40,37,277,247" TabIndex="0"
PreviewLostKeyboardFocus="txt1_PreviewLostKeyboardFocus_1" Text="Press Tab"/>
<TextBox x:Name="txt2" Width="200" Height="35" Margin="40,89,277,195" TabIndex="1"/>
<Button x:Name="btn1" Content="Button1" Width="200" Height="35" Margin="40,144,277,140" TabIndex="2"/>
</Grid>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace wpf_forms_msg_box
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
txt1.Focus();
}
private void txt1_PreviewLostKeyboardFocus_1(object sender, KeyboardFocusChangedEventArgs e)
{
try
{
System.Windows.MessageBox.Show("1");
System.Windows.Forms.MessageBox.Show("1");
System.Windows.Forms.MessageBox.Show("2");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}