{"record":{"id":"744316fa3960d739","repo":"dotnet/wpf","slug":"iambientprovider","errorCode":null,"errorMessage":"IAmbientProvider","messagePattern":"IAmbientProvider","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/StaticResourceExtension.cs","lineNumber":204,"sourceCode":"                             : prefetchedValue.GetValue(BaseValueSourceInternal.Unknown);\n                }\n\n            }\n            return value;\n        }\n\n        private ResourceDictionary FindTheResourceDictionary(IServiceProvider serviceProvider, bool isDeferredContentSearch)\n        {\n            var schemaContextProvider = serviceProvider.GetService(typeof(IXamlSchemaContextProvider)) as IXamlSchemaContextProvider;\n            if (schemaContextProvider == null)\n            {\n                throw new InvalidOperationException(SR.Format(SR.MarkupExtensionNoContext, GetType().Name, \"IXamlSchemaContextProvider\"));\n            }\n\n            var ambientProvider = serviceProvider.GetService(typeof(IAmbientProvider)) as IAmbientProvider;\n            if (ambientProvider == null)\n            {\n                throw new InvalidOperationException(SR.Format(SR.MarkupExtensionNoContext, GetType().Name, \"IAmbientProvider\"));\n            }\n\n            XamlSchemaContext schemaContext = schemaContextProvider.SchemaContext;\n\n            // This seems like a lot of work to do on every Provide Value\n            // but that types and properties are cached in the schema.\n            //\n            XamlType feXType = schemaContext.GetXamlType(typeof(FrameworkElement));\n            XamlType styleXType = schemaContext.GetXamlType(typeof(Style));\n            XamlType templateXType = schemaContext.GetXamlType(typeof(FrameworkTemplate));\n            XamlType appXType = schemaContext.GetXamlType(typeof(Application));\n            XamlType fceXType = schemaContext.GetXamlType(typeof(FrameworkContentElement));\n\n            XamlMember fceResourcesProperty = fceXType.GetMember(\"Resources\");\n            XamlMember feResourcesProperty = feXType.GetMember(\"Resources\");\n            XamlMember styleResourcesProperty = styleXType.GetMember(\"Resources\");\n            XamlMember styleBasedOnProperty = styleXType.GetMember(\"BasedOn\");\n            XamlMember templateResourcesProperty = templateXType.GetMember(\"Resources\");","sourceCodeStart":186,"sourceCodeEnd":222,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/StaticResourceExtension.cs#L186-L222","documentation":"FindTheResourceDictionary next requests IAmbientProvider from the IServiceProvider; if missing it throws InvalidOperationException (MarkupExtensionNoContext naming \"IAmbientProvider\"). StaticResource resolution needs ambient (ancestor) value lookup, which only the XAML loader provides.","triggerScenarios":"Invoking StaticResourceExtension.ProvideValue with a service provider that supplies IXamlSchemaContextProvider but not IAmbientProvider, or running the extension outside a XAML parse with an incomplete service container.","commonSituations":"Hand-rolled service providers in tests or design-time tools that stub one service but not the other; custom XAML pipelines built with XamlObjectWriter settings that disable ambient property lookup.","solutions":["Use the extension only within real XAML markup where the loader supplies IAmbientProvider.","In code, replace with element.FindResource/TryFindResource or Resources[\"key\"] lookups.","Complete the IServiceProvider so it also serves IAmbientProvider (usually by going through the standard XAML reader/writer pipeline)."],"exampleFix":"// before\nvar sp = new ServiceProvider(); sp.Add(typeof(IXamlSchemaContextProvider), ctx);\nvar v = ext.ProvideValue(sp); // missing IAmbientProvider\n// after\nvar v = element.FindResource(\"MyKey\");","handlingStrategy":"fallback","validationCode":"bool hasAmbient = serviceProvider?.GetService(typeof(IAmbientProvider)) != null;\nif (!hasAmbient) { /* resolve via element.FindResource instead */ }","typeGuard":"static bool SupportsAmbientLookup(IServiceProvider sp) => sp?.GetService(typeof(IAmbientProvider)) is IAmbientProvider;","tryCatchPattern":"try { value = ext.ProvideValue(sp); }\ncatch (InvalidOperationException ex) when (ex.Message.Contains(\"IAmbientProvider\")) { value = element.FindResource(key); }","preventionTips":["Rely on the standard XAML reader/writer pipeline to register IAmbientProvider.","Do not hand-build partial IServiceProvider implementations for markup extensions.","Use FrameworkElement.FindResource for all code-behind resource access."],"tags":["markup-extension","xaml","invalid-state","wpf"],"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"}