WPF+Caliburn Micro:如何捕捉Window Close事件

本文关键字:Window Close 事件 何捕捉 Micro WPF+Caliburn | 更新日期: 2023-09-27 18:12:26

我是Caliburn Micro的新手,并从这个helloworld示例中学习。在该示例中,只有两个类型为Application和UserControl的视图(.xml(和一个视图模型。

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

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

PS。我使用VS2013,C#。

WPF+Caliburn Micro:如何捕捉Window Close事件

您可以在View中使用连接Caliburn Micro

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

所以它看起来像

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

在你的ViewModel上,你可以定义一个公共方法,用CancelEventArgs作为参数来表示OnClose,你可以从那里处理它。

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

protected override void OnDeactivate(bool close); 

当屏幕关闭或停用或时,就会调用此命令

public override void CanClose(Action<bool> callback)

您可以在此处查看CanClose的使用情况

如果您使用BootstrapperBase类,您可以使用:

protected override void OnExit(object sender, EventArgs e)

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

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

<StackPanel Background="Transparent">
  <i:Interaction.Triggers>
    <i:EventTrigger EventName="Tap">
      <command:EventToCommand
        Command="{Binding Main.NavigateToArticleCommand,
          Mode=OneWay,
          Source={StaticResource Locator}}"
        CommandParameter="{Binding Mode=OneWay}" />
    </i:EventTrigger>
  </i:Interaction.Triggers>
  <!--...-->
</StackPanel>

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

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的适当方法或命令,并且您可以对该代码进行单元测试,那么您就如鱼得水了。不要担心从项目中删除所有代码隐藏痕迹。