我有一个问题,我已经有一个多星期了,我不知道为什么。
我有一个等待屏幕,我已将其放置在不同的线程中,因此即使代码正在执行大量工作,它也可以加载并显示它自己(当我在同一个线程中执行所有操作时,屏幕不会显示它自己,我认为那是因为代码忙于做其他事情)
然而,它并不总是只在平板电脑上冻结几次,它在我的电脑上运行良好(至少在我的电脑上测试时我没有注意到它冻结)。
我试图在其中“破解”一些解决方法,例如在等待屏幕上放置一个取消按钮,以便可以将其关闭但无法单击(好像它冻结并且没有响应)
1 次我也认为这是问题所在,因为我会在线程启动之前关闭它,所以我做了一个布尔值,如果线程仍在加载,如果它还在加载,我会尝试关闭它,我会添加一个事件侦听器,以便在线程完成启动时将其关闭。
无论如何,这是代码,我希望这里有人可以帮助我。
public partial class WaitWindow : Window
{
//private static WaitWindow ww = new WaitWindow();
private static Thread thread;
private static event ThreadStartingEvent started;
private delegate void ThreadStartingEvent(object sender, EventArgs e);
public static bool disposable = false;
private static bool startingThread;
private static bool StartingThread
{
get
{
return startingThread;
}
set
{
startingThread = value;
if (!startingThread && started != null)
{
started(null, new EventArgs());
}
}
}
// To refresh the UI immediately
private delegate void RefreshDelegate();
private static void Refresh(DependencyObject obj)
{
obj.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Render,
(RefreshDelegate)delegate { });
}
public WaitWindow()
{
InitializeComponent();
}
public static void BeginDisplay()
{
if (thread == null)
{
startingThread = true;
thread = new Thread(() =>
{
WaitWindow ww = new WaitWindow();
ww.Show();
ww.Closed += (sender2, e2) =>
ww.Dispatcher.InvokeShutdown();
System.Windows.Threading.Dispatcher.Run();
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
startingThread = false;
}
}
public static void EndDisplay()
{
if (startingThread)
{
started += new ThreadStartingEvent(WaitWindow_started);
}
if (thread != null)
{
disposable = false;
thread.Abort();
thread = null;
}
}
static void WaitWindow_started(object sender, EventArgs e)
{
thread.Abort();
thread = null;
started = null;
}
private void button1_Click(object sender, RoutedEventArgs e)
{
if (disposable)
{
disposable = false;
thread.Abort();
thread = null;
}
}
}
和 xaml 代码:
<Window x:Class="WpfApplication1.WaitWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
Title="WaitWindow" WindowStyle="None" ResizeMode="NoResize" WindowStartupLocation="CenterScreen"
Background="Transparent" AllowsTransparency="True"
Width="1024" Height="640">
<Grid>
<xctk:BusyIndicator Name="BusyBar" IsBusy="True" BusyContent="Even geduld a.u.b.">
</xctk:BusyIndicator>
<Button Name="button1" Width="28" HorizontalAlignment="Left" Margin="550,271,0,0" Height="28" VerticalAlignment="Top" Click="button1_Click">X</Button>
</Grid>
</Window>
可能需要一些额外的信息:当我执行可能需要一些时间的任务(从远程数据库获取数据)时,我调用BeginDisplay()
并且当代码完成时我调用EndDisplay()
这对我来说似乎相当明显,但我认为提及它并没有什么害处。
编辑:我可能应该提到我正在使用.net framework 3.5