dotnet/wpf · error · XamlInternalException
SR.Format(SR.TemplateNotCollected, "WriteEndMember")
Error message
SR.Format(SR.TemplateNotCollected, "WriteEndMember")
What it means
XamlInternalException with SR.TemplateNotCollected thrown from DeferredWriter.WriteEndMember when the writer is in DeferringMode.TemplateReady. Closing a member while TemplateReady means the writer is still waiting for template collection to start, so an end-member write has no matching open member in any deferred region.
Solutions
- Balance member writes inside the deferred region only after TemplateDeferring is active
- Run the node stream through the standard deferring reader/writer pair instead of hand-driving WriteEndMember
- Reinitialize the DeferredWriter to clear the stuck TemplateReady state
- Validate the stream with a plain XamlXmlWriter first to catch imbalance before deferring
Example fix
// before writer.WriteEndMember(); // _mode == TemplateReady -> TemplateNotCollected // after // enter deferred region first, then close members writer.WriteStartMember(member); writer.WriteEndMember(); // balanced within TemplateDeferring
Defensive patterns
Strategy: try-catch
Try / catch
try { deferringWriter.WriteEndMember(); }
catch (XamlInternalException ex) { log.Error("WriteEndMember in TemplateReady state: {0}", ex.Message); } Prevention
- Balance StartMember/EndMember within the deferred region only
- Validate stream balance with a non-deferring writer before deferring
- Reset the writer if TemplateReady persists unexpectedly
- Avoid swallowing earlier XAML exceptions that shift the stream
When it happens
Trigger: WriteEndMember called while _mode == TemplateReady — typically the node stream ends a member immediately after the template became ready, without the template content being collected through TemplateDeferring.
Common situations: Unbalanced WriteStartMember/WriteEndMember pairs spanning the template boundary; custom node-stream transforms that swallow the template-start event; earlier TemplateReady exceptions shifting the stream out of alignment.
Understand the failure class
Background: "This is a bug, please report it": internal invariant violations, unreachable panics, and SNH errors explained — this error's family across 47 libraries.
Related errors
- SR.Format(SR.MissingCase, _mode.ToString(), methodName)
- SR.Format(SR.MissingCase, _mode.ToString()…
- SR.Format(SR.MissingCase, _mode.ToString()…
- SR.Format(SR.MissingCase, _mode.ToString(), "WriteMember")
- SR.Format(SR.TemplateNotCollected, methodName)
AI-assisted analysis of dotnet/wpf@81131a70a4 (2026-09-14).
Data as JSON: /api/errors/6cccf1fe94dcfaf9.
Report an issue: GitHub.
Appendix: source
Thrown at src/Microsoft.DotNet.Wpf/src/System.Xaml/System/Xaml/InfosetObjects/DeferredWriter.cs:175
_deferredWriter.WriteStartMember(property);
_handled = true;
break;
default:
throw new XamlInternalException(SR.Format(SR.MissingCase, _mode.ToString(), "WriteMember"));
}
}
public override void WriteEndMember()
{
_handled = false;
switch (_mode)
{
case DeferringMode.Off:
break;
case DeferringMode.TemplateReady:
throw new XamlInternalException(SR.Format(SR.TemplateNotCollected, "WriteEndMember"));
case DeferringMode.TemplateDeferring:
_deferredWriter.WriteEndMember();
_handled = true;
break;
default:
throw new XamlInternalException(SR.Format(SR.MissingCase, _mode.ToString(), "WriteEndMember"));
}
}
public override void WriteValue(object value)
{
_handled = false;
switch (_mode)
{
case DeferringMode.Off:
break;View on GitHub (pinned to 81131a70a4)