WPF知识点全攻略17- 开发小技巧
1、找回Main入口
/// <summary> /// App.xaml 的交互逻辑 /// </summary> public partial class App : Application { [STAThread] public static void Main() { App app = new App(); app.InitializeComponent(); app.Run(); } }
2、全局异常捕获
/// <summary> /// App.xaml 的交互逻辑 /// </summary> public partial class App : Application { protected override void OnStartup(StartupEventArgs e) { //UI线程未捕获异常处理事件(UI主线程) this.DispatcherUnhandledException += App_DispatcherUnhandledException; //非UI线程未捕获异常处理事件(例如自己创建的一个子线程) AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; //Task线程内未捕获异常处理事件 TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException; base.OnStartup(e); } #region 全局日志处理 /// <summary> /// Task线程异常 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e) { Exception ex = e.Exception as Exception; OnExceptionHandler("Task异常:", ex); } /// <summary> /// 主线程异常 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) { Exception ex = e.Exception as Exception; OnExceptionHandler("系统异常", ex); e.Handled = true; } /// <summary> /// 子线程异常 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { Exception ex = e.ExceptionObject as Exception; OnExceptionHandler("非UI线程异常:", ex); } /// <summary> /// 异常处理 封装写日志 /// </summary> /// <param name="ex"></param> private void OnExceptionHandler(string msg, Exception ex) { //GalaSoft.MvvmLight.Messaging.Messenger.Default.Send<bool>(false, "ShowLoading"); var errorMsg = msg; if (ex != null) { if (ex.InnerException != null) { errorMsg += String.Format("【InnerException】{0}\n{1}\n", ex.InnerException.Message, ex.InnerException.StackTrace); } errorMsg += String.Format("{0}\n{1}", ex.Message, ex.StackTrace); } Log4Helper.Error(errorMsg);//自己封装的日志管理 } #endregion }
3、窗体拖动(可指定标题栏等实现)
public MainWindow() { InitializeComponent(); this.Loaded += (r, s) => { this.MouseDown += (x, y) => { if (y.LeftButton == MouseButtonState.Pressed) { this.DragMove(); } }; }; }
4、强制退出所有线程(后台线程较多且没有控制好注销时使用)
public MainWindow() { InitializeComponent(); this.Closed += (r, s) => { Environment.Exit(0); }; }
4、WPF中使用WindowsFormsHost嵌套嵌入WinForms控件时,需要释放内存占用
WindowsFormsHost.Child = null;
WPF知识点全攻略目录:https://www.cnblogs.com/kuangxiangnice/p/11040070.html