/// <summary> /// 以 可隐藏的方式显示窗口 /// </summary> /// <returns></returns> public new DialogResult ShowDialog() { DialogResult res; res = base.ShowDialog(); while (_HideToOperate) { // MessageBox.Show("进入 while "); // 执行 隐藏后 所要进行的操作 try { ReturnValue = _hideProc.DynamicInvoke(_hideProcArgs); } catch (Exception ex) { throw new InvalidOperationException("A exception in the hide-method was unhandled.", ex.InnerException); } // 在 _hideProc 执行完成后对其返回值进行处理 try { if (_hideMethodReturnedProc != null) { // 使用Invoke完成一个委托方法的封送,就类似于使用SendMessage方法来给界面线程发送消息,是一个同步方法。 // 也就是说在Invoke封送的方法被执行完毕前,Invoke方法不会返回,从而调用者线程将被阻塞。 _hideMethodReturnedProc.Invoke(ReturnValue); } } catch (Exception ex) { throw new InvalidOperationException("A exception in the hideMethodReturnedProc was unhandled.", ex); } // MessageBox.Show("DynamicInvoke 结束"); // 重新初始化 _HideToOperate = false; _hideMethodReturnedProc = null; _hideProc = null; _hideProcArgs = null; // 在上次关闭时的位置重新启动 StartPosition = FormStartPosition.Manual; res = base.ShowDialog(); // MessageBox.Show("第 " + index.ToString() + " 个 ShowDialog 结束"); } // MessageBox.Show("ShowDialog 完全结束"); return(res); }
/// <summary> /// 一个伪异步方法,此方法会在执行Hide之后立即返回。 /// </summary> /// <param name="hideProc"> 要与 Revit 进行交互的方法的委托。请在此方法中自行设置异常处理。 /// 此方法如果有返回值,则通过响应 reternProc 事件来获取返回值。 </param> /// <param name="reternProc"> 当 hideProc 执行完成并得到了返回值后接着执行reternProc方法,请在此方法中自行设置异常处理。 /// 执行完reternProc后,即会立即执行 Window.ShowDialog(); </param> /// <param name="hideProcArgs"> 方法 hideProc 中的输入参数,如果没有参数,则输入 null </param> /// <remarks>此方法后面不要再有任何的代码语句,如果要处理 hideProc 返回的结果,请在 reternProc 中进行操作。</remarks> public void HideAndOperate(Delegate hideProc, HideMethodReturnedProc reternProc = null, params object[] hideProcArgs) { // _hideProc = hideProc; _hideProcArgs = hideProcArgs; _hideMethodReturnedProc = reternProc; // _HideToOperate = true; // 将此 ShowDialog 窗口关闭,否则不能进行 Revit 中的 PickObject() 这种要与 Revit UI 进行交互的操作。 this.Hide(); // 如果是ShowDialog,则这里用 Close() 或者 Hide() 都可以 //注意线程执行的顺序: Hide() 执行完成后,线程会立即跳出HideAndOperate而继续执行,在 HideAndOperate 执行完成后再跳出 ShowDialog()并继续执行。 }