{"record":{"id":"eed32d5fafad49c1","repo":"dotnet/wpf","slug":"sr-image-cantbefrozen","errorCode":null,"errorMessage":"SR.Image_CantBeFrozen","messagePattern":"SR\\.Image_CantBeFrozen","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/Media/Imaging/BitmapVisualManager.cs","lineNumber":32,"sourceCode":"    /// </summary>\n    internal class BitmapVisualManager : DispatcherObject\n    {\n        #region Constructors\n        private BitmapVisualManager()\n        {\n        }\n\n        /// <summary>\n        /// Create an BitmapVisualManager for drawing a visual to the bitmap.\n        /// </summary>\n        /// <param name=\"bitmapTarget\">Where the resulting bitmap is rendered</param>\n        public BitmapVisualManager(RenderTargetBitmap bitmapTarget)\n        {\n            ArgumentNullException.ThrowIfNull(bitmapTarget);\n\n            if (bitmapTarget.IsFrozen)\n            {\n                throw new ArgumentException(SR.Format(SR.Image_CantBeFrozen, null));\n            }\n\n            _bitmapTarget = bitmapTarget;\n        }\n\n        #endregion\n\n        #region Public methods\n        /// <summary>\n        /// Render visual to printer.\n        /// </summary>\n        /// <param name=\"visual\">Root of the visual to render</param>\n        public void Render(Visual visual)\n        {\n            Render(visual, Matrix.Identity, Rect.Empty);\n        }\n\n        /// <summary>","sourceCodeStart":14,"sourceCodeEnd":50,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/Media/Imaging/BitmapVisualManager.cs#L14-L50","documentation":"The BitmapVisualManager constructor throws ArgumentException with SR.Image_CantBeFrozen when the supplied RenderTargetBitmap is frozen (Freezable.IsFrozen == true). A frozen target is immutable, so a manager whose purpose is to render into it cannot work.","triggerScenarios":"new BitmapVisualManager(someRenderTargetBitmap) where the bitmap was frozen via Freeze() or obtained from a frozen/shared freezable resource.","commonSituations":"Sharing a cached RenderTargetBitmap declared in a resource dictionary with freeze enabled, or explicitly freezing for thread-safety before handing it to the manager.","solutions":["Pass a mutable (non-frozen) RenderTargetBitmap to the constructor.","Do not Freeze() the bitmap if it will be a render target; freeze only copies/outputs.","Clone the frozen bitmap (RenderTargetBitmap.Clone()) if you need a writable copy for rendering."],"exampleFix":"// before\nbitmap.Freeze();\nvar mgr = new BitmapVisualManager(bitmap); // throws\n// after\nvar mgr = new BitmapVisualManager(bitmap); // keep mutable while rendering\n// ... render ...\nbitmap.Freeze(); // only after rendering completes","handlingStrategy":"validation","validationCode":"if (bitmapTarget == null) throw new ArgumentNullException(nameof(bitmapTarget));\nif (bitmapTarget.IsFrozen)\n    throw new ArgumentException(\"render target must not be frozen\", nameof(bitmapTarget));","typeGuard":"bool IsRenderable(RenderTargetBitmap bmp) => bmp != null && !bmp.IsFrozen;","tryCatchPattern":"try { var mgr = new BitmapVisualManager(rtBitmap); } catch (ArgumentException) { rtBitmap = rtBitmap.Clone(); var mgr = new BitmapVisualManager(rtBitmap); }","preventionTips":["Never Freeze() a bitmap used as a render target","Freeze only after all rendering is complete","Watch resource-dictionary sharing that may auto-freeze"],"tags":["wpf","imaging","freezable","invalid-state"],"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"}