public void AddFrame(Func <Action> EnterAndGetExit, bool PreserveFuture) { if (!PreserveFuture) { this.GoForward.Clear(); } this.Owner.ButtonGoForward.Enabled = this.GoForward.Any(); if (AddFrame_Current != null) { AddFrame_Current.Exit(); var AddFrame_Back = AddFrame_Current; this.Owner.ButtonGoBack.Enabled = true; this.GoBack.Push( delegate { if (AddFrame_Current != null) { AddFrame_Current.Exit(); var AddFrame_Forward = AddFrame_Current; this.Owner.ButtonGoForward.Enabled = true; this.GoForward.Push( delegate { AddFrame(AddFrame_Forward.EnterAndGetExit, true); } ); } AddFrame_Current = AddFrame_Back; AddFrame_Current.Exit = AddFrame_Current.EnterAndGetExit(); this.Owner.ButtonGoBack.Enabled = this.GoBack.Any(); } ); } AddFrame_Current = new FrameInfo { EnterAndGetExit = EnterAndGetExit, Exit = EnterAndGetExit() }; }