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()
                };
            }