/// <summary> /// Provides storage for session state associated with the specified <see cref="Frame"/>. /// Frames that have been previously registered with <see cref="RegisterFrame"/> have /// their session state saved and restored automatically as a part of the global /// <see cref="SessionState"/>. Frames that are not registered have transient state /// that can still be useful when restoring pages that have been discarded from the /// navigation cache. /// </summary> /// <remarks>Apps may choose to rely on <see cref="LayoutAwarePage"/> to manage /// page-specific state instead of working with frame session state directly.</remarks> /// <param name="frame">The instance for which session state is desired.</param> /// <returns>A collection of state subject to the same serialization mechanism as /// <see cref="SessionState"/>.</returns> public Dictionary <String, Object> SessionStateForFrame(IMvxWindowsFrame frame) { var frameState = (Dictionary <String, Object>)frame.GetValue(this.MvxFrameSessionStateProperty); if (frameState == null) { var frameSessionKey = (String)frame.GetValue(this.MvxFrameSessionStateKeyProperty); if (frameSessionKey != null) { // Registered frames reflect the corresponding session state if (!this._sessionState.ContainsKey(frameSessionKey)) { this._sessionState[frameSessionKey] = new Dictionary <String, Object>(); } frameState = (Dictionary <String, Object>) this._sessionState[frameSessionKey]; } else { // Frames that aren't registered have transient state frameState = new Dictionary <String, Object>(); } frame.SetValue(this.MvxFrameSessionStateProperty, frameState); } return(frameState); }
/// <summary> /// Disassociates a <see cref="Frame"/> previously registered by <see cref="RegisterFrame"/> /// from <see cref="SessionState"/>. Any navigation state previously captured will be /// removed. /// </summary> /// <param name="frame">An instance whose navigation history should no longer be /// managed.</param> public void UnregisterFrame(IMvxWindowsFrame frame) { // Remove session state and remove the frame from the list of frames whose navigation // state will be saved (along with any weak references that are no longer reachable) this.SessionState.Remove((String)frame.GetValue(this.MvxFrameSessionStateKeyProperty)); this._registeredFrames.RemoveAll((weakFrameReference) => { IMvxWindowsFrame testFrame; return(!weakFrameReference.TryGetTarget(out testFrame) || testFrame == frame); }); }
/// <summary> /// Registers a <see cref="Frame"/> instance to allow its navigation history to be saved to /// and restored from <see cref="SessionState"/>. Frames should be registered once /// immediately after creation if they will participate in session state management. Upon /// registration if state has already been restored for the specified key /// the navigation history will immediately be restored. Subsequent invocations of /// <see cref="RestoreAsync"/> will also restore navigation history. /// </summary> /// <param name="frame">An instance whose navigation history should be managed by /// <see cref="MvxSuspensionManager"/></param> /// <param name="sessionStateKey">A unique key into <see cref="SessionState"/> used to /// store navigation-related information.</param> public void RegisterFrame(IMvxWindowsFrame frame, String sessionStateKey) { if (frame.GetValue(this.MvxFrameSessionStateKeyProperty) != null) { throw new InvalidOperationException("Frames can only be registered to one session state key"); } if (frame.GetValue(this.MvxFrameSessionStateProperty) != null) { throw new InvalidOperationException("Frames must be either be registered before accessing frame session state, or not registered at all"); } // Use a dependency property to associate the session key with a frame, and keep a list of frames whose // navigation state should be managed frame.SetValue(this.MvxFrameSessionStateKeyProperty, sessionStateKey); this._registeredFrames.Add(new WeakReference <IMvxWindowsFrame>(frame)); // Check to see if navigation state can be restored this.RestoreFrameNavigationState(frame); }
/// <summary> /// Provides storage for session state associated with the specified <see cref="Frame"/>. /// Frames that have been previously registered with <see cref="RegisterFrame"/> have /// their session state saved and restored automatically as a part of the global /// <see cref="SessionState"/>. Frames that are not registered have transient state /// that can still be useful when restoring pages that have been discarded from the /// navigation cache. /// </summary> /// <remarks>Apps may choose to rely on <see cref="LayoutAwarePage"/> to manage /// page-specific state instead of working with frame session state directly.</remarks> /// <param name="frame">The instance for which session state is desired.</param> /// <returns>A collection of state subject to the same serialization mechanism as /// <see cref="SessionState"/>.</returns> public Dictionary<string, object> SessionStateForFrame(IMvxWindowsFrame frame) { var frameState = (Dictionary<string, object>)frame.GetValue(this.MvxFrameSessionStateProperty); if (frameState == null) { var frameSessionKey = (string)frame.GetValue(this.MvxFrameSessionStateKeyProperty); if (frameSessionKey != null) { // Registered frames reflect the corresponding session state if (!this.SessionState.ContainsKey(frameSessionKey)) { this.SessionState[frameSessionKey] = new Dictionary<string, object>(); } frameState = (Dictionary<string, object>)this.SessionState[frameSessionKey]; } else { // Frames that aren't registered have transient state frameState = new Dictionary<string, object>(); } frame.SetValue(this.MvxFrameSessionStateProperty, frameState); } return frameState; }
/// <summary> /// Disassociates a <see cref="Frame"/> previously registered by <see cref="RegisterFrame"/> /// from <see cref="SessionState"/>. Any navigation state previously captured will be /// removed. /// </summary> /// <param name="frame">An instance whose navigation history should no longer be /// managed.</param> public void UnregisterFrame(IMvxWindowsFrame frame) { // Remove session state and remove the frame from the list of frames whose navigation // state will be saved (along with any weak references that are no longer reachable) this.SessionState.Remove((string)frame.GetValue(this.MvxFrameSessionStateKeyProperty)); this._registeredFrames.RemoveAll((weakFrameReference) => { IMvxWindowsFrame testFrame; return !weakFrameReference.TryGetTarget(out testFrame) || testFrame == frame; }); }
/// <summary> /// Registers a <see cref="Frame"/> instance to allow its navigation history to be saved to /// and restored from <see cref="SessionState"/>. Frames should be registered once /// immediately after creation if they will participate in session state management. Upon /// registration if state has already been restored for the specified key /// the navigation history will immediately be restored. Subsequent invocations of /// <see cref="RestoreAsync"/> will also restore navigation history. /// </summary> /// <param name="frame">An instance whose navigation history should be managed by /// <see cref="MvxSuspensionManager"/></param> /// <param name="sessionStateKey">A unique key into <see cref="SessionState"/> used to /// store navigation-related information.</param> public void RegisterFrame(IMvxWindowsFrame frame, string sessionStateKey) { if (frame.GetValue(this.MvxFrameSessionStateKeyProperty) != null) { throw new InvalidOperationException("Frames can only be registered to one session state key"); } if (frame.GetValue(this.MvxFrameSessionStateProperty) != null) { throw new InvalidOperationException("Frames must be either be registered before accessing frame session state, or not registered at all"); } // Use a dependency property to associate the session key with a frame, and keep a list of frames whose // navigation state should be managed frame.SetValue(this.MvxFrameSessionStateKeyProperty, sessionStateKey); this._registeredFrames.Add(new WeakReference<IMvxWindowsFrame>(frame)); // Check to see if navigation state can be restored this.RestoreFrameNavigationState(frame); }