zoukankan      html  css  js  c++  java
  • 8天入门wpf—— 第一天 基础概念介绍

         

           这些天从项目上接触到了wpf,感觉有必要做一个笔记,首篇还是聊聊基本的概念,要学习wpf,我们需要采用webform的思维来考虑问题。

    一:App环境承载

         我们都知道,console和winform程序的入口函数都是main,wpf同样也不例外,好了,我们新建一个wpf的程序,vs自动给我们生成了一个

    MainWindow.xaml和App.xaml文件。

    微软官方说wpf程序是从Application开始的,既然是开始总有个入口点吧,奇怪的是我们并没有发现Main函数,程序又是如何Run起来的呢?

    其实,wpf为了简化我们的工作,把一些机械性的代码透明了,那么我们如何找到这个Main函数呢?很简单,我们编译一下程序,发现

    App.xaml最后生成了App.g.cs的部分类,并且发现StartupUri是MainWindow.xaml,也就是说程序一运行,MainWindow.xaml将会启动。

    二:Wpf中Application的生命周期

        我们知道webform中的Global文件定义了一个应用程序的全局生命周期,或许有人问,生命周期能够干些什么,其实干的事情可多着呢,

    比如我们可以做一些身份验证,或者一些信息的初始化,那么wpf中到底有哪些对应的方法和事件呢?

    1:OnStartup方法    =>   Startup 事件

         这个就见名识意了,也就是上面一幅图中的app.Run()的时候触发。

    2: OnSessionEnding方法 => SessionEnding 事件

         系统关机前调用。

    3:OnExit方法 => Exit事件

         应用程序关闭前调用。

    4:OnActivated方法 =>  Activated 事件

         应用程序获得焦点的时候触发。

    5:OnDeactivated方法 => DeActivated事件

         应用程序失去焦点的时候触发。

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Configuration;
     4 using System.Data;
     5 using System.Linq;
     6 using System.Windows;
     7 
     8 namespace Demo
     9 {
    10     /// <summary>
    11     /// App.xaml 的交互逻辑
    12     /// </summary>
    13     public partial class App : Application
    14     {
    15         protected override void OnActivated(EventArgs e)
    16         {
    17             base.OnActivated(e);
    18 
    19             //TODO  your code
    20         }
    21 
    22         protected override void OnDeactivated(EventArgs e)
    23         {
    24             base.OnDeactivated(e);
    25 
    26             //TODO  your code
    27         }
    28 
    29         protected override void OnExit(ExitEventArgs e)
    30         {
    31             base.OnExit(e);
    32 
    33             //TODO  your code
    34         }
    35 
    36         protected override void OnStartup(StartupEventArgs e)
    37         {
    38             base.OnStartup(e);
    39 
    40             //TODO  your code
    41         }
    42 
    43         protected override void OnSessionEnding(SessionEndingCancelEventArgs e)
    44         {
    45             base.OnSessionEnding(e);
    46         
    47             //TODO  your code
    48         }
    49     }
    50 }

    三:全局异常获取

         在webform中的Global文件中有一个Application_Error方法,专门用来捕获整个应用程序的异常,以至于不会出现“黄白页”给用户,以此来提高

    系统的健壮性和安全性,那么wpf中也有类似的方法吗?当然,wpf跟webform神似,他有的我也有,这里是一个DispatcherUnhandledException

    事件,然后我们在OnStartup注册一下就Ok了。

     1 namespace Demo
     2 {
     3     /// <summary>
     4     /// App.xaml 的交互逻辑
     5     /// </summary>
     6     public partial class App : Application
     7     {
     8         protected override void OnStartup(StartupEventArgs e)
     9         {
    10             base.OnStartup(e);
    11 
    12             //注册Application_Error
    13             this.DispatcherUnhandledException += new DispatcherUnhandledExceptionEventHandler(App_DispatcherUnhandledException);
    14 
    15         }
    16 
    17         //异常处理逻辑
    18         void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
    19         {
    20             //处理完后,我们需要将Handler=true表示已此异常已处理过
    21             e.Handled = true;
    22         }
    23     }
    24 }

    好,下面我们做了示例:

    首先我们拖一个button,事件处理中故意抛出异常。

     1 namespace Demo
     2 {
     3     /// <summary>
     4     /// MainWindow.xaml 的交互逻辑
     5     /// </summary>
     6     public partial class MainWindow : Window
     7     {
     8         public MainWindow()
     9         {
    10             InitializeComponent();
    11         }
    12 
    13         private void button1_Click(object sender, RoutedEventArgs e)
    14         {
    15             throw new Exception("我就害你,我就抛异常");
    16         }
    17     }
    18 }

    然后我们在Application_Error中进行处理,当然实际应用中应该是记一些log日志。

    1         //异常处理逻辑
    2         void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
    3         {
    4             MessageBox.Show("谁tmd惹祸了:" + e.Exception.Message);
    5 
    6             //处理完后,我们需要将Handler=true表示已此异常已处理过
    7             e.Handled = true;
    8         }

    最后看一下效果,注意,我们的程序并没有崩溃。

  • 相关阅读:
    Http中的patch
    如何实现腾讯地图的路径规划功能?
    各类数据库分页SQL语法
    ABC222F
    ABC222 G
    LG5308 [COCI2019] Quiz(wqs二分+斜率优化DP)
    [USACO21OPEN] Portals G(Kruskal)
    【做题笔记】SP27379 BLUNIQ
    【做题笔记】CF938C Constructing Tests
    CSP-J/S2021 自闭记
  • 原文地址:https://www.cnblogs.com/huangxincheng/p/2552322.html
Copyright © 2011-2022 走看看