Skip to content

v2.3.0

Choose a tag to compare

@github-actions github-actions released this 25 Jun 06:58
· 7 commits to master since this release

[2.3.0] - 2026-06-25%0D%0A%0D%0A### Added%0D%0A- Grouped product cards. The license window now renders each product as a card instead%0D%0A of a dropdown, arranged into developer-defined groups (e.g. Monthly / Annual). Configure%0D%0A in code with LicenseViewModel.ApplyGrouping(IEnumerable<ProductGroupDefinition>, ProductLayout),%0D%0A or zero-code via the App.config <ProductGroups> section + licenseLayout app setting.%0D%0A- Three selectable layouts via the new ProductLayout enum — Bands (default, stacked%0D%0A bands), Lanes (side-by-side columns), Switcher (segmented tabs). The developer picks%0D%0A one; the end user cannot change it.%0D%0A- Per-card status, validity meter and actions. Each card shows its own status chip, a%0D%0A validity meter, the relevant expiry/countdown, and the status-appropriate action%0D%0A (Register / Unregister / Download new file). New public types: ProductLayout,%0D%0A ProductGroupDefinition, ProductGroupViewModel.%0D%0A%0D%0A### Changed%0D%0A- Validity meter is now period-accurate. The bar reflects the real window for the%0D%0A status — subscription term (Receipt.Created → Receipt.Expires), trial window%0D%0A (License.Created → TrialEndDate), or issued file validity (License.Updated → Expires),%0D%0A falling back to the publisher's ValidDays only when no period start is known. Previously%0D%0A it used the product's DB-creation date, which was not a meaningful window.%0D%0A- MainWindow is now a thin host of LicenseControl, so the standalone-window and%0D%0A embedded experiences are identical. The public MainWindow.License / LicenseControl.License%0D%0A API and LicenseViewModel.FromContext(...) are unchanged.%0D%0A- Register / Unregister / Error dialogs restyled to match the card UI (bindings,%0D%0A commands and receipt-code validation unchanged).%0D%0A%0D%0A### Fixed%0D%0A- A license check that returns Unknown (e.g. it threw) now shows a distinct "Unverified"%0D%0A card state with a retry, instead of being conflated with the never-checked "Not checked"%0D%0A state — a failed check no longer renders as a blank/unloaded card.%0D%0A%0D%0A### Notes%0D%0A- The cards load each product's status lazily (the first on open, the rest on demand) to%0D%0A avoid a burst of server calls. No core SDK or server change is required for grouping — it%0D%0A is purely a presentation concern over the product ids you already configure.

NuGet Package

Install via NuGet:

Install-Package LicenseManagement.EndUser.Wpf -Version 2.3.0

Or via .NET CLI:

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