Skip to content

ModernFormsNext 1.9.0

Choose a tag to compare

@github-actions github-actions released this 02 Aug 15:05
· 186 commits to master since this release
2f55a08

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 Brush model 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.
  • ThemeManager adds 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 observable Brush.Changed notifications;
  • SolidColorBrush, LinearGradientBrush, RadialGradientBrush, and SweepGradientBrush;
  • GradientStop, GradientStopCollection, and GradientSpreadMode;
  • shared Brush-to-Skia conversion used by controls, dynamic resources, themes, and the Designer.

Animation

  • AnimationScheduler, AnimationHandle, AnimationOptions, AnimationPolicy, and diagnostics;
  • AnimationDefinition, AnimationRun, AnimationContext, and PropertyAnimation<T>;
  • Animation.Sequence, Animation.Parallel, scheduler-backed delay, and AnimationTimeline;
  • KeyframeAnimation<T>, finite and infinite repeat, auto-reverse, and custom interpolators;
  • style transitions for Normal, Hover, Pressed, Focused, and Disabled states;
  • explicit InteractionEffects with RippleEffect and PressScaleEffect.

Existing FadeToAsync, TranslateToAsync, ScaleToAsync, and RotateToAsync helpers remain
available as compatibility adapters over the shared scheduler.

Themes

  • ThemeManager.Current, ThemeDefinition, ThemeResolvedSnapshot, and typed ThemeTokens;
  • ThemeApplyOptions, ThemeTransitionOptions, apply results, transition handles, events, and
    diagnostics;
  • ThemeJsonSerializer with a strict versioned allow-list and security limits;
  • BuiltInThemes.Light and BuiltInThemes.Dark plus the compatible static Theme facade;
  • Application.ThemeResources as a dedicated fallback below application resources.

Designer

  • Brush and gradient values round-trip through .mfdesign and generated C#.
  • The interaction-effect collection editor supports ordered built-in ripple and press-scale
    descriptions without starting runtime animation services in Designer mode.
  • .mfdesign child 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.Add order explicitly. Preview,
    save/reload, generation, reverse sync, document-outline moves, BringToFront, and SendToBack
    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.GradientStops now exposes GradientStopCollection rather than List<GradientStop>.
    Common collection initializers and operations remain source-compatible, but compiled consumers
    and code requiring the concrete List<T> type must rebuild and accept the new collection type or
    an interface such as IList<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.Add statements can change order after regeneration so runtime
    reproduces the document's declared Z-order. Existing .mfdesign files 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 RippleEffect and
    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.