Skip to content

v2.3.4

Choose a tag to compare

@github-actions github-actions released this 26 Jun 06:32
· 6 commits to master since this release

[2.3.4] - 2026-06-26%0D%0A%0D%0AFirst public release since 2.3.0 — fixes the empty-window regression and several UI issues%0D%0Afrom the grouped-cards redesign.%0D%0A%0D%0A### Fixed%0D%0A- MainWindow rendered empty when License was assigned in code. The window hosted%0D%0A LicenseControl with a bare License='{Binding}', which resolved against the control's%0D%0A own self-bound DataContext (stuck at the LicenseConfigurationLoader.TryLoad() default),%0D%0A so a window.License set in code never reached the control. It now binds directly to the%0D%0A window's License. (The sample app was unaffected because it populates products via the%0D%0A default value / App.config rather than assigning License.)%0D%0A- Cards no longer sit at a fixed 332px with dead space on the right. The Bands and%0D%0A Switcher layouts lay cards out in a stretch-to-fill grid and the content cap was widened, so%0D%0A cards grow with the window.%0D%0A- Buttons were inert — added real hover and pressed states to the primary, ghost and link%0D%0A button styles (previously only a faint hover and no pressed feedback).%0D%0A- Window could freeze briefly on open. Reading a licence runs on the UI thread and, for%0D%0A non-valid states, reaches the licence server; reading every card synchronously on open left%0D%0A the window painted but unresponsive for a beat (see the async-loading change below).%0D%0A- Validity meter could read ~0%25 with weeks left. A default(DateTime) period-start date%0D%0A from the model was used as a real window start, making the window span ~2000 years. Such%0D%0A dates are now treated as unknown, falling back to the publisher's ValidDays.%0D%0A%0D%0A### Changed%0D%0A- Cards load asynchronously with a per-card spinner. Each not-yet-loaded card is read in%0D%0A the background (off the UI thread, one at a time so reads never race on the licence file)%0D%0A while showing a "Checking license…" spinner, so the window paints immediately. The per-card%0D%0A Check / Refresh action and the post-Register / post-Unregister refresh use the same path. A%0D%0A host that has already validated its products can seed the cards directly via%0D%0A ProductViewModel.UpdateLicenseSnapshot(model, validDays) so they appear instantly.%0D%0A- Clearer per-status labels. Unknown → "Couldn't verify", Expired → "File%0D%0A Expired", ReceiptExpired → "Subscription Ended", ReceiptUnregistered → "Computer%0D%0A Unregistered" (with the matching meta line).%0D%0A%0D%0A### Added%0D%0A- ProductViewModel.IsLoading and LicenseViewModel.LoadAllProducts(...) /%0D%0A RefreshProduct(...) for the async, spinner-driven loading; an LmSpinner style.

NuGet Package

Install via NuGet:

Install-Package LicenseManagement.EndUser.Wpf -Version 2.3.4

Or via .NET CLI:

dotnet add package LicenseManagement.EndUser.Wpf --version 2.3.4