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

时间:2014-07-11 14:21:12

标签: c# wpf caliburn.micro

我是Caliburn Micro的新手,并从this helloworld example了解它。在该示例中,只有2个类型为Application和UserControl的视图(.xaml)和1个视图模型。

我避免使用后面的代码。因此我只有查看和查看模型。我想知道如何捕获我的helloworld应用程序的窗口关闭事件,以便我可以在视图模型中处理它。我的目标:当用户通过按右上角的[x]按钮关闭应用程序时,应用程序会向用户提供反馈。
我已阅读有关IViewAware和IScreen的内容,但我没有找到与我的问题相关的具体示例。

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

PS。我使用VS2013,C#。

4 个答案:

答案 0 :(得分:10)

您可以在View中使用

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

所以它看起来像

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

ViewModel上,您可以定义一个公共方法,其中OnCloseCancelEventArgs为参数,您可以从那里处理它。

答案 1 :(得分:3)

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

protected override void OnDeactivate(bool close); 

当屏幕关闭或停用或

时调用此方法
public override void CanClose(Action<bool> callback)

您可以查看CanClose使用情况here

答案 2 :(得分:1)

您正在寻找将事件绑定到命令的方法。这里的典型方法是使用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,它是System.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教条你不能拥有任何代码&#34;被击落time | and |再次time(最后一个链接特别相关)。 MVVM应该是可单元测试的,并且分离了&#34; View逻辑&#34;来自&#34;业务逻辑。&#34; &#34;关闭&#34;事件无疑是View和Business逻辑之间的一个灰色区域。但是,如果您可以在后面的代码中编写一个事件处理程序,它会调用您的ViewModel的相应方法或命令,并且如果您可以对该代码进行单元测试,那么您就像黄金一样好。不要担心从项目中删除所有代码隐藏的痕迹。

答案 3 :(得分:0)

如果使用的是BootstrapperBase类,则可以使用:

protected override void OnExit(object sender, EventArgs e)