C# 显示用于加载WPF的消息
我有一个WPF应用程序,可以连接和断开WiFi。C# 显示用于加载WPF的消息,c#,wpf,message,C#,Wpf,Message,我有一个WPF应用程序,可以连接和断开WiFi。 完成此过程大约需要2秒钟。在此期间,我希望在当前窗口“连接…”或“断开连接…”的顶部显示一条简单的等待消息,该消息将在进程完成后立即关闭 我应该用什么 MessageBox无法工作,因为a)它有一个按钮,b)我不能通过代码(我想)随意关闭它。当Wi-Fi开始连接时,请使用: MyWindow popup = new MyWindow(); popup.ShowDialog(); 其中MyWindow是一个包含信息的小表单 连接Wi-Fi时,请使
完成此过程大约需要2秒钟。在此期间,我希望在当前窗口“连接…”或“断开连接…”的顶部显示一条简单的等待消息,该消息将在进程完成后立即关闭 我应该用什么
MessageBox
无法工作,因为a)它有一个按钮,b)我不能通过代码(我想)随意关闭它。当Wi-Fi开始连接时,请使用:
MyWindow popup = new MyWindow();
popup.ShowDialog();
其中MyWindow
是一个包含信息的小表单
连接Wi-Fi时,请使用:
popup.Close();
ShowDialog()
防止用户与父窗体交互 您应该在后台线程上执行耗时两秒的长时间运行任务,并显示和关闭dispatcher线程上的窗口,例如:
Window window = new Window()
{
WindowStyle = WindowStyle.None,
Content = new TextBlock { Text = "working..." }
};
Task.Run(() =>
{
//do something that might take a while here...
System.Threading.Thread.Sleep(2000);
}).ContinueWith(task => window.Close(),
CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext());
window.ShowDialog(); //Call .Show() instead if you don't want to block here until the task has finished.
对于这类事情,我使用一个繁忙的“throbber”或“spinner”,它显示在窗口顶部的面板中。这只是动画来显示正在发生的事情。 我将其可见性绑定到窗口的viewmodel中的“IsBusy”属性。 在继承自的基础viewmodel中,因为这是一个常见需求 当我将Isbusy设置为true时,微调器将出现并设置动画 当我将其设置为False时,微调器将消失 我还有一个显示信息的区域。这些都是动画,所以它们出现,然后在几秒钟后淡出 粘贴到SO答案中的代码有点多,但这里有一些工作代码使用这种方法: Throbber是要查看的用户控件 这通常放在一个面板中,用户可以在其中编辑内容,这样他们就不能在数据更新时更改数据 我还在命令的CanExecute谓词中使用IsBusy来在处理完成时禁用按钮等。因为通知不一定是即时的,所以我检查所有命令的内部,如果IsBusy为true,则退出。命令在运行时设置为Busy true 为了完整性,可能与贝拉的问题没有直接关系 在某些情况下,我只想向用户显示正在进行处理,但允许他们继续工作。这在我正在制作的游戏的地图和场景编辑器中经常发生。 例如,当您将鼠标悬停在指挥官身上时,指挥官与其下属之间会进行空间a*最佳路线计算,计算时间大约为1到12秒。我不想阻止用户,但我想显示在这个实例中发生了什么
我有第二个机制,我用它来做这个,它的震动比较小。出现在我的用户通知消息旁边。您禁用表单,显示另一个较小的表单,然后当连接WiFi时,您可以隐藏较小的表单并再次启用表单。@ViggoLundén当前表单在禁用后将隐藏,对吗?我希望它出现在消息表单的后面,就像消息框一样。请参阅下面的答案,这应该可以。我建议使用。如何将文本从父窗口的代码后面传递到此新窗口?
MyWindow
将是一个普通表单,您可以将其设计为任何其他表单。创建一个构造函数并使用来自父窗口的信息文本调用它:MyWindow(“连接到Wi-Fi…”)
或类似的内容。父窗口显然会停止其进程(连接),直到弹出窗口关闭。ShowDialog()
打开一个模式窗口。您可以使用Show()
来代替。同意,我会添加IsBusy用于禁用/暗显主应用程序部分。啊。。。我应该把这件事说清楚的。谢谢你的提醒。