Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Caliburn.微型锁定主视图_C#_Wpf_Modal Dialog_Caliburn.micro - Fatal编程技术网

C# Caliburn.微型锁定主视图

C# Caliburn.微型锁定主视图,c#,wpf,modal-dialog,caliburn.micro,C#,Wpf,Modal Dialog,Caliburn.micro,从我的主要观点来看,我目前正在发起一项相当长的行动。当此操作继续时,不可能按下主视图上的任何按钮。此外,应在另一个窗口报告进展情况。 我可以更新每个CanXXX守卫属性,但那将是大量的代码 我想使用Caliburn.Micro的ShowDialog方法,但是这个方法会等待窗口返回一个返回值。 那么,我如何用Caliburn.Micro显示一个模式窗口,而不等待某个对话框返回呢?我以前也这样做过 在主/外壳视图中- <ContentControl IsEnabled="{Binding UI

从我的主要观点来看,我目前正在发起一项相当长的行动。当此操作继续时,不可能按下主视图上的任何按钮。此外,应在另一个窗口报告进展情况。 我可以更新每个CanXXX守卫属性,但那将是大量的代码

我想使用Caliburn.Micro的ShowDialog方法,但是这个方法会等待窗口返回一个返回值。
那么,我如何用Caliburn.Micro显示一个模式窗口,而不等待某个对话框返回呢?

我以前也这样做过

在主/外壳视图中-

<ContentControl IsEnabled="{Binding UILocked, Converter={StaticResource BooleanInverter}}">
    <SomeOtherControls..... blah blah />
</ContentControl>
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;
    }
}
然后,您可以通过聚合器从任何虚拟机触发此命令,以锁定/解锁UI

aggregator.Publish(new ChangeUIStateMessage(true));
如果需要,您还可以修改处理程序,以便维护已启动锁定的对象列表,确保在所有工作人员完成之前锁定UI(如果多个VM同时启动锁定/解锁操作)


编辑:忘记添加-如果您的弹出控件位于单独的可视树中(通常是弹出窗口),它们将不会被禁用,这在大多数情况下对您有利(交互式弹出窗口/锁定的应用)。

我过去曾这样做过

在主/外壳视图中-

<ContentControl IsEnabled="{Binding UILocked, Converter={StaticResource BooleanInverter}}">
    <SomeOtherControls..... blah blah />
</ContentControl>
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;
    }
}
然后,您可以通过聚合器从任何虚拟机触发此命令,以锁定/解锁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,您的答案非常好!你能把它作为答案贴出来吗?