dotnet/wpf · error · InvalidOperationException

SR.Animation_NoTextChildren

Error message

SR.Animation_NoTextChildren

What it means

DoubleAnimationUsingKeyFrames.AddText throws InvalidOperationException(SR.Animation_NoTextChildren) because timelines cannot accept text content. It exists only to satisfy the IAddChild contract and always throws. Text placed inside the element's tags in XAML triggers this.

Solutions

  1. Remove all text content from the DoubleAnimationUsingKeyFrames element
  2. Set values via KeyFrame child elements' Value/KeyTime attributes instead
  3. Replace a text-specified value with <LinearDoubleKeyFrame Value="..." KeyTime="..."/>

Example fix

// before (XAML)
<DoubleAnimationUsingKeyFrames>
  0;50;100
</DoubleAnimationUsingKeyFrames>
// after
<DoubleAnimationUsingKeyFrames>
  <LinearDoubleKeyFrame Value="0" KeyTime="0:0:0" />
  <LinearDoubleKeyFrame Value="100" KeyTime="0:0:1" />
</DoubleAnimationUsingKeyFrames>
Defensive patterns

Strategy: validation

Validate before calling

// Before saving XAML, ensure animation elements have no inner text nodes:
// XElement.Parse(xaml).Descendants().Where(e => e.HasContent && e.Nodes().Any(n => n is XText t && !string.IsNullOrWhiteSpace(t.Value)))

Prevention

When it happens

Trigger: Including literal text content inside a <DoubleAnimationUsingKeyFrames> element in XAML (e.g. stray text, whitespace-plus-characters, or mistaken inner text), which routes through IAddChild.AddText.

Common situations: XAML authoring mistakes such as typing a value directly inside the animation element instead of on a key frame's Value attribute; copy/paste artifacts leaving text nodes inside the element.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


AI-assisted analysis of dotnet/wpf@81131a70a4 (2026-09-14). Data as JSON: /api/errors/4d25bb009092b8f1. Report an issue: GitHub.

Appendix: source

Thrown at src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/Media/Animation/Generated/DoubleAnimationUsingKeyFrames.cs:277

        /// WritePreamble() or WritePostscript().  It also doesn't throw an
        /// ArgumentNullException if the childText parameter is null.  These tasks
        /// are performed by the interface implementation.  Therefore, it's OK
        /// for a derived class to override this method and call the base
        /// class implementation only if they determine that it's the right
        /// course of action.  The derived class can rely on KeyFrameAnimation's
        /// implementation of IAddChild.AddChild or implement their own
        /// following the Freezable pattern since that would be a public
        /// method.
        /// </remarks>
        /// <param name="childText">A string representing the child text that
        /// should be added.  If this is a KeyFrameAnimation an exception will be
        /// thrown.</param>
        /// <exception cref="InvalidOperationException">Timelines have no way
        /// of adding text.</exception>
        [EditorBrowsable(EditorBrowsableState.Advanced)]
        protected virtual void AddText(string childText)
        {
            throw new InvalidOperationException(SR.Animation_NoTextChildren);
        }

        #endregion

        #region DoubleAnimationBase

        /// <summary>
        /// Calculates the value this animation believes should be the current value for the property.
        /// </summary>
        /// <param name="defaultOriginValue">
        /// This value is the suggested origin value provided to the animation
        /// to be used if the animation does not have its own concept of a
        /// start value. If this animation is the first in a composition chain
        /// this value will be the snapshot value if one is available or the
        /// base property value if it is not; otherise this value will be the 
        /// value returned by the previous animation in the chain with an 
        /// animationClock that is not Stopped.
        /// </param>

View on GitHub (pinned to 81131a70a4)