显示加载 WPF 的消息
Showing Message for loading WPF
我有一个连接和断开 WiFi 的 WPF 应用程序。
完成该过程大约需要 2 秒。在那段时间里,我想在当前 window "Connecting.." 或 "Disconnecting..." 的顶部显示一个简单的 waiting message,它会尽快关闭该过程已完成。
我应该使用什么?
MessageBox
不起作用,因为 a) 它有一个按钮,b) 我不能通过代码随意关闭它(我认为)。
当 Wi-Fi 开始连接时,使用:
MyWindow popup = new MyWindow();
popup.ShowDialog();
其中 MyWindow
是包含信息的小表格。
并且在连接 Wi-Fi 时,使用:
popup.Close();
ShowDialog()
阻止用户与父表单交互。
您应该在后台线程上执行需要两秒钟才能完成的长 运行 任务,并在调度程序线程上显示和关闭 window,例如:
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",它们显示在 window 顶部的面板中。这只是动画显示正在发生的事情。
我将它的可见性绑定到我的 window 视图模型中的 "IsBusy" 属性。
在继承自的基础视图模型中,因为这是一个常见的要求。
当我将 Isbusy 设置为 true 时,微调器出现并动画化。
当我将其设置为 False 时,微调器消失。
我还有一个显示消息的区域。这些是动画的,因此它们会出现,然后在几秒钟后淡出。
粘贴到 SO 答案中的代码有点多,但是这里有工作代码使用这种方法:
https://gallery.technet.microsoft.com/WPF-Entity-Framework-MVVM-78cdc204
Throbber 是要查看的用户控件。
这通常出现在面板封面中,用户可以在其中编辑内容 - 因此他们无法在更新数据时更改数据。
我还在命令的 CanExecute 谓词中使用 IsBusy 来在处理完成时禁用按钮等。因为通知不一定是即时的,所以我检查了所有命令并在 IsBusy 为真时退出。命令在 运行.
时将 IsBusy 设置为真
出于完整性考虑,可能与 Bella 的问题没有直接关系。
在某些情况下,我只想向用户展示正在处理,但允许他们继续工作。这种情况在我正在开发的游戏的地图和场景编辑器中经常发生。
例如,当您将鼠标悬停在指挥官上方时,会在指挥官和他的下属之间进行 Spatial A* 最佳路线计算,大约需要 1 到 12 秒。我不想阻止用户,但我想展示在这种情况下发生的事情。
我有第二种机制,我使用的是一种侵入性较小的跳动器。它出现在我的用户通知消息旁边。
我有一个连接和断开 WiFi 的 WPF 应用程序。
完成该过程大约需要 2 秒。在那段时间里,我想在当前 window "Connecting.." 或 "Disconnecting..." 的顶部显示一个简单的 waiting message,它会尽快关闭该过程已完成。
我应该使用什么?
MessageBox
不起作用,因为 a) 它有一个按钮,b) 我不能通过代码随意关闭它(我认为)。
当 Wi-Fi 开始连接时,使用:
MyWindow popup = new MyWindow();
popup.ShowDialog();
其中 MyWindow
是包含信息的小表格。
并且在连接 Wi-Fi 时,使用:
popup.Close();
ShowDialog()
阻止用户与父表单交互。
您应该在后台线程上执行需要两秒钟才能完成的长 运行 任务,并在调度程序线程上显示和关闭 window,例如:
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",它们显示在 window 顶部的面板中。这只是动画显示正在发生的事情。 我将它的可见性绑定到我的 window 视图模型中的 "IsBusy" 属性。 在继承自的基础视图模型中,因为这是一个常见的要求。
当我将 Isbusy 设置为 true 时,微调器出现并动画化。
当我将其设置为 False 时,微调器消失。
我还有一个显示消息的区域。这些是动画的,因此它们会出现,然后在几秒钟后淡出。
粘贴到 SO 答案中的代码有点多,但是这里有工作代码使用这种方法:
https://gallery.technet.microsoft.com/WPF-Entity-Framework-MVVM-78cdc204
Throbber 是要查看的用户控件。
这通常出现在面板封面中,用户可以在其中编辑内容 - 因此他们无法在更新数据时更改数据。
我还在命令的 CanExecute 谓词中使用 IsBusy 来在处理完成时禁用按钮等。因为通知不一定是即时的,所以我检查了所有命令并在 IsBusy 为真时退出。命令在 运行.
时将 IsBusy 设置为真出于完整性考虑,可能与 Bella 的问题没有直接关系。
在某些情况下,我只想向用户展示正在处理,但允许他们继续工作。这种情况在我正在开发的游戏的地图和场景编辑器中经常发生。 例如,当您将鼠标悬停在指挥官上方时,会在指挥官和他的下属之间进行 Spatial A* 最佳路线计算,大约需要 1 到 12 秒。我不想阻止用户,但我想展示在这种情况下发生的事情。
我有第二种机制,我使用的是一种侵入性较小的跳动器。它出现在我的用户通知消息旁边。