zoukankan      html  css  js  c++  java
  • 《WPF程序设计指南》读书笔记——第1章 应用程序与窗口

    1.空白WPF项目的创建:

      1)新建项目:在VS2010中,文件-新建-项目-visual c#-windows-空项目;

      2)添加引用:PresentationFramework,PresentationCore,WindowsBase,System,System.Xaml,共5个。书中是4个,这是因为早期WindowsBase中的一些类后来放到了System.Xaml里。

      3)添加文件:在项目中添加“新建项”,选择“代码文件"。

    2.SayHello程序 

    using System;
    using System.Windows;
    
    namespace LY.SayHello
    {
        class SayHello
        {
            [STAThread]
            public static void Main()
            {
                Window win = new Window();
                win.Title = "SayHello";
                win.Show();
                //Application app = new Application();
                //app.Run();
            }
        }
    }
    

      1)注意Main首字母大写;

      2)[STAThread]属性是为了和原来的COM兼容,表示单线程套间(Single Threaded Apartment,STA),如果没有,编译会失败;

      3)在一个程序中只能有一个Application对象,也可以没有,如果注销最后两句代码,也可以运行,只不过Show出来的窗体是Modleless形态的,在屏幕一闪而过;如果把win.Show(),改为win.ShowDialog(),因为Modle窗体本身也有消息循环机制,窗体就可以一直存在。

      4)”对程序的其他方面来说,Application对象就像固定的锚一般“,对这句话的理解:因为一般来说,Application.run()方法打开消息循环,决定了主程序的生存周期,其他窗体的运行都可以看成是在他限定的范围内运行,所以就像锚一般,将船固定在一个有限的范围内,而不能脱离这个范围。

    3.简单的事件处理

    using System;
    using System.Windows;
    using System.Windows.Input;
    
    namespace LY.HandleAnEvent
    {
        class HandleAnEvent
        {
            [STAThread]
            public static void Main()
            {
                Application app = new Application();
                Window win = new Window();
                win.Title = "Handle An Event";
                win.MouseDown += WindowsOnMouseDown;
                app.Run(win);
            }
            static void WindowsOnMouseDown(object sender, MouseButtonEventArgs args)
            {
                //Window w = Application.Current.MainWindow;
                Window win = sender as Window;
                string strMessage = string.Format("windows click with {0} butten at point ({1})", args.ChangedButton, args.GetPosition(win));
                MessageBox.Show(strMessage, win.Title);            
            }
        }
    }
    

      1)通过委托,将WindowsOnMouseDown方法注册到MouseDown事件,MouseButtonEventArgs类定义在using System.Windows.Input命名空间中。

      2)也可以通过Application.Current这个静态属性,取得所创建的Application对象,再通过Application.MainWindow这个实例属性,取得当前的主窗口。

    4.重写Application类的事件的方法

    using System;
    using System.Windows;
    using System.Windows.Input;
    
    namespace LY.InheritTheApp
    {
        class InheritTheApp:Application
        {
            [STAThread]
            public static void Main()
            {
                InheritTheApp app = new InheritTheApp();
                app.Run();
            }
            protected override void OnStartup(StartupEventArgs e)
            {
                base.OnStartup(e);
                Window win = new Window();
                win.Title = "Inherit the App";
                win.Show();
            }
            protected override void OnSessionEnding(SessionEndingCancelEventArgs e)
            {
                base.OnSessionEnding(e);
                MessageBoxResult result = MessageBox.Show("是否关闭窗口?", MainWindow.Title, MessageBoxButton.YesNoCancel, MessageBoxImage.Question, MessageBoxResult.Yes);
                e.Cancel = (result == MessageBoxResult.Cancel);
            }        
        }
    }
    

      
      1)可以通过重写(override)Application对象事件的方法,实现加入自定义行为的目的。比如上面的OnStartup、OnSessionEnding方法,从而在Application.Run()方法刚启动时,触发对应的StartupEventHandler委托类型的事件Application.Startup,进行一些初始化工作,在用户注销系统或关电脑的时候,触发对应的SessionEndingEventHandler委托类型的事件Application.SessionEnding,如上例中提示用户是否真的关闭。(在我机器上,仍然不能阻止机器直接注销或关机的行为,这可能和电脑本身的一些具体设置有关系。)

      2)Application类还有很多属性、事件、方法,比如对光标所在位置,功能键按键的处理,可以重写OnKeyDown、OnKeyUp,对键盘输入用重写OnTextInput,参见http://www.cnblogs.com/leezhm/archive/2011/06/21/2086308.html

    5.多个窗口之间的关系

    using System;
    using System.Windows;
    using System.Windows.Input;
    
    namespace LY.ThorwWindowParty
    {
        class ThrowWindowParty:Application
        {
            [STAThread]
            public static void Main()
            {
                ThrowWindowParty app = new ThrowWindowParty();
                //app.ShutdownMode = ShutdownMode.OnMainWindowClose;
                app.Run();
            }
            protected override void OnStartup(StartupEventArgs e)
            {
                base.OnStartup(e);
                Window winmain = new Window();
                winmain.Title = "Main Window";
                winmain.MouseDown+=WindowsOnMouseDown;
                winmain.Show();
                for (int i = 0; i < 2; i++)
                {
                    Window win = new Window();
                    win.Title = "Extra Window No." + (i + 1);
                    win.Show();
                    //this.MainWindow = win;
                    win.Owner = winmain;
                }
                //this.ShutdownMode = ShutdownMode.OnMainWindowClose;
            }
            void WindowsOnMouseDown(object sender, MouseButtonEventArgs args)
            {
                Window win = new Window();
                win.Title = "Model Dialog Box";
                win.ShowDialog();
            }
        }
    }
    

      1)第一个被创建的窗口自动成为主窗口,可以用Application.MainWindow查看,也可以通过win.Owner指定一个窗口的父窗口;也可以用Application.Windows集合索引取得特定窗口,Windows.Count记录窗口总数。

      2)默认情况下,主窗口或父窗口被关闭时,Application.Run()退出;Application.ShutdownMode属性可以指定Application.Run()的退出模式,其值为枚举,分别为ShutdownMode.OnMainWindowClose、OnLastWindowClose、OnExplicitShutdown,表示在主窗口关闭、最后一个窗口关闭、显式调用Application.Shutdown()方法时再关闭。

      3)一般情况下,很少使用继承自Application类的子类,经常会使用继承自Window类的的子类,并通过子类的构造函数完成窗口的初始化工作。如下例:

    6.WPF的设备无关单位(像素)特性  

    using System;
    using System.Windows;
    using System.Windows.Input;
    
    namespace LY.InheritTheWin
    {
        class InheritTheWin:Window
        {
            [STAThread]
            public static void Main()
            {
                new Application().Run(new InheritTheWin());
            }
            public InheritTheWin()
            {
                Title = "Inherit The Win";
                Width = 500;
                Height = 400;
                Left = 300;
                Top = 300;
            }
        }
    }
    

      1)Width和Height属性用于设置对象大小尺寸(double值,因此可以有小数),但因为实际呈现的窗口大小是经过计算后的,依赖于系统屏幕设置,实际大小可以通过ActualWidth和ActualHeight取得。如果用户没有设置Width和Height属性,自然就没有这两个值,也就是NaN(not a number),但只要窗口呈现后,当然就会有ActualWidth和ActualHeight值。

      2)没有right和bottom属性,想知道窗口右下角位置,可以通过left和top属性,以及窗口自身的长宽推算出来。此外,通过System.Windows命名空间下的SystemParameters类,可以得到很多系统参数,比如屏幕大小。

      3)关于设备无关单位的进一步认识,参见:http://www.cnblogs.com/wangshuai/archive/2010/05/12/1733627.html

      4)Window类的很多属性可以控制窗口外观和行为,比如WindowStyle、WindowStartupLocation、ResizeMode、WindowState、Topmost、Background等等。

  • 相关阅读:
    解析Javascript事件冒泡机制(转)
    JavaScript事件处理的三种方式(转)
    javaScript中"=="和"==="运算符的区别
    博客
    基础知识巩固二
    基础知识巩固
    知识小结(浮点数问题)
    关于电脑桌面图标消失并且右键无法点击的情况
    JS随笔(二)
    关于JS学习笔记
  • 原文地址:https://www.cnblogs.com/pemp/p/3254304.html
Copyright © 2011-2022 走看看