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
- Use only RenderMode.Default or RenderMode.SoftwareOnly for ProcessRenderMode; for per-element control use RenderOptions.SetRenderMode(element, RenderMode.SoftwareOnly)
- Validate/clamp config values to the allowed set before assigning
- Cast safely: only map known ints (0=Default, 1=SoftwareOnly) into RenderMode
- 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
- Never assign RenderMode values other than Default/SoftwareOnly to ProcessRenderMode
- Validate config-driven RenderMode values against the allowed set
- Use per-element RenderOptions.SetRenderMode for targeted software rendering
- Cast ints to RenderMode only from known constants
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
- value
- category
- InvalidEnumArgumentException: routingStrategy
- InvalidEnumArgumentException("value", (int) value…
- InvalidEnumArgumentException("value", (int) value…
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)