{"record":{"id":"56b3bc760c8bd208","repo":"dotnet/wpf","slug":"sr-typemetadatacannotchangeafteruse-56b3bc","errorCode":null,"errorMessage":"SR.TypeMetadataCannotChangeAfterUse","messagePattern":"SR\\.TypeMetadataCannotChangeAfterUse","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/FrameworkPropertyMetadata.cs","lineNumber":319,"sourceCode":"            }\n\n            if (IsFlagSet(FrameworkPropertyMetadataOptions.SubPropertiesDoNotAffectRender, flags))\n            {\n                SubPropertiesDoNotAffectRender = true;\n            }\n        }\n\n        /// <summary>\n        ///     Property affects measurement\n        /// </summary>\n        public bool AffectsMeasure\n        {\n            get { return ReadFlag(MetadataFlags.FW_AffectsMeasureID); }\n            set\n            {\n                if (IsSealed)\n                {\n                    throw new InvalidOperationException(SR.TypeMetadataCannotChangeAfterUse);\n                }\n\n                WriteFlag(MetadataFlags.FW_AffectsMeasureID, value);\n            }\n        }\n\n        /// <summary>\n        ///     Property affects arragement\n        /// </summary>\n        public bool AffectsArrange\n        {\n            get { return ReadFlag(MetadataFlags.FW_AffectsArrangeID); }\n            set\n            {\n                if (IsSealed)\n                {\n                    throw new InvalidOperationException(SR.TypeMetadataCannotChangeAfterUse);\n                }","sourceCodeStart":301,"sourceCodeEnd":337,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/FrameworkPropertyMetadata.cs#L301-L337","documentation":"The AffectsMeasure property setter throws InvalidOperationException when the metadata has been sealed. Once a dependency property is registered (or metadata is added via OverrideMetadata/AddOwner), WPF seals it so layout-related flags can no longer change; mutating them afterwards would invalidate already-computed layout information.","triggerScenarios":"Setting metadata.AffectsMeasure = true on a FrameworkPropertyMetadata instance after that metadata was passed to DependencyProperty.Register, OverrideMetadata, or AddOwner (i.e. after metadata.Sealed is true).","commonSituations":"Toggling AffectsMeasure at runtime in response to user settings; a static constructor order issue where another type's static initializer registered the metadata first; unit tests reusing a cached metadata object across registrations.","solutions":["Set AffectsMeasure in the constructor or FrameworkPropertyMetadataOptions flags BEFORE passing the metadata to Register/OverrideMetadata/AddOwner.","Create a fresh FrameworkPropertyMetadata instance with the desired options instead of mutating the sealed one.","Check metadata.IsSealed before setting and fail fast with a clear message in debug builds."],"exampleFix":"// before\nFrameworkPropertyMetadata m = (FrameworkPropertyMetadata)MyProperty.GetMetadata(typeof(MyControl));\nm.AffectsMeasure = true; // throws once sealed\n// after\nvar m = new FrameworkPropertyMetadata(defaultValue, FrameworkPropertyMetadataOptions.AffectsMeasure);\nDependencyProperty.Register(\"MyProperty\", typeof(double), typeof(MyControl), m);","handlingStrategy":"validation","validationCode":"if (metadata.IsSealed)\n    throw new InvalidOperationException(\"Metadata already sealed; create a new FrameworkPropertyMetadata before setting AffectsMeasure.\");","typeGuard":"static bool CanModify(FrameworkPropertyMetadata m) => !m.IsSealed;","tryCatchPattern":"try { meta.AffectsMeasure = true; }\ncatch (InvalidOperationException ex) { log.Warn(\"Metadata sealed; recreate with FrameworkPropertyMetadataOptions.AffectsMeasure\", ex); }","preventionTips":["Set all FrameworkPropertyMetadataOptions flags in the constructor, before Register/OverrideMetadata/AddOwner.","Never mutate metadata returned from GetMetadata - always create a new instance.","Register dependency properties and configure metadata together in static constructors."],"tags":["wpf","dependency-properties","sealed-metadata"],"backgroundTag":"invalid-state-transition","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"}