{"record":{"id":"7ee08e91e36a4e0a","repo":"dotnet/wpf","slug":"sr-beginendtextcontainermismatch","errorCode":null,"errorMessage":"SR.BeginEndTextContainerMismatch","messagePattern":"SR\\.BeginEndTextContainerMismatch","errorType":"validation","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/UIAutomation/UIAutomationClientSideProviders/MS/Internal/AutomationProxies/WordBreaker.cs","lineNumber":735,"sourceCode":"                return textChangedHandler;\n            }\n        }\n\n        #endregion\n\n        #region Text Helpers\n\n        #region Navigation\n        internal static string GenerateText(TextPosition begin, TextPosition end)\n        {\n            StringBuilder output = new StringBuilder();\n            TextNavigator navigator = begin.CreateNavigator();\n            TextSymbolType type;\n            Span<char> buffer = stackalloc char[1];\n            char ch;\n\n            if (begin.TextContainer != end.TextContainer)\n                throw new ArgumentException(SR.BeginEndTextContainerMismatch);\n\n            navigator.MoveToPosition(begin);\n            type = navigator.GetSymbolType(LogicalDirection.Forward);\n            while (navigator < end)\n            {\n                switch (type)\n                {\n                    case TextSymbolType.Character:\n                        navigator.GetText(LogicalDirection.Forward, 1, navigator.TextContainer.End, buffer, 0);\n                        ch = buffer[0];\n                        output.Append(ch);\n                        break;\n\n                    case TextSymbolType.EmbeddedObject:\n                        ch = '\\xF8FF';      // Private use Unicode.\n                        output.Append(ch);\n                        break;\n","sourceCodeStart":717,"sourceCodeEnd":753,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/UIAutomation/UIAutomationClientSideProviders/MS/Internal/AutomationProxies/WordBreaker.cs#L717-L753","documentation":"GenerateText in the UIA WordBreaker throws ArgumentException when the begin and end TextPointer values passed to it are attached to two different text containers. Text ranges must lie within a single text container so a TextNavigator can walk from begin to end. This is an API-misuse guard inside UIAutomationClientSideProviders.","triggerScenarios":"Calling GenerateText (via BreakText) with two TextPointer instances whose .TextContainer properties differ, e.g. mixing pointers from two different text documents/elements or pointers captured before a container was rebuilt.","commonSituations":"Automation client code caching TextPointer values across container re-creations (document reload), or combining pointers from separate controls in a single range for word-breaking.","solutions":["Ensure both begin and end pointers come from the same TextContainer / same element before calling.","Re-fetch both pointers from the current element instead of reusing stale ones from a previous instance.","Wrap the call in a try/catch for ArgumentException and fall back to per-element processing."],"exampleFix":"// before\nwordBreaker.BreakText(oldPointer, newTextPointer);\n// after\nif (!ReferenceEquals(oldPointer.TextContainer, newTextPointer.TextContainer))\n    newTextPointer = element.CurrentTextPointer; // re-fetch from same container\nwordBreaker.BreakText(oldPointer, newTextPointer);","handlingStrategy":"validation","validationCode":"if (!ReferenceEquals(begin?.TextContainer, end?.TextContainer))\n    throw new InvalidOperationException(\"begin/end must belong to the same text container\");","typeGuard":"bool SameContainer(TextPointer a, TextPointer b) => a != null && b != null && ReferenceEquals(a.TextContainer, b.TextContainer);","tryCatchPattern":"try { GenerateText(begin, end); }\ncatch (ArgumentException ex) when (ex.Message.Contains(\"BeginEndTextContainerMismatch\")) { /* process each container separately */ }","preventionTips":["Always derive both TextPointers from the same element/text container","Re-fetch pointers after any document reload or layout rebuild","Assert container equality in helper methods before calling word-break APIs"],"tags":["uiautomation","argument-exception","text-pointers"],"backgroundTag":"incompatible-source-type","analyzedSha":"81131a70a4c573cd62748a5c36908fc4d662daa9","analyzedAt":"2026-09-14T10:12:48.479Z","contentChangedAt":"2026-09-14T10:12:48.479Z","schemaVersion":2},"datasetVersion":"2026-09-21T21:30:21.729Z"}