Skip to content

v4.2.0

Choose a tag to compare

@ATCBot ATCBot released this 16 Oct 22:35

4.2.0 (2026-10-16)

New features

  • sample: make the readme markdown readable in the dark theme (dce6391)

Bug fixes

  • components: correct a hang, a drop index, highlight, trim and dispose defects (670850a)
  • components: keep the DualListSelector footer counts in sync with the collections (b297e63)
  • controls: arrange StaggeredPanel in the measured column count and clamp panel sizes (06c0583)
  • controls: attach the NumericBox text handlers only once (3a37123)
  • controls: clip AutoGrid spans at the last row and column (3cabedf)
  • controls: correct ZoomBox content changes, fit animation and MakeVisible (0e81540)
  • controls: hide ToggleSwitch header and content presenters for empty strings (f58f15a)
  • controls: keep a custom BusyOverlay text when the UI culture changes (f5fd40a)
  • controls: keep ZoomGridOverlay major lines on fixed content positions (d0d7401)
  • controls: make GridLines safe for non-positive steps and without a main window (b561c69)
  • controls: make the Row panel measure robust (eb1b43b)
  • controls: realize the contiguous index range in VirtualizingStaggeredPanel (1d7ae86)
  • controls: restore only docking dimensions in DockPanelPro.LoadLayout (95df764)
  • controls: stop ZoomMiniMap stacking size handlers and throwing on clicks (549ab13)
  • core: add a Color overload of HsvColorUtil.ConvertRgbToHsv (87d940c)
  • core: compose SVG transform lists in SVG order (9e61b4d)
  • core: deny unsafe drops and reorder observable collections with Move (52486a0)
  • core: detect double-clicks per button from ClickCount (7f8bea1)
  • core: do not rebuild the previous UI culture from its LCID (8a512e6)
  • core: forget the pending drag start when a drag handler cancels (ab3376c)
  • core: give the last panel child the LastItemMargin instead of the item margin (ebc6351)
  • core: hook up TextBoxHelper monitoring when the element is loaded (3fda461)
  • core: include the orientation in PanelUvSize equality (bc9f113)
  • core: iterate a snapshot of the active markup extensions when updating targets (e2f6067)
  • core: keep a pending hotkey chord when a bare modifier key is pressed (fc22f95)
  • core: keep async navigation on the calling thread (f602621)
  • core: keep the alpha channel when inverting bitmap colors (0b21501)
  • core: keep the BoundPassword binding alive and always hook PasswordChanged (fb9f4e7)
  • core: let a ResxExtension.Resource handler supply the resource value (7f3954a)
  • core: make EnumToArrayBindingSource work for nullable enum types (751fcb6)
  • core: marshal clipboard calls to the dispatcher and record history once (8a570bb)
  • core: mirror TextBlockHelper.Inlines changes by index and detach old collections (877dea7)
  • core: monitor text changes on TextBox, RichTextBox and ComboBox (6938194)
  • core: parse GridEx row and column lengths independent of the culture (91104e4)
  • core: parse the BoolToWidth converter parameter independently of the culture (9d1b5d7)
  • core: push the default ToColor to the fade shader (355f7a2)
  • core: raise one indexed collection notification per change in the observable collections (f5b953e)
  • core: render JSON nulls, return plain text and freeze the JSON brushes (9b27cb6)
  • core: return null from ColorHelper.GetColorFromString for unknown color names (dfab0a6)
  • core: return the converted entries for Guid-keyed observable dictionaries (41e1aaf)
  • core: round instead of truncate when converting HSV to RGB (52498e2)
  • core: stop AnimateAttach from leaking elements and stacking handlers (3c26c1b)
  • core: update markup extension targets on the thread that owns them (43bbedf)
  • dialogs: own the dialog boxes by the window that opens them (abfe6e2)
  • fonticons: accept the converter parameter as a string for brush and em-size (9c4f26d)
  • forms: accept tcp and udp endpoints and require a mandatory endpoint host (852eac2)
  • forms: add IsValid to the date and time pickers (e1e5bcc)
  • forms: convert decimal control data values instead of unboxing them as int (c247d02)
  • forms: do not raise LostFocusValid from the picker IsValid calls (7fa9788)
  • forms: format the selected date with the picker culture (bddd476)
  • forms: make IsValid on the decimal and currency boxes validate the current value (5115d01)
  • forms: raise IsOnChanged with the old and new values in the right order (9e0f885)
  • forms: read Range attribute bounds safely and keep the pixel size box limits (b92be6b)
  • forms: report the edited text in the LabelTextBox lost-focus events (38d52b0)
  • forms: skip collections and cap nesting depth in ModelToLabelControlExtractor (be6c432)
  • hardware: apply RefreshAsync results on the UI thread (477b7a9)
  • hardware: raise DeviceLost and rebind on in-place state changes (b86ff95)
  • hardware: report the real Bluetooth connection state (02a5ae7)
  • network: keep the scanner and VNC viewer usable after failures (c40330c)
  • notifications: own and close the desktop toast overlay with the application (4a199a3)
  • notifications: register toast areas while loaded and stop sharing one content instance (6b87c0b)
  • printing: stop swapping the printable area a second time for landscape (978220b)
  • sample: add a Close button to the borderless NiceWindow sample (d05221a)
  • sample: judge markdown code-block colours by the editor background (daed088)
  • sample: show the readme tab when requested and clear it with the sample (ac14999)
  • svg: accept comma and whitespace separated viewBox values (78ec2b5)
  • svg: apply clearing OverrideStrokeWidth on SvgImage (94d8981)
  • svg: build clip rectangles from x/y and tolerate empty clip paths and poly shapes (ad379f1)
  • svg: default a gradient stop without a readable stop-color to black (d987689)
  • svg: ignore an unreadable animation duration instead of throwing (a68bec4)
  • svg: keep the radial gradient focal point unscaled (81109f6)
  • svg: render rgb() and rgba() colours and apply fill-opacity per shape (6c19345)
  • svg: stop a use element that points at itself or an ancestor from recursing forever (b3b1a25)
  • theming: centre the NiceWindow title between the window commands (8fec072)
  • theming: define the resource keys used by the Calendar and DataGrid styles (2ccf234)
  • theming: move the saved window rectangle into work-area coordinates (4052fbb)
  • theming: resolve the parent window of WindowButtonCommands when it is loaded (f4183d1)
  • theming: return the documented fallbacks when no theme is detected (e414fb8)
  • theming: skip a saved window placement that is off every screen (f4a0971)
  • theming: stop NiceWindow from resetting the process culture on render (50b12ff)
  • theming: upgrade the window placement settings after a version change (1b9b436)
  • viewers: keep ANSI escape codes out of TerminalViewer line text (41fb697)