dotnet/wpf · error · ArgumentException
SR.TextRangeProvider_InvalidRangeProvider
Error message
SR.TextRangeProvider_InvalidRangeProvider
What it means
ArgumentException thrown by TextRangeProviderWrapper.Compare when the passed ITextRangeProvider was not created by the same WPF text pattern peer (i.e. it is not a TextRangeProviderWrapper), so the ranges cannot be meaningfully compared.
Solutions
- Obtain both ranges from the same text provider (clone the range with RangeFromChild/RangeFromPoint/DocumentRange instead of mixing providers)
- Before comparing, verify the range is a TextRangeProviderWrapper of the same peer
- Return false for ranges from foreign providers instead of letting the wrapper throw
Defensive patterns
Strategy: type-guard
When it happens
Trigger: Thrown at src/Microsoft.DotNet.Wpf/src/PresentationCore/MS/internal/Automation/TextRangeProviderWrapper.cs:50 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of dotnet/wpf@81131a70a4 (2026-09-14).
Data as JSON: /api/errors/33a160620cd9e556.
Report an issue: GitHub.
Appendix: source
Thrown at src/Microsoft.DotNet.Wpf/src/PresentationCore/MS/internal/Automation/TextRangeProviderWrapper.cs:50
//------------------------------------------------------
//
// Interface ITextRangeProvider
//
//------------------------------------------------------
#region Interface ITextRangeProvider
public ITextRangeProvider Clone()
{
return (ITextRangeProvider)ElementUtil.Invoke(_peer, new DispatcherOperationCallback(Clone), null);
}
public bool Compare(ITextRangeProvider range)
{
if (!(range is TextRangeProviderWrapper))
{
throw new ArgumentException(SR.Format(SR.TextRangeProvider_InvalidRangeProvider, "range"));
}
return (bool)ElementUtil.Invoke(_peer, new DispatcherOperationCallback(Compare), range);
}
public int CompareEndpoints(TextPatternRangeEndpoint endpoint, ITextRangeProvider targetRange, TextPatternRangeEndpoint targetEndpoint)
{
if (!(targetRange is TextRangeProviderWrapper))
{
throw new ArgumentException(SR.Format(SR.TextRangeProvider_InvalidRangeProvider, "targetRange"));
}
object[] args = new object[] { endpoint, targetRange, targetEndpoint };
return (int)ElementUtil.Invoke(_peer, new DispatcherOperationCallback(CompareEndpoints), args);
}
public void ExpandToEnclosingUnit(TextUnit unit)
{View on GitHub (pinned to 81131a70a4)