代码改变世界

WPF Summary:Window生存期

2011-03-29 15:47  海蓓娜楽  阅读(451)  评论(0编辑  收藏  举报

       和我们之前所讲的Application类一样,Window也有生存期,在第一次实例化Window时生存期开始,然后就可以打开、激活和停用Window,直到最终关闭Window。

弹出Window

       若要弹出Window,首先创建一个Window的实例。作为一种快捷方式,可以设置 StartupUri 以指定在应用程序启动时自动打开的第一个窗口。当应用程序启动时,StartupUri 的值所指定的窗口会无模式地打开。现在在Win_Window.xaml中增加“<Button Name="BtnShowWindow" Content="单击弹出一个Window" Click="BtnShowWindow_Click"/>”来单击弹出一个窗口。

       通过调用 Show 打开的窗口是无模式窗口,我们可以调用 ShowDialog 来模式打开窗口。ShowDialog 弹出的窗口,我们称为“模式”窗口,它弹出时会使应用程序中的所有其他窗口禁用,并且仅在窗口关闭后才返回。模式窗口主要用作对话框(MessageBox),对话框是一种特殊类型的窗口,应用程序使用它与用户交互以完成任务。

       我们刚才说了通过调用 Show 打开的窗口是无模式窗口,这意味着应用程序所运行的模式允许用户在同一个应用程序中激活其他窗口。

Window的所属权

       使用 Show 方法弹出的窗口与创建它的窗口之间没有隐式关系;用户可以与这两个窗口分别进行独立的交互,这意味着这两个窗口都可以:

Ø 覆盖另一个窗口(除非其中一个窗口的 Topmost 属性设置为 true);

Ø 在不影响另一个窗口的情况下,最小化、最大化和还原一个窗口。

在我们一些系统开发应用中,需要将某些窗口与打开它们的窗口之间保持某种关系。 例如,我们VS2010中属性窗口和工具窗口,而这些窗口的典型行为是始终与创建它们的窗口协调一致地进行关闭、最小化、最大化和还原。可以通过让一个窗口拥有另一个窗口来建立这种关系,也可以通过使用对所有者窗口的引用来设置附属窗口的 Owner 属性,以建立这种关系。

建立了所属权之后:

Ø 附属窗口可以通过检查 Owner 属性的值来引用它的所有者窗口;

Ø 所有者窗口可以通过检查 OwnedWindows 属性的值来发现它拥有的全部窗口。

<Button Name="BtnShowOwnedWindowsCount" Grid.Row="3" Content="单击弹出拥有Window的数量" Click="BtnShowOwnedWindowsCount_Click"/>

后台代码:

private void BtnShowOwnedWindowsCount_Click(object sender, RoutedEventArgs e)

{

MessageBox.Show(string.Format("当前Window拥有“{0}”个子Window",this.OwnedWindows.Count));

}

防止Window 激活

       有些情况下,不应在显示窗口时将其激活,例如 电子邮件应用程序的通知窗口。

       如果应用程序具有不应在显示时被激活的窗口,可以在首次调用 Show 方法之前将其 ShowActivated 属性设置为 false。 这样:

Ø 窗口便不会被激活;

Ø 也不会引发窗口的 Activated 事件;

Ø 当前激活的窗口保持激活状态。

       但是,只要用户通过单击激活了窗口,窗口就会变为激活状态。在这种情况下:

Ø 窗口被激活;

Ø 引发窗口的 Activated 事件;

Ø 停用以前激活的窗口;

Ø 随后作为对用户操作的响应。

注:通过检查 IsActive 属性来确定窗口是否为活动窗口。

Window 激活

       在首次打开一个窗口时,它便成为活动窗口(除非是手动设置了 ShowActivated为 false)。 活动窗口是当前正在捕获用户输入的窗口。 当窗口变为活动窗口时,它会引发 Activated 事件。 当激活其他窗口时,当前的活动窗口将停用,并引发 Deactivated 事件。处理 Activated 和 Deactivated 的一个常见原因是为了启用和禁用只有在窗口活动时才能够运行的功能。如我们常用的播放器,在你播放视频时,切换到其他应用程序,视频就暂停,在此切换回来时,视频就继续播放的功能。

关闭Window

       当用户关闭窗口时,窗口的生命便开始走向终结。当窗口关闭时,它会引发两个事件:Closing 和 Closed。Closing 在窗口关闭之前引发,它提供一种机制,可以通过这种机制来阻止窗口关闭。Closing 事件处理程序传递一个 CancelEventArgs,该参数实现 Boolean 的 Cancel 属性,将该属性设置为 true 可以阻止窗口关闭。如果未处理 Closing,或者处理但未取消,则窗口将关闭。 在窗口真正关闭之前,会引发 Closed。 这时无法阻止窗口关闭。