{"record":{"id":"a2b6e03d42d9cc99","repo":"dotnet/wpf","slug":"sr-flowdocumentreadercannotdisableallviewingmodes","errorCode":null,"errorMessage":"SR.FlowDocumentReaderCannotDisableAllViewingModes","messagePattern":"SR\\.FlowDocumentReaderCannotDisableAllViewingModes","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Controls/FlowDocumentReader.cs","lineNumber":1648,"sourceCode":"            return (value == FlowDocumentReaderViewingMode.Page ||\n                    value == FlowDocumentReaderViewingMode.TwoPage ||\n                    value == FlowDocumentReaderViewingMode.Scroll);\n        }\n\n        /// <summary>\n        /// One of viewing modes has been enabled/disabled.\n        /// </summary>\n        private static void ViewingModeEnabledChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)\n        {\n            Invariant.Assert(d != null && d is FlowDocumentReader);\n            FlowDocumentReader viewer = (FlowDocumentReader)d;\n\n            // Cannot disable all viewing modes.\n            if (!viewer.IsPageViewEnabled &&\n                !viewer.IsTwoPageViewEnabled &&\n                !viewer.IsScrollViewEnabled)\n            {\n                throw new ArgumentException(SR.FlowDocumentReaderCannotDisableAllViewingModes);\n            }\n\n            // Cannot disable the current viewing mode.\n            if (viewer.IsInitialized && !viewer.CanSwitchToViewingMode(viewer.ViewingMode))\n            {\n                throw new ArgumentException(SR.FlowDocumentReaderViewingModeEnabledConflict);\n            }\n\n            // Fire automation events if automation is active.\n            FlowDocumentReaderAutomationPeer peer = UIElementAutomationPeer.FromElement(viewer) as FlowDocumentReaderAutomationPeer;\n            peer?.RaiseSupportedViewsChangedEvent(e);\n        }\n\n        /// <summary>\n        /// IsFindEnabled value has changed.\n        /// </summary>\n        private static void IsFindEnabledChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)\n        {","sourceCodeStart":1630,"sourceCodeEnd":1666,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Controls/FlowDocumentReader.cs#L1630-L1666","documentation":"FlowDocumentReader throws this ArgumentException from the IsPageViewEnabled / IsTwoPageViewEnabled / IsScrollViewEnabled property change callbacks when a setter would disable the last remaining enabled viewing mode. At least one viewing mode must always be available, otherwise the reader could not render its document at all.","triggerScenarios":"Setting IsPageViewEnabled = false, IsTwoPageViewEnabled = false and IsScrollViewEnabled = false (in any order) so that no viewing mode remains enabled.","commonSituations":"Sequentially disabling views based on config flags where all three evaluate to false; copying an 'enabled views' settings object with all flags off; data binding all three properties to values parsed from an all-zero value.","solutions":["Ensure at least one of IsPageViewEnabled, IsTwoPageViewEnabled, IsScrollViewEnabled stays true when changing them.","Compute the flags together and leave the currently-used mode enabled, then apply them in an order that never disables the last one.","Validate user/config input so an all-false view configuration is rejected before it reaches the reader."],"exampleFix":"// before\nreader.IsPageViewEnabled = false;\nreader.IsTwoPageViewEnabled = false;\nreader.IsScrollViewEnabled = false; // throws\n\n// after\nvar enabled = new[] { false, false, true }; // at least one true\nreader.IsPageViewEnabled = enabled[0];\nreader.IsTwoPageViewEnabled = enabled[1];\nreader.IsScrollViewEnabled = enabled[2];","handlingStrategy":"validation","validationCode":"if (!allowPage && !allowTwoPage && !allowScroll)\n    throw new InvalidOperationException(\"At least one viewing mode must remain enabled.\");\nreader.IsPageViewEnabled = allowPage;\nreader.IsTwoPageViewEnabled = allowTwoPage;\nreader.IsScrollViewEnabled = allowScroll;","typeGuard":null,"tryCatchPattern":"try { ApplyViewFlags(reader, flags); }\ncatch (ArgumentException ex) { logger.Warn(ex); ApplyViewFlags(reader, (true, false, false)); }","preventionTips":["Treat the three Is*ViewEnabled flags as a set: validate that at least one is true before applying.","Reject all-false view configurations at config parsing time."],"tags":["wpf","flowdocumentreader","viewing-mode","conflicting-config-options"],"backgroundTag":"conflicting-config-options","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"}