{"record":{"id":"fbe2cac17217a458","repo":"dotnet/wpf","slug":"sr-textpositionisfrozen","errorCode":null,"errorMessage":"SR.TextPositionIsFrozen","messagePattern":"SR\\.TextPositionIsFrozen","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Documents/DocumentSequenceTextPointer.cs","lineNumber":453,"sourceCode":"\n        #region TextNavigator Methods\n\n        /// <summary>\n        /// <see cref=\"ITextPointer.MoveByOffset\"/>\n        /// </summary>\n        bool ITextPointer.MoveToNextContextPosition(LogicalDirection direction)\n        {\n            Debug.Assert(!_isFrozen, \"Can't reposition a frozen pointer!\");\n            return DocumentSequenceTextPointer.iScan(this, direction);\n        }\n\n\n        /// <summary>\n        /// <see cref=\"ITextPointer.MoveByOffset\"/>\n        /// </summary>\n        int ITextPointer.MoveByOffset(int offset)\n        {\n            if (_isFrozen) throw new InvalidOperationException(SR.TextPositionIsFrozen);\n\n            if (DocumentSequenceTextPointer.iScan(this, offset))\n            {\n                return offset;\n            }\n            else\n            {\n                return 0;\n            }\n        }\n\n        /// <summary>\n        /// <see cref=\"ITextPointer.MoveToPosition\"/>\n        /// </summary>\n        void ITextPointer.MoveToPosition(ITextPointer position)\n        {\n            DocumentSequenceTextPointer tp = this.AggregatedContainer.VerifyPosition(position);\n","sourceCodeStart":435,"sourceCodeEnd":471,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Documents/DocumentSequenceTextPointer.cs#L435-L471","documentation":"This InvalidOperationException is thrown by DocumentSequenceTextPointer.ITextPointer.MoveByOffset when the text pointer is frozen. Frozen pointers (created with ITextPointer.Freeze) are immutable; any mutation API that would change their position must reject the call. The library throws eagerly rather than silently ignoring the move.","triggerScenarios":"Calling MoveByOffset (or MoveToLineBoundary/MoveByCharacter variants that route through it) on a DocumentSequenceTextPointer whose _isFrozen flag is true, i.e. one on which Freeze() was previously called.","commonSituations":"Sharing a cached pointer across code paths where one consumer froze it; holding a pointer snapshot for comparison/editing detection and then attempting to navigate with it; editor/text-selection code that freezes pointers for stability checks and later reuses them for movement.","solutions":["Create a mutable clone before moving: call CreatePointer() (or CreateStaticPointer for read-only use) on the frozen pointer and call MoveByOffset on the clone.","Remove the unnecessary Freeze() call if the pointer still needs to be moved.","Guard with pointer.IsFrozen and only move unfrozen pointers."],"exampleFix":"// before\nfrozenPointer.MoveByOffset(3);\n// after\nif (!frozenPointer.IsFrozen)\n    frozenPointer.MoveByOffset(3);\nelse\n    var movable = frozenPointer.CreatePointer();\n    movable.MoveByOffset(3);","handlingStrategy":"try-catch","validationCode":"if (pointer == null || pointer.IsFrozen) pointer = pointer?.CreatePointer();","typeGuard":"bool IsMovable(ITextPointer p) => p is { IsFrozen: false };","tryCatchPattern":"try { pointer.MoveByOffset(offset); } catch (InvalidOperationException) { var clone = pointer.CreatePointer(); clone.MoveByOffset(offset); }","preventionTips":["Never call mutation APIs (Move*, InsertText) on frozen pointers.","Clone with CreatePointer() before navigating a pointer you did not create yourself.","Check IsFrozen in helper utilities that accept ITextPointer."],"tags":["wpf","textpointer","invalid-operation"],"backgroundTag":"invalid-state-transition","analyzedSha":"81131a70a4c573cd62748a5c36908fc4d662daa9","analyzedAt":"2026-09-14T10:12:48.479Z","contentChangedAt":"2026-09-14T10:12:48.479Z","schemaVersion":2},"datasetVersion":"2026-09-22T01:17:13.364Z"}