从我的主要观点来看,我目前正在启动一项相当长的操作。当此操作继续时,应该不可能按下主视图上的任何按钮。此外,应在另一个窗口中报告进度。我可以更新每个 CanXXX Guard 属性,但这将是大量代码。
我想使用 Caliburn.Micro 的 ShowDialog 方法,但是这个方法会等到 Window 返回一个返回值。那么如何使用不等待某些对话框返回的 Caliburn.Micro 显示模态窗口?
从我的主要观点来看,我目前正在启动一项相当长的操作。当此操作继续时,应该不可能按下主视图上的任何按钮。此外,应在另一个窗口中报告进度。我可以更新每个 CanXXX Guard 属性,但这将是大量代码。
我想使用 Caliburn.Micro 的 ShowDialog 方法,但是这个方法会等到 Window 返回一个返回值。那么如何使用不等待某些对话框返回的 Caliburn.Micro 显示模态窗口?
我过去做过这个...
在您的主/外壳视图中 -
<ContentControl IsEnabled="{Binding UILocked, Converter={StaticResource BooleanInverter}}">
<SomeOtherControls..... blah blah />
</ContentControl>
在主/外壳视图模型中 -
public bool UILocked { get { // getter } set { // prop changed code/setter etc... } }
设置UILocked
为 true 后,应禁用整个 UI。ContentControl
将禁用所有子元素,IsEnabled
其子元素的绑定将被忽略
您可以确保主视图也订阅事件聚合器:
public class MainViewModel : IHandle<ChangeUIStateMessage>
{
public bool UILocked { get { // getter } set { // prop changed code/setter etc... } }
public MainViewModel(IEventAggregator aggregator)
{
aggregator.Subscribe(this);
}
public void Handle(ChangeUIStateMessage message)
{
UILocked = message.UILocked;
}
}
消息类可能很简单:
public class ChangeUIStateMessage
{
public bool UILocked { get; private set; }
public ChangeUIStateMessage(bool uiLocked)
{
UILocked = uiLocked;
}
}
然后,您可以通过聚合器从任何 VM 触发它以锁定/解锁 UI
aggregator.Publish(new ChangeUIStateMessage(true));
如果需要,您还可以修改处理程序,以便维护已启动锁定的对象列表,确保 UI 被锁定直到所有工作人员完成(以防多个 VM 同时启动锁定/解锁操作)
编辑:忘记添加 - 如果您的弹出控件位于单独的可视化树中(通常是弹出窗口),它们将不会被禁用,这在大多数情况下对您有利(交互式弹出窗口/锁定的应用程序)。
您可能需要考虑扩展 WPF 工具包提供的BusyIndicator。