{"record":{"id":"30772f01eb20ddd9","repo":"dotnet/wpf","slug":"sr-textpositionisfrozen-fixedtextpointer","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/FixedTextPointer.cs","lineNumber":391,"sourceCode":"        /// <see cref=\"ITextPointer.MoveByOffset\"/>\n        /// </summary>\n        bool ITextPointer.MoveToNextContextPosition(LogicalDirection direction)\n        {\n            Debug.Assert(!_isFrozen, \"Can't reposition a frozen pointer!\");\n\n            ValidationHelper.VerifyDirection(direction, \"direction\");\n            Debug.Assert(!_isFrozen, \"Can't reposition a frozen pointer!\");\n\n            return _flowPosition.Move(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 (!_flowPosition.Move(offset))\n            {\n                throw new ArgumentException(SR.BadDistance, nameof(offset));\n            }\n            else\n            {\n                return offset;\n            }\n        }\n\n        /// <summary>\n        /// <see cref=\"ITextPointer.MoveToPosition\"/>\n        /// </summary>\n        void ITextPointer.MoveToPosition(ITextPointer position)\n        {\n            FixedTextPointer ftp = this.FixedTextContainer.VerifyPosition(position);\n","sourceCodeStart":373,"sourceCodeEnd":409,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Documents/FixedTextPointer.cs#L373-L409","documentation":"ITextPointer.MoveByOffset on FixedTextPointer throws InvalidOperationException(SR.TextPositionIsFrozen) when the pointer was created as frozen/static. Frozen pointers are immutable snapshots (e.g. created via CreateStaticPointer) and cannot be moved.","triggerScenarios":"Calling MoveByOffset on a FixedTextPointer obtained from CreateStaticPointer or otherwise flagged _isFrozen — e.g. static pointers from document structure queries.","commonSituations":"Storing static pointers for later navigation; code that treats all ITextPointers as mutable; passing a frozen pointer into APIs that adjust offsets.","solutions":["Create a dynamic (non-frozen) pointer via CreateDynamicPointer and move that instead.","Clone/duplicate the frozen pointer's position into a mutable pointer before offsetting.","Guard movement code with a check for the pointer's frozen state.","Catch InvalidOperationException and create a movable pointer at the same position."],"exampleFix":"// before\nstaticPointer.MoveByOffset(5); // throws: frozen\n// after\nvar movable = container.CreateDynamicPointer(staticPointer, LogicalDirection.Forward);\nmovable.MoveByOffset(5);","handlingStrategy":"try-catch","validationCode":"// Guard: only call MoveByOffset on pointers you created as dynamic.\nbool isMovable = !(pointer is FixedTextPointer ftp && ftp.IsFrozen);","typeGuard":"bool IsFrozen(FixedTextPointer p) => p.IsFrozen; // check before mutating","tryCatchPattern":"try { pointer.MoveByOffset(offset); }\ncatch (InvalidOperationException) { var movable = container.CreateDynamicPointer(pointer, LogicalDirection.Forward); movable.MoveByOffset(offset); }","preventionTips":["Keep static/frozen pointers read-only; derive dynamic pointers for navigation.","Document which APIs return frozen pointers and never mutate them.","Centralize pointer movement behind helper methods that check freeze state."],"tags":["wpf","documents","invalid-operation","text-pointer"],"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"}