{"record":{"id":"ece19cd88d7880b5","repo":"dotnet/wpf","slug":"value-hwndtarget","errorCode":null,"errorMessage":"value","messagePattern":"value","errorType":"validation","errorClass":"InvalidEnumArgumentException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/InterOp/HwndTarget.cs","lineNumber":658,"sourceCode":"        ///     <para/>\n        ///     Callers must have UIPermission(UIPermissionWindow.AllWindows) to set this property.\n        /// </remarks>\n        public RenderMode RenderMode\n        {\n            get\n            {\n                return _renderModePreference;\n            }\n\n            // Note: We think it is safe to expose this in partial trust, but doing so would suggest\n            // we should also expose HwndSource (the only way to get to the HwndTarget instance).\n            // We don't want to bite off that much exposure at this point in the product, so we enforce\n            // that this is not accessible from partial trust for now.\n            set\n            {\n                if (value != RenderMode.Default && value != RenderMode.SoftwareOnly)\n                {\n                    throw new System.ComponentModel.InvalidEnumArgumentException(\"value\", (int)value, typeof(RenderMode));\n                }\n\n                _renderModePreference = value;\n\n                InvalidateRenderMode();\n            }\n        }\n\n        /// <summary>\n        /// Dispose cleans up the state associated with HwndTarget.\n        /// </summary>\n        public override void Dispose()\n        {\n           // Its outside the try finally block because we want the exception to be\n           // thrown if we are on a different thread and we don't want to call Dispose\n           // on base class in that case.\n           VerifyAccess();\n","sourceCodeStart":640,"sourceCodeEnd":676,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/InterOp/HwndTarget.cs#L640-L676","documentation":"The RenderMode property setter only accepts RenderMode.Default or RenderMode.SoftwareOnly; anything else is not accessible (partly-trust hardening aside, hardware values are set through other paths). An out-of-range value throws InvalidEnumArgumentException with the parameter name 'value'.","triggerScenarios":"Assigning RenderMode.Hardware or RenderMode.HardwareReference directly to HwndTarget.RenderMode, or casting an arbitrary int to RenderMode and assigning it.","commonSituations":"Persisting an enum as int in config and round-tripping it back; assuming Hardware is assignable like Default/SoftwareOnly.","solutions":["Assign only RenderMode.Default or RenderMode.SoftwareOnly to HwndTarget.RenderMode","Validate/sanitize any deserialized int against known RenderMode values before casting","Use RenderMode.Default to let WPF pick hardware when supported"],"exampleFix":"// before\nHwndTarget.RenderMode = (RenderMode)readFromConfig; // may throw\n// after\nvar mode = (RenderMode)readFromConfig;\nHwndTarget.RenderMode = (mode == RenderMode.Default || mode == RenderMode.SoftwareOnly) ? mode : RenderMode.Default;","handlingStrategy":"validation","validationCode":"if (value is not (RenderMode.Default or RenderMode.SoftwareOnly)) value = RenderMode.Default;","typeGuard":"bool IsValidRenderMode(RenderMode m) => m is RenderMode.Default or RenderMode.SoftwareOnly;","tryCatchPattern":"try { HwndTarget.RenderMode = mode; } catch (InvalidEnumArgumentException) { HwndTarget.RenderMode = RenderMode.Default; }","preventionTips":["Sanitize enums deserialized from config/JSON against defined values","Never cast raw ints to RenderMode without validation","Only use Default/SoftwareOnly with this property"],"tags":["wpf","rendering","enum","argument"],"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-22T01:17:13.364Z"}