原文:2000条你应知的WPF小姿势 基础篇<74-77 WPF 多窗口Tips>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师。最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,000 Things You Should Know About WPF 。他以类似微博式的150字简短语言来每天更新一条WPF和C#重要又容易被遗忘的知识。很希望能够分享给大家。
本系列我不仅会翻译他的每一个tip,也会加入自己开发之中的看法和见解。本系列我希望自己也能和他一样坚持下来,每天的进步才能促成伟大。
在这里郑重说明.该系列是基于Sean Sexton先生的英文博客, Sean Sexton拥有全部版权和撤销权利。
前文可以翻阅本博客wpf标签的文章。查看往期
[小九的学堂,致力于以平凡的语言描述不平凡的技术。如要转载,请注明来源:小九的学堂。cnblogs.com/xfuture]
#74 重写Application类里的源生标准事件(OnXXX)
在Application类中,我们可以写关于Startup, Exit, SessionEnding等源生事件的处理方法(handler).
还有一种方法可以在这些事件触发的时候来加入逻辑 - 重写OnXXX方法(OnXXX指的是相应事件的处理方法)。这些方法是当事件触发时Application类会执行的源生方法。这样你可以仅仅在App.xaml.cs中重写该方法。
下面一个例子是当SessionEnding的时刻,重写了OnSessionEnding方法:
public partial class App : Application { protected override void OnSessionEnding(SessionEndingCancelEventArgs e) { // Always call method in base class, so that the event gets raised. base.OnSessionEnding(e); // Place your own SessionEnding logic here } }
#75 创建和展现第二窗口
在WPF程序运行时你可以创建除了MainWindow外的第二窗口。
步骤:项目中添加一个Window作为第二窗口。
代码中可以直接实例第二窗口并调用Show方法:
private void Button_Click(object sender, System.Windows.RoutedEventArgs e) { AnotherWindow win = new AnotherWindow(); win.Show(); }
#76 Application的Windows属性列出当前所有Window
Application有一个属性叫Windows,可以获得当前Application中所有的窗口。
如下图,有两个button,一个是创建新的window,一个是展示所有的window信息。
CreateNewWindow button:
private void btnCreate_Click(object sender, System.Windows.RoutedEventArgs e) { AnotherWindow win = new AnotherWindow(); win.Title = DateTime.Now.ToLongTimeString(); win.Show(); }
Where Are the Windows?,列出所有的window:
private void btnWhere_Click(object sender, RoutedEventArgs e) { StringBuilder sb = new StringBuilder(); foreach (Window w in App.Current.Windows) { sb.AppendFormat("Window [{0}] is at ({1},{2}).\n", w.Title, w.Top, w.Left); } MessageBox.Show(sb.ToString(), "My Windows"); }
最终结果:
#77 Windows之间的父子关系
创建一个新的窗口并调用show方法来展现,该窗口是独立于其他窗口存在的。它可以最大化最小化并不影响其余窗体,也会在任务栏中有自己窗口一个图标。
Window w = new Window(); w.Title = DateTime.Now.ToLongTimeString(); w.Show();
Wpf支持窗口之间的父子关系。你可以设置Owner属性来设置窗口间的父子关系
Window w = new Window(); w.Title = string.Format("Child #{0}", this.OwnedWindows.Count + 1); w.Owner = this; w.Show();
窗口之间的父子关系可以归纳为:
1. 父窗口最小化时,所有子窗口均最小化。
2. 子窗口最小化时,父窗口并不会最小化。
3. 子窗口之间可以进行交互,他们是平级的。
4. 父窗口不会覆盖子窗口,即子窗口永远在父窗口之上。
5. 父窗口关闭会引起所有子窗口的关闭。
下一期会有更多关于WPF Dialog和Location,希望能多多关注~