C# Caliburn.微型锁定主视图
从我的主要观点来看,我目前正在发起一项相当长的行动。当此操作继续时,不可能按下主视图上的任何按钮。此外,应在另一个窗口报告进展情况。 我可以更新每个CanXXX守卫属性,但那将是大量的代码 我想使用Caliburn.Micro的ShowDialog方法,但是这个方法会等待窗口返回一个返回值。C# Caliburn.微型锁定主视图,c#,wpf,modal-dialog,caliburn.micro,C#,Wpf,Modal Dialog,Caliburn.micro,从我的主要观点来看,我目前正在发起一项相当长的行动。当此操作继续时,不可能按下主视图上的任何按钮。此外,应在另一个窗口报告进展情况。 我可以更新每个CanXXX守卫属性,但那将是大量的代码 我想使用Caliburn.Micro的ShowDialog方法,但是这个方法会等待窗口返回一个返回值。 那么,我如何用Caliburn.Micro显示一个模式窗口,而不等待某个对话框返回呢?我以前也这样做过 在主/外壳视图中- <ContentControl IsEnabled="{Binding UI
那么,我如何用Caliburn.Micro显示一个模式窗口,而不等待某个对话框返回呢?我以前也这样做过 在主/外壳视图中-
<ContentControl IsEnabled="{Binding UILocked, Converter={StaticResource BooleanInverter}}">
<SomeOtherControls..... blah blah />
</ContentControl>
将UILocked
设置为true时,应禁用整个UIContentControl
将禁用所有子元素,并且其子元素的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;
}
}
然后,您可以通过聚合器从任何虚拟机触发此命令,以锁定/解锁UI
aggregator.Publish(new ChangeUIStateMessage(true));
如果需要,您还可以修改处理程序,以便维护已启动锁定的对象列表,确保在所有工作人员完成之前锁定UI(如果多个VM同时启动锁定/解锁操作)
编辑:忘记添加-如果您的弹出控件位于单独的可视树中(通常是弹出窗口),它们将不会被禁用,这在大多数情况下对您有利(交互式弹出窗口/锁定的应用)。我过去曾这样做过 在主/外壳视图中-
<ContentControl IsEnabled="{Binding UILocked, Converter={StaticResource BooleanInverter}}">
<SomeOtherControls..... blah blah />
</ContentControl>
将UILocked
设置为true时,应禁用整个UIContentControl
将禁用所有子元素,并且其子元素的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;
}
}
然后,您可以通过聚合器从任何虚拟机触发此命令,以锁定/解锁UI
aggregator.Publish(new ChangeUIStateMessage(true));
如果需要,您还可以修改处理程序,以便维护已启动锁定的对象列表,确保在所有工作人员完成之前锁定UI(如果多个VM同时启动锁定/解锁操作)
编辑:忘记添加-如果您的弹出控件位于单独的可视树中(通常是弹出窗口),它们将不会被禁用,这在大多数情况下对您有利(交互式弹出窗口/锁定的应用程序) 你可能想考虑用.提供的,你可能想考虑用.< /p>提供的为什么等待会出现问题?操作完成后将其关闭。对话框是阻止主窗口的最简单的方法。问题是,调用方法必须在打开对话框后才能工作。我可以将此部分转移到对话框中,但这很难闻。如果这是一个冗长的方法,它应该在线程(bgw)上。将其保留在VM中。您能否将整个应用程序窗口包装在
ContentControl
中?您可以在content控件上设置IsEnabled
,以禁用所有子控件,而不考虑绑定。如果您希望在主虚拟机中实现该级别的控制,则可以只绑定IsEnabled
,然后使用聚合器从任何希望锁定或解锁应用程序UI的虚拟机传递消息。弹出窗口不会受到影响,因此任何对话框仍将是交互式的(除非它们位于主VMs视图的可视树中)。Carleh,您的答案非常好!你能把它贴出来作为答案吗?为什么等待是个问题?操作完成后将其关闭。对话框是阻止主窗口的最简单的方法。问题是,调用方法必须在打开对话框后才能工作。我可以将此部分转移到对话框中,但这很难闻。如果这是一个冗长的方法,它应该在线程(bgw)上。将其保留在VM中。您能否将整个应用程序窗口包装在ContentControl
中?您可以在content控件上设置IsEnabled
,以禁用所有子控件,而不考虑绑定。如果您希望在主虚拟机中实现该级别的控制,则可以只绑定IsEnabled
,然后使用聚合器从任何希望锁定或解锁应用程序UI的虚拟机传递消息。弹出窗口不会受到影响,因此任何对话框仍将是交互式的(除非它们位于主VMs视图的可视树中)。Carleh,您的答案非常好!你能把它作为答案贴出来吗?