{"record":{"id":"9623010af19391ab","repo":"dotnet/wpf","slug":"sr-format-sr-unsupported-modifier-modifier-tostring","errorCode":null,"errorMessage":"SR.Format(SR.Unsupported_Modifier, modifier.ToString())","messagePattern":"SR\\.Format\\(SR\\.Unsupported_Modifier, modifier\\.ToString\\(\\)\\)","errorType":"exception","errorClass":"NotSupportedException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Windows/Input/ModifierKeysConverter.cs","lineNumber":83,"sourceCode":"            ModifierKeys modifiers = ModifierKeys.None;\n            foreach (Range token in modifiersToken.Split('+'))\n            {\n                ReadOnlySpan<char> modifier = modifiersToken[token].Trim();\n\n                // This would be a case where we have a token like \"Ctrl + \" for example,\n                // which itself is invalid but we choose to support this malformed behaviour.\n                if (modifier.IsEmpty)\n                    break;\n\n                modifiers |= modifier switch\n                {\n                    _ when modifier.Equals(\"Ctrl\", StringComparison.OrdinalIgnoreCase) => ModifierKeys.Control,\n                    _ when modifier.Equals(\"Control\", StringComparison.OrdinalIgnoreCase) => ModifierKeys.Control,\n                    _ when modifier.Equals(\"Win\", StringComparison.OrdinalIgnoreCase) => ModifierKeys.Windows,\n                    _ when modifier.Equals(\"Windows\", StringComparison.OrdinalIgnoreCase) => ModifierKeys.Windows,\n                    _ when modifier.Equals(\"Alt\", StringComparison.OrdinalIgnoreCase) => ModifierKeys.Alt,\n                    _ when modifier.Equals(\"Shift\", StringComparison.OrdinalIgnoreCase) => ModifierKeys.Shift,\n                    _ => throw new NotSupportedException(SR.Format(SR.Unsupported_Modifier, modifier.ToString()))\n                };\n            }\n\n            return modifiers;\n        }\n\n        /// <summary>\n        /// Converts a <paramref name=\"value\"/> of <see cref=\"ModifierKeys\"/> to its <see langword=\"string\"/> represensation.\n        /// </summary>\n        /// <param name=\"context\">Serialization Context</param>\n        /// <param name=\"culture\">Culture Info</param>\n        /// <param name=\"value\">ModifierKeys value</param>\n        /// <param name=\"destinationType\">Type to Convert</param>\n        /// <returns>A <see langword=\"string\"/> representing the <see cref=\"ModifierKeys\"/> specified by <paramref name=\"value\"/>.</returns>\n        public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)\n        {\n            ArgumentNullException.ThrowIfNull(destinationType);\n","sourceCodeStart":65,"sourceCodeEnd":101,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Windows/Input/ModifierKeysConverter.cs#L65-L101","documentation":"ModifierKeysConverter.ConvertFrom parses modifier-key tokens into a ModifierKeys value. Recognized tokens are Ctrl/Control, Win/Windows, Alt, and Shift (case-insensitive); any other token reaches the switch discard arm and throws NotSupportedException with Unsupported_Modifier naming the offending token.","triggerScenarios":"Calling ConvertFrom/ConvertFromString with a gesture or settings string containing an unrecognized modifier such as 'Meta', 'Cmd', 'Super', or a misspelling like 'Shft', typically from '+'-separated gesture strings.","commonSituations":"Porting shortcuts from macOS/other frameworks ('Cmd+X'), user-edited hotkey configs, localization of key names, or migrating keybinding settings across platforms.","solutions":["Use supported tokens only: Ctrl, Control, Win, Windows, Alt, Shift","Normalize aliases before conversion (map 'Meta'/'Cmd' to 'Control' or 'Windows')","Pre-validate each '+'-separated token against the supported list and report a friendly error","Use ModifierKeysConverter.ConvertToString output as the canonical round-trip format"],"exampleFix":"// before\nvar mk = (ModifierKeys)new ModifierKeysConverter().ConvertFromString(\"Cmd\"); // throws\n// after\nstring token = \"Cmd\";\ntoken = token.Equals(\"Cmd\", StringComparison.OrdinalIgnoreCase) ? \"Control\" : token;\nvar mk = (ModifierKeys)new ModifierKeysConverter().ConvertFromString(token);","handlingStrategy":"validation","validationCode":"string[] supported = { \"Ctrl\",\"Control\",\"Win\",\"Windows\",\"Alt\",\"Shift\" };\nbool ok = supported.Contains(token, StringComparer.OrdinalIgnoreCase);\nif (!ok) throw new FormatException($\"Unsupported modifier: {token}\");","typeGuard":"static bool IsSupportedModifier(string s) => s is \"Ctrl\" or \"Control\" or \"Win\" or \"Windows\" or \"Alt\" or \"Shift\" ||\n    new[]{\"ctrl\",\"control\",\"win\",\"windows\",\"alt\",\"shift\"}.Contains(s.ToLowerInvariant());","tryCatchPattern":"try { var mk = (ModifierKeys)new ModifierKeysConverter().ConvertFromString(token); }\ncatch (NotSupportedException ex) { log.Error($\"Unsupported modifier token: {ex.Message}\"); }","preventionTips":["Normalize platform aliases (Cmd/Meta -> Control/Windows) before conversion","Only accept the six documented tokens in hotkey settings","Validate each '+'-separated gesture token before invoking the converter"],"tags":["wpf","type-converter","keyboard","parsing"],"backgroundTag":"invalid-argument-format","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"}