C# 显示用于加载WPF的消息

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时,请使

我有一个WPF应用程序,可以连接和断开WiFi。
完成此过程大约需要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用于禁用/暗显主应用程序部分。啊。。。我应该把这件事说清楚的。谢谢你的提醒。