C# WPF&x2B;Caliburn Micro:如何捕捉窗口关闭事件?

C# WPF&x2B;Caliburn Micro:如何捕捉窗口关闭事件?,c#,wpf,caliburn.micro,C#,Wpf,Caliburn.micro,我是Caliburn Micro的新手,从中学习。在该示例中,只有2个类型为Application和UserControl的视图(.xaml),以及1个视图模型 我避免使用代码隐藏。因此,我只有视图和视图模型。我想知道如何捕捉helloworld应用程序的窗口关闭事件,以便在视图模型中处理它。我的目标:当用户要按右上角的关闭[x]按钮关闭应用程序时,应用程序会向用户提供反馈。 我读过关于iViewWare和IScreen的文章,但没有找到与我的问题相关的具体例子 非常感谢提供视图和视图模型的简单

我是Caliburn Micro的新手,从中学习。在该示例中,只有2个类型为Application和UserControl的视图(.xaml),以及1个视图模型

我避免使用代码隐藏。因此,我只有视图和视图模型。我想知道如何捕捉helloworld应用程序的窗口关闭事件,以便在视图模型中处理它。我的目标:当用户要按右上角的关闭[x]按钮关闭应用程序时,应用程序会向用户提供反馈。
我读过关于iViewWare和IScreen的文章,但没有找到与我的问题相关的具体例子

非常感谢提供视图和视图模型的简单示例代码。提前谢谢


另外,我使用VS2013,C#。

您正在寻找将事件绑定到命令的方法。这里的典型方法是使用MVVMLight的行为

用法示例(来自链接文章):


对于您的特定场景,您没有使用MVVMLight。由于该框架是开源的,您可以将EventToCommand的实现复制到您自己的项目中,或者更简单地说,您可以使用,它是Expression Blend附带的System.Windows.Interactive.dll库的一部分

InvokeCommandAction的示例:

<TextBox x:Name="TicketNumber">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="KeyDown">
            <i:InvokeCommandAction Command="{Binding OpenTicketCommand}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</TextBox>


最后,你“不能有任何代码隐藏”的整个MVVM教条再次被推翻(最后一个链接特别相关)。MVVM应该是单元可测试的,并将“视图逻辑”与“业务逻辑”分开。“关闭”事件在视图和业务逻辑之间有点灰色。但是,如果您可以在代码隐藏中编写事件处理程序,调用ViewModel的适当方法或命令,并且可以对代码进行单元测试,那么您就非常棒了。不要担心从项目中删除所有代码痕迹。

您可以在
视图中使用

cal:Message.Attach="[Event Closing] = [Action OnClose($eventArgs)]"
所以看起来像

<Window cal:Message.Attach="[Event Closing] = [Action OnClose($eventArgs)]">


在您的
ViewModel
上,您可以定义一个公共方法,该方法显示
OnClose
,并使用
CancelEventArgs
作为参数,您可以从那里处理它。

如果您的ViewModel继承了Screen,Caliburn Micro有一些方法可以覆盖,如

protected override void OnDeactivate(bool close); 
当屏幕关闭或停用或关闭时调用此选项

public override void CanClose(Action<bool> callback)
public override void CanClose(操作回调)

如果您使用的是可以使用的BootstrapperBase类,则可以检查CanClose用法

protected override void OnExit(object sender, EventArgs e)

感谢您的快速回复,但我现在不使用MVVM Light。我相信caliburn micro有不同的方法,可能更简单。另外,我以前用过MVVM灯。我没有窗口类型的视图。我的视图只有类型Application和UserControl。如果我在UserControl中使用您的语句,我会得到错误:名称“Message”在我发现的命名空间“clr namespace:Caliburn.Micro;assembly=Caliburn.Micro”中不存在,我需要使用Caliburn.Micro.PlatformWell,UserControl没有关闭事件。似乎我必须有窗口类型视图,或者它需要一个外壳视图。是的,它应该是
窗口
,或者任何带有
关闭
事件的东西,这些事件不会让你取消关闭窗口,尤其是使用508个关闭键it@lll我不知道你是什么意思,CanClose可在按下红色x键或按Alt+F4键时取消关闭窗口。我刚刚测试过它。@gcores视图(xaml)是什么样子的?@MagB在我的例子中,视图是一个普通的RibbonWindow,我确信普通的窗口视图可以正常工作。
protected override void OnExit(object sender, EventArgs e)