Repository navigation
Releases
Releases · atc-net/atc-wpf
v4.4.0
4.4.0 (2026-11-04)
New features
- components: add DialogService.ShowFontPicker (a727e3c)
- components: wrap long dialog text and size dialogs to their content (8310357)
- dialogs: add ExceptionDialog and ExceptionReport for unhandled exceptions (5b34e69)
- dialogs: share one button bar and add Yes/No/Cancel, default button, details, don't ask again and copy (08b4424)
- sample: add an Exception dialog sample (a77b1f1)
Bug fixes
- components: give each dialog its own copy of the settings icon (f8454f8)
- components: size the input form dialog height to its content (f705f1a)
- controls: show SplitButton and Timeline text in the theme color (68554f1)
- dialogs: keep grown dialogs inside the work area (7cb0dcc)
- forms: own, centre and fit the colour and font picker dialogs (b5284c6)
- forms: read dialog button brushes from the current theme (d4622c1)
- forms: wrap long form labels and validation texts; size the input dialog to its content (94effa7)
v4.3.0
4.3.0 (2026-11-01)
New features
- components: add check-box style, one-way mode, locked items, limit, grouping and virtualization to DualListSelector (dac0446)
- components: add SelectedKeys, SelectedKeysChanged and MaxSelectionCount to DualListSelector (c490cde)
- controls: add a single-select mode to CascaderComboBox (331bc9f)
- controls: add CardSelector card/tile picker with single, single-or-none and multiple selection (cad1e8e)
- controls: add CascaderComboBox multi-select drop-down with one column per level (ee1ea26)
- controls: add CheckListBox with select all, filter, groups and item styles (b421dc0)
- controls: add CheckTreeView with tri-state check engine, check strategies, filter and lazy loading (8a723a2)
- controls: add ChipGroup with selection modes, All chip, counts and a selection limit (7742ade)
- controls: add chips and count display modes, deferred commit and selection-limit tests to MultiSelectComboBox (3e15355)
- controls: add DockPanelPro LayoutChanged and make AutoSaveLayout work (d01a330)
- controls: add Excel-style column filters, search and column chooser to DataGrid (4555f25)
- controls: add MultiColumnComboBox multi-select drop-down with a sortable check-box grid (c087da9)
- controls: add multiple and single-or-none selection, vertical layout, separate pills, icon-only and sizes to Segmented (b6ce805)
- controls: add MultiSelectComboBox (4ecf1bf)
- controls: add tabbed pane groups and floating tool windows to DockPanelPro (f6fd5f8)
- controls: add TokenBox with suggestions, created values, paste splitting and async lookup (1fedcd4)
- controls: add TreeSelectComboBox with text, chips and count summaries (80408a2)
- controls: dock a floating DockPanelPro pane by dragging it onto a guide (82e263e)
- controls: open a Popover from the keyboard and on focus, and close it when unloaded (4feea85)
- controls: persist tab groups and floating panes in the DockPanelPro layout (d2ed464)
- controls: resize DockPanelPro splitters with the keyboard (c89f9a0)
- controls: save and restore DataGrid column layout and filters (39b68bd)
- core: drag the whole selection and auto-scroll drop targets at their edges (d3a200d)
- core: report SvgImage load failures through an ImageFailed event instead of throwing (aefdb7b)
- forms: add LabelCascaderComboBox with mandatory and limit validation (a568746)
- forms: add LabelCheckListBox (eae6ccf)
- forms: add LabelChipGroup (523961a)
- forms: add LabelMultiColumnComboBox with mandatory and limit validation (c20ae3e)
- forms: add LabelMultiSelectComboBox (18a4711)
- forms: add LabelTokenBox (3950b26)
- forms: add LabelTreeSelectComboBox (52cc5d8)
- forms: generate multi-select fields for [Flags] enum and collection properties (d50a627)
- forms: pass display mode, chips and commit mode through LabelMultiSelectComboBox and validate the selection limit (416d450)
- network: send VNC keys from the typed character for any keyboard layout (4fa6c0b)
- sample: add DataGridFilter sample with 5,000 and 100,000 row grids (426fc26)
Bug fixes
- animation: complete the *Async helpers when superseded, and add cancellation (4cb833c)
- behaviors: scroll the auto-scroll list view once per frame (ee8ae2a)
- components: bound the TerminalViewer and ApplicationMonitor backlog and clear it safely (02d7ba6)
- components: close InfoDialogBox on Escape and own DialogService dialogs by the active window (f3f2cdf)
- components: drop a busy session's Cancel button when it ends while the region stays busy (dca44ef)
- components: give DualListSelector its own collection views (61e135b)
- components: keep ApplicationMonitor view model settings and scroll only its own view (7f05919)
- components: keep JsonViewer value text from getting a negative width (2ece308)
- components: lay out a previewed print job again for the printer chosen after the preview (4b0635c)
- components: let BusyIndicatorService.RunAsync rethrow cancellations it did not cause (391136e)
- components: let DualListSelector release its collection views when unloaded (2180dfa)
- components: make ToastNotification.CloseOnClick close the toast and pause expiry on hover (57c2334)
- components: raise Flyout Closing once on light dismiss and keep a cancelled close from reopening (58ddd77)
- components: stop assuming a main window when printing and opening dialogs (c73ccd6)
- components: stop DualListSelector rows from logging binding errors (54e4601)
- components: track service-added flyouts in FlyoutHost and release cancellation registrations (f790865)
- components: update the JsonViewer key colour on a theme change (2077a18)
- controls: align Escape and the pop-up width across the multi-select drop-downs (b8f4dfa)
- controls: clean the MultiSelectComboBox selection of an open deferred draft after the bindings settle (2b745a2)
- controls: clip the ZoomBox drag-zoom rectangle to the content, not the overlay (7634b97)
- controls: close the MultiSelectComboBox pop-up on outside clicks after ticking ...
v4.2.1
4.2.1 (2026-10-17)
Bug fixes
- components: close only the topmost flyout on Escape (fe49990)
- core: prune collected targets from managed markup extensions (9dafdc9)
- forms: keep invalid picker text and report full date-time on lost focus (2b0469d)
- forms: treat the enum picker placeholder as missing when mandatory (9de5610)
- hardware: apply polling service results on the UI thread (43aee4c)
- hardware: stop live previews without blocking in Dispose (c19e9b8)
- layouts: re-apply GridEx and PanelHelper spacing without overwriting user margins (0dfda3a)
- theming: bind the validation error text to the current error (078f733)
v4.2.0
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 ...
v4.1.0
4.1.0 (2026-10-09)
New features
- components: add TrayIcon notification area icon (fb1f7a9)
- components: address terminal output to a specific TerminalViewer (ca2670f)
- components: render the xterm 256-colour palette in TerminalViewer (d058b80)
- controls: add NavigationView shell bound to INavigationService (78549fa)
- forms: forward UpdateUiCultureOnChangeEvent from LabelCountrySelector (547188b)
- hardware: share picker behaviour and expose service tuning (5187d15)
- hotkeys: report global hotkeys that Windows refuses to register (8cdd071)
- improve NetworkValidationRule and EndpointBox to handle hostname (1336d80)
- sample: add a right-to-left switch to the sample viewer (a9a11a8)
- theming: add Windows 11 backdrops to NiceWindow and keep it intact under ThemeMode (a3260c5)
- theming: follow the Windows app mode and accent color (f04c488)
- theming: follow Windows high contrast (2c8e03b)
- zoom: make ZoomGridOverlay styling bindable and release it on Detach (05be68b)
Bug fixes
- components: animate a flyout the first time it opens (7889a86)
- components: close the oldest toasts when MaxItems is exceeded (6bea803)
- components: keep JSON and terminal content left-to-right in right-to-left layouts (9845157)
- components: let clicks pass through an empty FlyoutHost (38bf8d3)
- components: open print preview and desktop toasts in the app's flow direction (5e65216)
- components: stop CloseAllFlyouts hanging during close animations (0560b7f)
- components: strip private-mode ANSI sequences and truncated colours (ae6277f)
- controls: accept lower-case percent and hex letters in NumericBox (099a07d)
- controls: align UniformSpacingPanel measure with arrange (ba63f0f)
- controls: apply ZoomMiniMap viewport border properties (ac90a34)
- controls: change the UI culture from CountrySelector when enabled (b78526c)
- controls: keep country and language flags unmirrored in right-to-left (2717633)
- controls: keep ZoomBox content unmirrored when it opens in right-to-left (0d5b05a)
- controls: keep ZoomRuler labels readable in right-to-left (6bdd4eb)
- controls: let FilePicker and DirectoryPicker inherit the DataContext (64fac3c)
- controls: measure VirtualizingStaggeredPanel without infinite sizes (7e21264)
- controls: mirror the ZoomMiniMap thumbnail for right-to-left content (b47b2d1)
- controls: raise the number box LostFocus events once per edit (fd3820d)
- controls: re-arrange ReversibleStackPanel when ReverseOrder changes (27a81b7)
- controls: share column layout between StaggeredPanel measure and arrange (8a682ba)
- controls: stop theme-change subscriptions from leaking controls (a3b357a)
- controls: swap arrow keys in right-to-left layouts (1ccbf89)
- dialogs: correct the DialogBoxSettings placeholder texts and docs (5b95315)
- dialogs: follow the owning window's flow direction (e326e4f)
- dialogs: make DialogService cancellation close the open dialog (7c04c15)
- forms: declare the combo box selector events on ILabelComboBoxBase (8ba9f64)
- forms: make LabelSlider.IsValid validate the current value (b5ac102)
- forms: raise EndpointBox LostFocus events when an editor loses focus (aec88c5)
- forms: raise TextChanged from LabelDatePicker and LabelTimePicker (1c2163a)
- forms: report the previous color from ColorPicker.ColorChanged (996ad7a)
- hardware: keep unplugged devices disconnected after the just-connected delay (71fca55)
- hardware: refresh display and network adapter details while connected (4de7a43)
- hardware: refresh polled process, window, drive and printer entries (c9f919c)
- hardware: stop the camera and microphone running after unload (96dcd9b)
- keep the original exception as inner exception in RtfFormatter and ColorPickerAutomationPeer (fff08d4)
- media: keep SVG external file references inside the SVG folder (6b76bc8)
- media: make the AutoGrey extensions work and keep transparency (4b75dfa)
- media: render an SvgImage once when it loads and keep custom brushes (d3c1311)
- network: report a dropped VNC socket as a disconnect instead of crashing (3af02c0)
- notifications: name the toast factory title parameter title (ad6cda9)
- sample: match readme files from a folder boundary in the sample viewer (04c56d2)
- suppress some coding rules and fix code (71f6465)
- theming: keep the DatePicker calendar icon unmirrored in right-to-left (9666f3f)
- translation: notify culture subscribers on their own UI thread (1496ed9)
- translation: skip sealed style setters when updating translated values (2074c09)
- viewers: use the JsonPropertyTemplateSelector template properties (5cb3496)
- zoom: reject non-positive or non-finite grid ...