ModernFormsNext 1.9.0
ModernFormsNext 1.9.0 release notes
ModernFormsNext 1.9.0 is a coordinated framework, Designer, template, and Visual Studio extension
release. Windows remains the primary supported runtime. Android remains an experimental shared-
control backend and is not presented as feature-equivalent to Windows.
This stable release is tagged as v1.9.0. Its NuGet packages and symbols are published through the
tag-triggered release workflow after the coordinated release branch passes all publication gates.
Highlights
- A single observable
Brushmodel now covers solid color, linear, radial, and sweep gradients,
opacity, transforms, spread modes, observable stops, dynamic resources, Designer serialization,
and a centralized Skia brush factory. - The shared UI animation scheduler provides monotonic, idle-aware UI-thread animation with
cancellation, pause/resume, owner/key replacement, reduced-motion policy, typed interpolation,
lifecycle integration, and repaint batching. ThemeManageradds typed and inheritable themes, strict versioned JSON, atomic apply/rollback,
dedicated dynamic theme resources, Light/Dark definitions, optional animated transitions,
latest-request-wins cancellation, and full-tree visual refresh after a commit.- Composable animation definitions add sequences, parallel groups, timelines, keyframes, repeat,
auto-reverse, custom definitions, visual-state transitions, and target-local opt-in ripple and
press-scale effects. - Editor pointer handling and Designer child ordering were hardened so animation opt-in does not
alter standard input and Designer preview, generated code, reverse sync, and runtime share one
Z-order contract. - Dependency cleanup removes the vulnerable MessagePack 2.5.192 path, uses narrow Visual Studio SDK
references, updates MessagePack and Android HarfBuzzSharp, and restores warning-free builds.
New APIs
Paint and gradients
Brush.Opacity,Brush.Transform, and observableBrush.Changednotifications;SolidColorBrush,LinearGradientBrush,RadialGradientBrush, andSweepGradientBrush;GradientStop,GradientStopCollection, andGradientSpreadMode;- shared Brush-to-Skia conversion used by controls, dynamic resources, themes, and the Designer.
Animation
AnimationScheduler,AnimationHandle,AnimationOptions,AnimationPolicy, and diagnostics;AnimationDefinition,AnimationRun,AnimationContext, andPropertyAnimation<T>;Animation.Sequence,Animation.Parallel, scheduler-backed delay, andAnimationTimeline;KeyframeAnimation<T>, finite and infinite repeat, auto-reverse, and custom interpolators;- style transitions for Normal, Hover, Pressed, Focused, and Disabled states;
- explicit
InteractionEffectswithRippleEffectandPressScaleEffect.
Existing FadeToAsync, TranslateToAsync, ScaleToAsync, and RotateToAsync helpers remain
available as compatibility adapters over the shared scheduler.
Themes
ThemeManager.Current,ThemeDefinition,ThemeResolvedSnapshot, and typedThemeTokens;ThemeApplyOptions,ThemeTransitionOptions, apply results, transition handles, events, and
diagnostics;ThemeJsonSerializerwith a strict versioned allow-list and security limits;BuiltInThemes.LightandBuiltInThemes.Darkplus the compatible staticThemefacade;Application.ThemeResourcesas a dedicated fallback below application resources.
Designer
- Brush and gradient values round-trip through
.mfdesignand generated C#. - The interaction-effect collection editor supports ordered built-in ripple and press-scale
descriptions without starting runtime animation services in Designer mode. .mfdesignchild arrays have an explicit ordering meaning. Ordinary containers store front-to-
back Z-order, while flow, table, and tab containers preserve authored layout sequence.- Code generation maps ordinary containers to runtime
Controls.Addorder explicitly. Preview,
save/reload, generation, reverse sync, document-outline moves,BringToFront, andSendToBack
therefore agree for docked, overlapping, mixed, and nested controls. - Docked control bounds contribute the relevant thickness; layout computes their position.
Custom animation definitions, custom interaction-effect types, and custom easing remain code-first.
The built-in effect editor does not introduce a general Designer transaction/undo stack.
Windows
- Windows supplies the primary application/window lifecycle and UI dispatcher used by animations
and theme commits. - Native application animation preferences participate in reduced-motion decisions without a
repaint loop. - Theme changes refresh all open framework windows and their active visual states in one controlled
invalidation batch per commit or animation tick. Visual-only frames do not request layout. - The coordinated Visual Studio extension version is 1.9.0 and retains the existing extension ID,
publisher, supported Visual Studio targets, and amd64 architecture.
Experimental Android
- The shared animation, Brush, theme, dynamic-resource, and control-tree code builds for Android.
- The Android lifecycle excludes background time from scheduler progress and refreshes platform
animation-scale settings when the application returns to the foreground. - Theme System mode uses the configured Light/Dark fallback because a complete Android system-theme
provider is not registered. - Android may refresh settings on foreground entry instead of using a live
ContentObserver. - Runtime behavior, frame pacing, transitions, touch, IME, and lifecycle still require an emulator
or physical-device check; a successful build/APK validation is not runtime parity.
Breaking changes and compatibility
No intentional public type removal, package rename, namespace move, target-framework removal, or
VSIX identity change is included.
GradientBrush.GradientStopsnow exposesGradientStopCollectionrather thanList<GradientStop>.
Common collection initializers and operations remain source-compatible, but compiled consumers
and code requiring the concreteList<T>type must rebuild and accept the new collection type or
an interface such asIList<GradientStop>.- Theme transitions and interaction effects are opt-in. A plain Panel or DataGridView no longer
receives an implicit press/ripple presentation merely because it participates in pointer input.
Standard hit testing, focus, capture, caret, selection, and keyboard handling remain unconditional. - Designer-generated
Controls.Addstatements can change order after regeneration so runtime
reproduces the document's declared Z-order. Existing.mfdesignfiles remain readable and need
no schema migration. - Theme JSON is intentionally strict. Unknown fields or unsupported polymorphic values that a
custom loader previously ignored are rejected with diagnostics.
See Migration from 1.8.0 to 1.9.0 for examples and action items.
Migration from 1.8.0
Most applications can update package and VSIX references, rebuild, and continue using existing
controls and animation helpers. Review code that assumes GradientStops is exactly a List<T>,
code that expected implicit pressed visuals on generic controls, custom theme loaders, and checked-
in generated Designer files. Prefer ThemeManager and dynamic theme-resource references for new
theme-aware code; enable transitions and interaction effects explicitly.
Known limitations
- There is no general animated-layout subsystem (#25).
- Layout-affecting visual-state metrics switch discretely instead of interpolating per frame
(#26). - Brush interpolation requires compatible brush types and compatible gradient-stop structures
(#27);
incompatible values switch discretely. - Designer support for interaction effects is limited to the built-in
RippleEffectand
PressScaleEffect; custom definitions remain code-first
(#28). - There is no general Designer undo/redo transaction stack for effect-collection editing.
- Android remains experimental, uses fallback behavior for system themes, and may refresh animation
settings only on foreground entry (#29). - Shapes (#11) and AppShell/navigation
(#12) are not part of 1.9.0.
Validation
The release was gated by a forced no-cache restore; warning-free Debug and Release solution
builds; the complete Debug and Release test suites; NuGet vulnerability and dependency audits;
individual build checks for Windows, Android, Designer, extension, VSIX, ControlGallery, DemoApp,
and Designer Playground; ZIP inspection of every NuGet/symbol package; VSIX archive validation; and
Windows startup smoke tests. Device-only and interactive checks are reported separately rather than
being inferred from deterministic tests.
Package contents
The release produces eight NuGet packages and seven matching symbol packages. The template package
contains source content and intentionally has no .snupkg.
| Package | Framework/content | Symbols |
|---|---|---|
ModernFormsNext |
net10.0, net10.0-windows |
yes |
ModernFormsNext.WindowKit |
net10.0 |
yes |
ModernFormsNext.WindowKit.Backend |
net10.0 |
yes |
ModernFormsNext.WindowKit.Backend.Windows |
net10.0 |
yes |
ModernFormsNext.Designing |
net10.0 |
yes |
ModernFormsNext.CodeGeneration |
net10.0 |
yes |
ModernFormsNext.Designer |
net10.0-windows |
yes |
ModernFormsNext.Templates |
dotnet new template content |
no |
Each library package contains its DLL and XML documentation plus repository metadata, README, icon,
and Source Link-enabled symbols. Package validation rejects generated build/IDE state, APK/VSIX
artifacts, temporary files, absolute local paths, stale release metadata, and mismatched symbols.