{"id":13540135,"url":"https://github.com/jbe2277/waf","last_synced_at":"2025-05-14T06:12:10.615Z","repository":{"id":36863635,"uuid":"41170597","full_name":"jbe2277/waf","owner":"jbe2277","description":"Win Application Framework (WAF) is a lightweight Framework that helps you to create well structured XAML Applications.","archived":false,"fork":false,"pushed_at":"2025-05-03T09:30:24.000Z","size":8543,"stargazers_count":723,"open_issues_count":5,"forks_count":131,"subscribers_count":65,"default_branch":"master","last_synced_at":"2025-05-03T10:27:22.570Z","etag":null,"topics":["android","architectural-patterns","csharp","dotnet","flaui","framework","ios","maui","mvvm","uwp","waf","winui","wpf","xamarin"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jbe2277.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2015-08-21T18:17:11.000Z","updated_at":"2025-05-03T09:30:27.000Z","dependencies_parsed_at":"2023-12-03T09:45:13.512Z","dependency_job_id":"f4e7be2d-19a5-43e1-85be-54b4aff806ef","html_url":"https://github.com/jbe2277/waf","commit_stats":{"total_commits":1242,"total_committers":2,"mean_commits":621.0,"dds":"0.023349436392914646","last_synced_commit":"83f2455140d812607b12501aaa483593116727e3"},"previous_names":[],"tags_count":47,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jbe2277%2Fwaf","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jbe2277%2Fwaf/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jbe2277%2Fwaf/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jbe2277%2Fwaf/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jbe2277","download_url":"https://codeload.github.com/jbe2277/waf/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254080269,"owners_count":22011359,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","architectural-patterns","csharp","dotnet","flaui","framework","ios","maui","mvvm","uwp","waf","winui","wpf","xamarin"],"created_at":"2024-08-01T09:01:41.154Z","updated_at":"2025-05-14T06:12:10.559Z","avatar_url":"https://github.com/jbe2277.png","language":"C#","funding_links":[],"categories":["\u003ca id=\"946d766c6a0fb23b480ff59d4029ec71\"\u003e\u003c/a\u003e防护\u0026\u0026Defense","MVVM","\u003ca id=\"0abd611fc3e9a4d9744865ca6e47a6b2\"\u003e\u003c/a\u003e工具","Audio"],"sub_categories":["\u003ca id=\"784ea32a3f4edde1cd424b58b17e7269\"\u003e\u003c/a\u003eWAF","GUI - other"],"readme":"# Win Application Framework (WAF)\n#### Successor of the WPF Application Framework\n\nThe Win Application Framework (WAF) is a lightweight Framework that helps you to create well-structured XAML Applications (MAUI, Xamarin, WPF, WinUI). It supports you in applying various architectural patterns:\n- [Layered Architecture](https://github.com/jbe2277/waf/wiki/Layered-Architecture)\n- [Model-View-ViewModel Pattern](https://github.com/jbe2277/waf/wiki/Model-View-ViewModel-Pattern)\n- [DataModel-View-ViewModel Pattern](https://github.com/jbe2277/waf/wiki/DataModel-View-ViewModel-Pattern)\n\n**How to get started?**\n- WAF comes with realistic real-world sample applications. Please have a look at them. See Sample Applications below.\n- The [Wiki](https://github.com/jbe2277/waf/wiki) provides further guidance.\n\n## Supported Platforms\n\n-\t***.Core** *(.NET 6.0 and .NET Standard 2.0)*: Support for all .NET based applications.\n-\t***.Wpf** *(.NET 6.0 and .NET Framework 4.7.2)*: Extended support for Windows Presentation Foundation (WPF).\n\n## NuGet Packages\n\nPackage | Usage | Successor of\n--- | --- | ---\n[System.Waf.Core](https://www.nuget.org/packages/System.Waf.Core) | For all .NET based applications | \n[System.Waf.Wpf](https://www.nuget.org/packages/System.Waf.Wpf) | For WPF applications | [waf](https://www.nuget.org/packages/waf)\n[System.Waf.UnitTesting.Core](https://www.nuget.org/packages/System.Waf.UnitTesting.Core) | For unit testing of all .NET based applications | \n[System.Waf.UnitTesting.Wpf](https://www.nuget.org/packages/System.Waf.UnitTesting.Wpf) | For unit testing of WPF applications | [waf.testing](https://www.nuget.org/packages/waf.testing)\n\n## Features\n\n*System.Waf.Core*\n- *Foundation*\n    - `Cache`: Provides support for [caching](https://github.com/jbe2277/waf/wiki/Cache-Pattern) a value.\n    - `Model`: Base class that implements [INotifyPropertyChanged](https://docs.microsoft.com/en-us/dotnet/api/system.componentmodel.inotifypropertychanged).\n    - `ObservableList`: Extends the `ObservableCollection` with support for `INotifyCollectionChanging` and `INotifyCollectionItemChanged`.\n    - `ObservableListViewCore`: [Provide change notifications for sorting and filtering.](https://github.com/jbe2277/waf/wiki/ObservableListView%3A-Provide-change-notifications-for-sorting-and-filtering)\n    - `SynchronizingList`: Represents a collection that synchronizes all its items with the items of the specified original collection.\n    - `ThrottledAction`: [Throttling](https://github.com/jbe2277/waf/wiki/Throttling-to-improve-responsiveness) of multiple method calls to improve the responsiveness of an application.\n    - `ValidatableModel`: Base class for a model that supports validation by implementing [INotifyDataErrorInfo](https://docs.microsoft.com/en-us/dotnet/api/system.componentmodel.inotifydataerrorinfo).\n    - `WeakEvent`: Supports listening to events via a weak reference. This can prevent memory leaks. See [WeakEvent](https://github.com/jbe2277/waf/wiki/Weak-Event) page for more details.\n-\t*Applications*\n    -\t`ApplicationInfo`: Provides information about the running application.\n    - `(Async)DelegateCommand`: An implementation of [ICommand](https://docs.microsoft.com/en-us/dotnet/api/system.windows.input.icommand) that delegates Execute and CanExecute.\n    - `RecentFileList`: Most recently used (MRU) file list.\n    - `ViewModelCore`: [ViewModel](https://github.com/jbe2277/waf/wiki/Model-View-ViewModel-Pattern) base class with a simple approach to set the DataContext.\n-\t*Presentation*\n    -\t`SettingsService`: Load and save user settings as a XML file.\n\n*System.Waf.Wpf*\n- *Foundation*\n    - `DataErrorInfoSupport`: Helper class for working with the legacy [IDataErrorInfo](https://docs.microsoft.com/en-us/dotnet/api/system.componentmodel.idataerrorinfo) interface.\n- *Applications*    \n    - `ViewModel`: Extends the `ViewModelCore` class and automatically initializes the DataContext with the Dispatcher.\n- *Presentation*\n    - `DispatcherHelper`: Implementation for DoEvents.\n    - `ResourceHelper`: Helper methods to manage resources in WPF.\n    - `ValidationHelper`: Support for data validation tracking.\n    - *Converters*\n        - `BoolToVisibilityConverter`: Converts a boolean value to and from a Visibility value.\n        - `InvertBooleanConverter`: Inverts a boolean value.\n        - `NullToVisibilityConverter`: Check for null and return the associated Visibility value.\n        - `StringFormatConverter`: Converts an object into a formatted string.\n        - `ValidationErrorsConverter`: Converts a ValidationError collection to a multi-line string error message.\n    - *Services*\n        - `FileDialogService`: Shows an open or save file dialog box.\n        - `MessageService`: Shows messages via the MessageBox.\n       \n*System.Waf.UnitTesting.Core*\n-\t`AssertHelper`: Assertion helper methods for expected exceptions, [CanExecuteChanged](https://docs.microsoft.com/en-us/dotnet/api/system.windows.input.icommand.canexecutechanged) event and [PropertyChanged](https://docs.microsoft.com/en-us/dotnet/api/system.componentmodel.inotifypropertychanged) event.\n-\t`UnitTestSynchronizationContext`: [Synchronization context](https://docs.microsoft.com/en-us/dotnet/api/system.threading.synchronizationcontext) for unit tests that simulates the behavior of a UI synchronization context.\n\n## Sample Applications\nName | Type | Description\n--- | --- | ---\n[Waf NewsReader](https://github.com/jbe2277/waf/tree/master/src/NewsReader) | MAUI\u0026nbsp;9\u003cbr/\u003e.NET 9 | A simple and fast RSS and ATOM news feed reader.\u003cbr/\u003e\u003cul\u003e\u003cli\u003ePlatforms: Android, Windows and iOS\u003c/li\u003e\u003cli\u003eArchitecture: [Layering](https://github.com/jbe2277/waf/wiki/Layered-Architecture), [MVVM](https://github.com/jbe2277/waf/wiki/Model-View-ViewModel-Pattern), Async patterns\u003c/li\u003e\u003cli\u003eSync feeds with multiple devices via MS Graph (OneDrive)\u003c/li\u003e\u003cli\u003eOAuth authentication\u003c/li\u003e\u003cli\u003eResponsive UI with Navigation pane\u003c/li\u003e\u003cli\u003eValidation (Add feed view)\u003c/li\u003e\u003cli\u003eLocalized (English and German)\u003c/li\u003e\u003c/ul\u003e \n[Waf Writer](https://github.com/jbe2277/waf/tree/master/src/System.Waf/Samples/Writer) | WPF\u003cbr/\u003e.NET 8 | A basic word processing application.\u003cbr/\u003e\u003cul\u003e\u003cli\u003eArchitecture: [Layering](https://github.com/jbe2277/waf/wiki/Layered-Architecture), [MVVM](https://github.com/jbe2277/waf/wiki/Model-View-ViewModel-Pattern)\u003c/li\u003e\u003cli\u003eRibbon \u0026 Tabbed MDI (Multiple Document Interface)\u003c/li\u003e\u003cli\u003eAnimated transition between pages\u003c/li\u003e\u003cli\u003eMost recently used file list (MRU)\u003c/li\u003e\u003cli\u003eMessage service, Open/Save dialog service\u003c/li\u003e\u003cli\u003ePrint preview \u0026 Print dialog\u003c/li\u003e\u003cli\u003eLocalized (English and German)\u003c/li\u003e\u003cli\u003eUI testing with [FlaUI](https://github.com/FlaUI/FlaUI) and execution via GitHub Actions\u003c/li\u003e\u003c/ul\u003e\n[Waf Book Library](https://github.com/jbe2277/waf/tree/master/src/System.Waf/Samples/BookLibrary) | WPF\u003cbr/\u003e.NET 8 | Supports the user to manage books. Borrowed books can be tracked by this application.\u003cbr/\u003e\u003cul\u003e\u003cli\u003eArchitecture: [Layering](https://github.com/jbe2277/waf/wiki/Layered-Architecture), [Extensions](https://github.com/jbe2277/waf/wiki/Modular-Architecture#4-alternative-extensions), [MVVM](https://github.com/jbe2277/waf/wiki/Model-View-ViewModel-Pattern), [DMVVM](https://github.com/jbe2277/waf/wiki/DataModel-View-ViewModel-Pattern)\u003c/li\u003e\u003cli\u003eEntity Framework with SQLite\u003c/li\u003e\u003cli\u003eValidation rules\u003c/li\u003e\u003cli\u003eSort \u0026 Filter in the DataGrid\u003c/li\u003e\u003cli\u003eReporting via WPF FlowDocument \u0026 Print support\u003c/li\u003e\u003cli\u003eUI testing with [FlaUI](https://github.com/FlaUI/FlaUI) and execution via GitHub Actions\u003c/li\u003e\u003c/ul\u003e\n[Waf Information Manager](https://github.com/jbe2277/waf/tree/master/src/System.Waf/Samples/InformationManager) | WPF\u003cbr/\u003e.NET 8 | A modular application that comes with a fake email client and an address book.\u003cbr/\u003e\u003cul\u003e\u003cli\u003eArchitecture: [Layering](https://github.com/jbe2277/waf/wiki/Layered-Architecture), [Modularization](https://github.com/jbe2277/waf/wiki/Modular-Architecture), [MVVM](https://github.com/jbe2277/waf/wiki/Model-View-ViewModel-Pattern)\u003c/li\u003e\u003cli\u003eOffice format ZIP container shared with all modules (Package API and DataContractSerializer)\u003c/li\u003e\u003cli\u003eValidation rules\u003c/li\u003e\u003cli\u003eExtensible navigation view \u0026 context sensitive toolbar\u003c/li\u003e\u003cli\u003eWizard dialog\u003c/li\u003e\u003cli\u003eUI testing with [FlaUI](https://github.com/FlaUI/FlaUI) and execution via GitHub Actions\u003c/li\u003e\u003c/ul\u003e\n[Waf Music Manager](https://jbe2277.github.io/musicmanager/) | WPF\u003cbr/\u003e.NET 9 | Fast application that makes fun to manage the local music collection.\u003cbr/\u003e*MS Store (MSIX), WinRT, Media playback, File queries \u0026 properties, Async/await, Drag \u0026 Drop*\n[Waf DotNetPad](https://jbe2277.github.io/dotnetpad) | WPF\u003cbr/\u003e.NET 9 | Code editor for programming C# and Visual Basic.\u003cbr/\u003e*MS Store (MSIX), .NET Compiler Platform (Roslyn), AvalonEdit, Auto completion, Async/await*\n[Waf File Hash Generator](https://jbe2277.github.io/fhg/) | WinUI\u0026nbsp;3\u003cbr/\u003e.NET 9 | Simple tool that generates the hash values of one or more files.\u003cbr/\u003e*MS Store (MSIX), Async, Progress, Drag \u0026 Drop*\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjbe2277%2Fwaf","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjbe2277%2Fwaf","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjbe2277%2Fwaf/lists"}