dotnet/wpf · error · InvalidEnumArgumentException

value

Error message

value

What it means

RenderOptions.ProcessRenderMode (static) setter only accepts RenderMode.Default or RenderMode.SoftwareOnly; any other RenderMode value throws InvalidEnumArgumentException naming the parameter 'value'. This forces process-wide software rendering; hardware/other enum values are not valid here. Note HardwareOnly/other values are rejected even if they exist in the enum surface.

Solutions

  1. Use only RenderMode.Default or RenderMode.SoftwareOnly for ProcessRenderMode; for per-element control use RenderOptions.SetRenderMode(element, RenderMode.SoftwareOnly)
  2. Validate/clamp config values to the allowed set before assigning
  3. Cast safely: only map known ints (0=Default, 1=SoftwareOnly) into RenderMode
  4. To troubleshoot rendering, prefer disabling hardware acceleration via app config/registry (RenderTier checks) rather than invalid enum values

Example fix

// before
RenderOptions.ProcessRenderMode = RenderMode.HardwareOnly; // throws
// after
RenderOptions.ProcessRenderMode = RenderMode.Default; // allow hardware; use SoftwareOnly to force software
Defensive patterns

Strategy: validation

Validate before calling

bool IsValidProcessRenderMode(RenderMode m) => m == RenderMode.Default || m == RenderMode.SoftwareOnly;
if (!IsValidProcessRenderMode(mode)) mode = RenderMode.Default;

Type guard

bool IsAllowedRenderMode(object v) => v is RenderMode m && (m == RenderMode.Default || m == RenderMode.SoftwareOnly);

Try / catch

try { RenderOptions.ProcessRenderMode = mode; }
catch (InvalidEnumArgumentException ex) { log(ex); RenderOptions.ProcessRenderMode = RenderMode.Default; }

Prevention

When it happens

Trigger: Setting RenderOptions.ProcessRenderMode = RenderMode.HardwareOnly (or casting arbitrary ints into RenderMode) — only Default and SoftwareOnly pass the guard.

Common situations: Developers trying to force hardware rendering process-wide expecting HardwareOnly to work; config-driven code that reads a RenderMode from settings where an unexpected value slips through.

Understand the failure class

Background: Invalid enum value errors: "Unknown type", "Invalid scope", "must be one of" — when a string is not on the library's allowed list — this error's family across 23 libraries.

Related errors


AI-assisted analysis of dotnet/wpf@81131a70a4 (2026-09-14). Data as JSON: /api/errors/cc218eda9df1cec8. Report an issue: GitHub.

Appendix: source

Thrown at src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/Media/RenderOptions.cs:243

        /// <remarks>
        ///     This property specifies a preference, it does not necessarily change the actual
        ///     rendering mode.  Among other things, this can be trumped by the registry settings.
        ///     <para/>
        ///     Callers must have UIPermission(UIPermissionWindow.AllWindows) to set this property.
        /// </remarks>
        public static RenderMode ProcessRenderMode
        {
            get
            {
                return UnsafeNativeMethods.MilCoreApi.RenderOptions_IsSoftwareRenderingForcedForProcess() ?
                    RenderMode.SoftwareOnly : RenderMode.Default;
            }

            set
            {
                if (value != RenderMode.Default && value != RenderMode.SoftwareOnly)
                {
                    throw new System.ComponentModel.InvalidEnumArgumentException("value", (int)value, typeof(RenderMode));
                }
                
                UnsafeNativeMethods.MilCoreApi.RenderOptions_ForceSoftwareRenderingModeForProcess(
                    value == RenderMode.SoftwareOnly
                    );
            }
        }
    }
}

View on GitHub (pinned to 81131a70a4)