{"record":{"id":"554c9f9f1b44da51","repo":"dotnet/wpf","slug":"storyboard-unrecognizedtimeseekorigin","errorCode":"Storyboard_UnrecognizedTimeSeekOrigin","errorMessage":"SR.Storyboard_UnrecognizedTimeSeekOrigin","messagePattern":"SR\\.Storyboard_UnrecognizedTimeSeekOrigin","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Media/Animation/SeekStoryboard.cs","lineNumber":81,"sourceCode":"    {\n        get\n        {\n            return _origin;\n        }\n        set\n        {\n            if (IsSealed)\n            {\n                throw new InvalidOperationException(SR.Format(SR.CannotChangeAfterSealed, \"SeekStoryboard\"));\n            }\n\n            if( value == TimeSeekOrigin.BeginTime || value == TimeSeekOrigin.Duration ) // FxCop doesn't like Enum.IsDefined, probably need some central validation mechanism.\n            {\n                _origin = value;\n            }\n            else\n            {\n                throw new ArgumentException(SR.Storyboard_UnrecognizedTimeSeekOrigin);\n            }\n        }\n    }\n\n    /// <summary>\n    ///     Called when it's time to execute this storyboard action\n    /// </summary>\n    internal override void Invoke( FrameworkElement containingFE, FrameworkContentElement containingFCE, Storyboard storyboard )\n    {\n        Debug.Assert( containingFE != null || containingFCE != null,\n            \"Caller of internal function failed to verify that we have a FE or FCE - we have neither.\" );\n\n        if( containingFE != null )\n        {\n            storyboard.Seek(containingFE, Offset, Origin);\n        }\n        else\n        {","sourceCodeStart":63,"sourceCodeEnd":99,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Media/Animation/SeekStoryboard.cs#L63-L99","documentation":"The Origin setter of SeekStoryboard validates that the assigned value is exactly TimeSeekOrigin.BeginTime or TimeSeekOrigin.Duration; any other TimeSeekOrigin cast value throws ArgumentException because it is not a recognized seek origin.","triggerScenarios":"Assigning Origin from an unchecked cast or parsed value, e.g. (TimeSeekOrigin)intValue where intValue is 3+ or negative, or a default(TimeSeekOrigin) of 0.","commonSituations":"Reading Origin values from configuration/user input and casting without validation; marshaling enum values across component boundaries.","solutions":["Only assign TimeSeekOrigin.BeginTime or TimeSeekOrigin.Duration.","Validate the numeric source value before casting to TimeSeekOrigin.","Use Enum.TryParse on the string form and confirm the result is one of the two known values."],"exampleFix":"// before\nseek.Origin = (TimeSeekOrigin)enumValue; // may throw\n\n// after\nvar origin = enumValue == 1 ? TimeSeekOrigin.Duration : TimeSeekOrigin.BeginTime;\nseek.Origin = origin;","handlingStrategy":"validation","validationCode":"bool valid = origin == TimeSeekOrigin.BeginTime || origin == TimeSeekOrigin.Duration;","typeGuard":"static bool IsKnownTimeSeekOrigin(TimeSeekOrigin o) => o is TimeSeekOrigin.BeginTime or TimeSeekOrigin.Duration;","tryCatchPattern":"try { seek.Origin = parsedOrigin; } catch (ArgumentException ex) { /* fall back to BeginTime */ }","preventionTips":["Never cast raw ints to TimeSeekOrigin without range-checking","Only assign the two documented enum members","Validate config/user input before mapping to enums"],"tags":["wpf","storyboard","animation","enum","argument-validation"],"backgroundTag":"invalid-enum-value","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"}