diff --git a/docs/commands/async-commands.html b/docs/commands/async-commands.html
index d3aed01..5f18425 100644
--- a/docs/commands/async-commands.html
+++ b/docs/commands/async-commands.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/commands/commanding.html b/docs/commands/commanding.html
index 8dfda74..022a5b9 100644
--- a/docs/commands/commanding.html
+++ b/docs/commands/commanding.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/commands/composite-commands.html b/docs/commands/composite-commands.html
index bcba989..61da874 100644
--- a/docs/commands/composite-commands.html
+++ b/docs/commands/composite-commands.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/commands/error-handling.html b/docs/commands/error-handling.html
index 166425b..b4c7c2b 100644
--- a/docs/commands/error-handling.html
+++ b/docs/commands/error-handling.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/dependency-injection/add-custom-container.html b/docs/dependency-injection/add-custom-container.html
index 8b75163..c1a6219 100644
--- a/docs/dependency-injection/add-custom-container.html
+++ b/docs/dependency-injection/add-custom-container.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/dependency-injection/appendix.html b/docs/dependency-injection/appendix.html
index 3a4374d..b75624b 100644
--- a/docs/dependency-injection/appendix.html
+++ b/docs/dependency-injection/appendix.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/dependency-injection/container-locator.html b/docs/dependency-injection/container-locator.html
index 7016b6f..7b8202c 100644
--- a/docs/dependency-injection/container-locator.html
+++ b/docs/dependency-injection/container-locator.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/dependency-injection/index.html b/docs/dependency-injection/index.html
index 0e28ce6..869dc6c 100644
--- a/docs/dependency-injection/index.html
+++ b/docs/dependency-injection/index.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/dependency-injection/platform-specific-services.html b/docs/dependency-injection/platform-specific-services.html
index 2783d64..76c725d 100644
--- a/docs/dependency-injection/platform-specific-services.html
+++ b/docs/dependency-injection/platform-specific-services.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/dependency-injection/registering-types.html b/docs/dependency-injection/registering-types.html
index bb73480..b117a84 100644
--- a/docs/dependency-injection/registering-types.html
+++ b/docs/dependency-injection/registering-types.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/dependency-injection/resolution-errors.html b/docs/dependency-injection/resolution-errors.html
index 99cfe02..5edba8b 100644
--- a/docs/dependency-injection/resolution-errors.html
+++ b/docs/dependency-injection/resolution-errors.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/dependency-injection/servicecollection-supplement.html b/docs/dependency-injection/servicecollection-supplement.html
index a5cefe5..6429e7f 100644
--- a/docs/dependency-injection/servicecollection-supplement.html
+++ b/docs/dependency-injection/servicecollection-supplement.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/dialogs/dialog-aware.html b/docs/dialogs/dialog-aware.html
index 7c24f6c..e4ed93c 100644
--- a/docs/dialogs/dialog-aware.html
+++ b/docs/dialogs/dialog-aware.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/dialogs/dialog-window.html b/docs/dialogs/dialog-window.html
index 5a16f2b..468eaab 100644
--- a/docs/dialogs/dialog-window.html
+++ b/docs/dialogs/dialog-window.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/dialogs/index.html b/docs/dialogs/index.html
index b87db19..9911f99 100644
--- a/docs/dialogs/index.html
+++ b/docs/dialogs/index.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/event-aggregator.html b/docs/event-aggregator.html
index 3d036fa..c3e1a78 100644
--- a/docs/event-aggregator.html
+++ b/docs/event-aggregator.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/images/circle_green_checkmark.png b/docs/images/circle_green_checkmark.png
new file mode 100644
index 0000000..4e2e650
Binary files /dev/null and b/docs/images/circle_green_checkmark.png differ
diff --git a/docs/images/cross_red_circle.png b/docs/images/cross_red_circle.png
new file mode 100644
index 0000000..38ad364
Binary files /dev/null and b/docs/images/cross_red_circle.png differ
diff --git a/docs/index.html b/docs/index.html
index 26322ac..6bae2f9 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
@@ -517,6 +541,8 @@ Commercial Plus License
Additionally Commercial Plus license holders have access to a private Discord group where they can ask questions, help one another and get help directly from the Prism team.
+
+Xamarin.Forms is End of Life and as such 9.0 will be the last version that supports Xamarin.Forms apps. The Prism team has support for you in your journey whether you are migrating to .NET MAUI or Uno Platform. We have additionally invested time in providing support for your Xamarin.Forms apps with our new Prism Essentials and Prism Logging libraries. This will help to ensure that you have the maximum support while upgrading your Xamarin.Forms app to Prism 9.0 while working to migrate to .NET MAUI or Uno Platform.
diff --git a/docs/magician/index.html b/docs/magician/index.html
index 9ef9b9d..0bc8307 100644
--- a/docs/magician/index.html
+++ b/docs/magician/index.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/modularity/index.html b/docs/modularity/index.html
index b6efed0..f7a5e1b 100644
--- a/docs/modularity/index.html
+++ b/docs/modularity/index.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/modularity/module-catalog.html b/docs/modularity/module-catalog.html
index b466ea1..5dcff29 100644
--- a/docs/modularity/module-catalog.html
+++ b/docs/modularity/module-catalog.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/modularity/module-initialization.html b/docs/modularity/module-initialization.html
index b6dc4de..6b06bc9 100644
--- a/docs/modularity/module-initialization.html
+++ b/docs/modularity/module-initialization.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/mvvm/bindablebase.html b/docs/mvvm/bindablebase.html
index 4299da5..5e2ddb9 100644
--- a/docs/mvvm/bindablebase.html
+++ b/docs/mvvm/bindablebase.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/mvvm/viewmodel-locator.html b/docs/mvvm/viewmodel-locator.html
index 51043c1..fa0eecd 100644
--- a/docs/mvvm/viewmodel-locator.html
+++ b/docs/mvvm/viewmodel-locator.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/navigation/index.html b/docs/navigation/index.html
new file mode 100644
index 0000000..9cdd50b
--- /dev/null
+++ b/docs/navigation/index.html
@@ -0,0 +1,579 @@
+
+
+
+
+
+
+
+ Navigation | Prism
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Navigation
+
+Prism provides Uri based Navigation. Based on the platform you are developing for one or more Navigation methods may be possible. All Prism platforms support the concept of Region based Navigation .
+For those developing with the now deprecated Xamarin.Forms or with it's successor .NET MAUI, you can choose to additionally incorporate Page based Navigation.
+Whether you are developing using Page or Region based navigation, the API's for these have been updated in Prism 9.0 to provide a greater degree of code sharing. This includes a unified approach to using the INavigationParameters across both sets of API's.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/navigation/navigation-parameters.html b/docs/navigation/navigation-parameters.html
index c969d2e..853996a 100644
--- a/docs/navigation/navigation-parameters.html
+++ b/docs/navigation/navigation-parameters.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/navigation/page-navigation.html b/docs/navigation/page-navigation.html
index 771dd17..3086cae 100644
--- a/docs/navigation/page-navigation.html
+++ b/docs/navigation/page-navigation.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/navigation/regions/basic-region-navigation.html b/docs/navigation/regions/basic-region-navigation.html
index 7a38591..3e8711f 100644
--- a/docs/navigation/regions/basic-region-navigation.html
+++ b/docs/navigation/regions/basic-region-navigation.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/navigation/regions/confirming-navigation.html b/docs/navigation/regions/confirming-navigation.html
index 01e77a4..2f36c7b 100644
--- a/docs/navigation/regions/confirming-navigation.html
+++ b/docs/navigation/regions/confirming-navigation.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/navigation/regions/controlling-view-lifetime.html b/docs/navigation/regions/controlling-view-lifetime.html
index 6c40d4c..425af51 100644
--- a/docs/navigation/regions/controlling-view-lifetime.html
+++ b/docs/navigation/regions/controlling-view-lifetime.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/navigation/regions/index.html b/docs/navigation/regions/index.html
index fe81259..3593aa6 100644
--- a/docs/navigation/regions/index.html
+++ b/docs/navigation/regions/index.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/navigation/regions/navigation-existing-views.html b/docs/navigation/regions/navigation-existing-views.html
index 7a7f841..9c7dad6 100644
--- a/docs/navigation/regions/navigation-existing-views.html
+++ b/docs/navigation/regions/navigation-existing-views.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/navigation/regions/navigation-journal.html b/docs/navigation/regions/navigation-journal.html
index cf9bd3b..3c6b83e 100644
--- a/docs/navigation/regions/navigation-journal.html
+++ b/docs/navigation/regions/navigation-journal.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/navigation/regions/passing-parameters.html b/docs/navigation/regions/passing-parameters.html
index 935c1a0..29a1be2 100644
--- a/docs/navigation/regions/passing-parameters.html
+++ b/docs/navigation/regions/passing-parameters.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/navigation/regions/region-adapters.html b/docs/navigation/regions/region-adapters.html
index 478fad0..245a459 100644
--- a/docs/navigation/regions/region-adapters.html
+++ b/docs/navigation/regions/region-adapters.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/navigation/regions/region-behaviors.html b/docs/navigation/regions/region-behaviors.html
index cf6e961..b5c21b3 100644
--- a/docs/navigation/regions/region-behaviors.html
+++ b/docs/navigation/regions/region-behaviors.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/navigation/regions/region-manager.html b/docs/navigation/regions/region-manager.html
index 0f017d3..5b7781f 100644
--- a/docs/navigation/regions/region-manager.html
+++ b/docs/navigation/regions/region-manager.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/navigation/regions/view-viewmodel-participation.html b/docs/navigation/regions/view-viewmodel-participation.html
index 8b1c9dd..245feb4 100644
--- a/docs/navigation/regions/view-viewmodel-participation.html
+++ b/docs/navigation/regions/view-viewmodel-participation.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/maui/appbuilder.html b/docs/platforms/maui/appbuilder.html
index c4b09ab..e308abd 100644
--- a/docs/platforms/maui/appbuilder.html
+++ b/docs/platforms/maui/appbuilder.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
@@ -508,14 +532,16 @@ App Builder
Registering Services with Prism's IContainerRegistry
If you are coming to Prism.Maui from Prism.Forms, Prism.Wpf, or Prism.Uno you may be familiar with the RegisterTypes on the PrismApplication. In Prism.Maui this has moved to the PrismAppBuilder
.
var builder = MauiApp.CreateBuilder();
-builder.UseMauiApp<App>()
+builder.UseMauiApp<App>();
builder.UsePrism(prism =>
{
prism.RegisterTypes(container => {
// Register platform agnostic types
});
-}
-
+});
+Note In the case where you only see the variant of UsePrism
which requires an instance of the IContainerProvider
this means that you are missing Prism.DryIoc.Maui
. For most cases you will want this installed. Commercial Plus users may optionally install a different container package from the Prism NuGet feed such as Microsoft Extensions DependencyInjection or Grace Ioc. In these cases you would not need the Prism.DryIoc.Maui
package as you have another container to provide. All other users should use make sure Prism.DryIoc.Maui
is installed.
+
+
MAUI Single Project eliminates the need for the goofy IPlatformInitializer that was required for Prism.Forms. Registering Platform Specific services is as simple as including a compiler directive in your project.
prism.RegisterTypes(container =>
{
diff --git a/docs/platforms/maui/appmodel/pagelifecycleaware.html b/docs/platforms/maui/appmodel/pagelifecycleaware.html
index 915e942..634a663 100644
--- a/docs/platforms/maui/appmodel/pagelifecycleaware.html
+++ b/docs/platforms/maui/appmodel/pagelifecycleaware.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/maui/behaviors/behaviorbase.html b/docs/platforms/maui/behaviors/behaviorbase.html
index eed890b..c42268c 100644
--- a/docs/platforms/maui/behaviors/behaviorbase.html
+++ b/docs/platforms/maui/behaviors/behaviorbase.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/maui/behaviors/eventtocommandbehavior.html b/docs/platforms/maui/behaviors/eventtocommandbehavior.html
index ed565a2..87785ac 100644
--- a/docs/platforms/maui/behaviors/eventtocommandbehavior.html
+++ b/docs/platforms/maui/behaviors/eventtocommandbehavior.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/maui/behaviors/index.html b/docs/platforms/maui/behaviors/index.html
index ec2232a..31ac2ab 100644
--- a/docs/platforms/maui/behaviors/index.html
+++ b/docs/platforms/maui/behaviors/index.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/maui/behaviors/pagebehaviorfactory.html b/docs/platforms/maui/behaviors/pagebehaviorfactory.html
index 86092cb..953acce 100644
--- a/docs/platforms/maui/behaviors/pagebehaviorfactory.html
+++ b/docs/platforms/maui/behaviors/pagebehaviorfactory.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/maui/dialogs/index.html b/docs/platforms/maui/dialogs/index.html
index bd475e6..8827f42 100644
--- a/docs/platforms/maui/dialogs/index.html
+++ b/docs/platforms/maui/dialogs/index.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/maui/dialogs/pagedialogs.html b/docs/platforms/maui/dialogs/pagedialogs.html
index 6523539..acc2bcc 100644
--- a/docs/platforms/maui/dialogs/pagedialogs.html
+++ b/docs/platforms/maui/dialogs/pagedialogs.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/maui/index.html b/docs/platforms/maui/index.html
index 5e75437..20288ce 100644
--- a/docs/platforms/maui/index.html
+++ b/docs/platforms/maui/index.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/maui/migrating.html b/docs/platforms/maui/migrating.html
index a9d1702..bb89b60 100644
--- a/docs/platforms/maui/migrating.html
+++ b/docs/platforms/maui/migrating.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/maui/navigation/global-navigation-observer.html b/docs/platforms/maui/navigation/global-navigation-observer.html
index cf45492..fd7f55a 100644
--- a/docs/platforms/maui/navigation/global-navigation-observer.html
+++ b/docs/platforms/maui/navigation/global-navigation-observer.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/maui/navigation/index.html b/docs/platforms/maui/navigation/index.html
index 3fb498e..3143064 100644
--- a/docs/platforms/maui/navigation/index.html
+++ b/docs/platforms/maui/navigation/index.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/maui/navigation/navigation-builder.html b/docs/platforms/maui/navigation/navigation-builder.html
index ae21a1e..745e995 100644
--- a/docs/platforms/maui/navigation/navigation-builder.html
+++ b/docs/platforms/maui/navigation/navigation-builder.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/maui/navigation/navigation-exceptions.html b/docs/platforms/maui/navigation/navigation-exceptions.html
index c232800..1692b32 100644
--- a/docs/platforms/maui/navigation/navigation-exceptions.html
+++ b/docs/platforms/maui/navigation/navigation-exceptions.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/maui/navigation/navigation-result.html b/docs/platforms/maui/navigation/navigation-result.html
index 0862b0f..d57ab27 100644
--- a/docs/platforms/maui/navigation/navigation-result.html
+++ b/docs/platforms/maui/navigation/navigation-result.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/maui/navigation/page-navigation.html b/docs/platforms/maui/navigation/page-navigation.html
index 0fe620e..a67e342 100644
--- a/docs/platforms/maui/navigation/page-navigation.html
+++ b/docs/platforms/maui/navigation/page-navigation.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/maui/navigation/prismnavigationpage.html b/docs/platforms/maui/navigation/prismnavigationpage.html
index 1d50e14..d6a2f9a 100644
--- a/docs/platforms/maui/navigation/prismnavigationpage.html
+++ b/docs/platforms/maui/navigation/prismnavigationpage.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/maui/navigation/tabbed-navigation.html b/docs/platforms/maui/navigation/tabbed-navigation.html
new file mode 100644
index 0000000..ad5d20b
--- /dev/null
+++ b/docs/platforms/maui/navigation/tabbed-navigation.html
@@ -0,0 +1,615 @@
+
+
+
+
+
+
+
+ TabbedPages | Prism
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+TabbedPages
+
+Selecting a Tab at Runtime
+Sometimes you may want to programmatically switch between tabs. Keep in mind that this must be done from a ViewModel attached to one of the children of the TabbedPage or the TabbedPage itself.
+var result = await navigationService.SelectTabAsync("TabB");
+
In the event that you have a tab which is nested inside of a NavigationPage you can select the tab:
+var result = await navigationService.SelectTabAsync("NavigationPage|TabB");
+
Navigating to a TabbedPage
+Tabbed Navigation in Prism for .NET MAUI has been significantly enhanced in Prism for Xamarin.Forms. Due to a variety of changes we suggest using a Uri to generate your TabbedPage over using a concrete type like:
+<!-- Not Recommended -->
+<TabbedPage>
+ <view:ViewA />
+ <view:ViewB />
+</TabbedPage>
+
The recommended way to do this would be to use either a Uri:
+navigationService.NavigateAsync("TabbedPage?createTab=ViewA&createTab=ViewB");
+
Alternatively you can use the NavigationBuilder to build your TabbedPage on the fly.
+navigationService.CreateBuilder()
+ .AddTabbedSegment(s => s
+ .CreateTab(t => t.AddSegment<ViewAViewModel>())
+ .CreateTab(t => t.AddNavigationPage().AddSegment<ViewBViewModel>())
+ )
+ .NavigateAsync();
+
This approach offers you a lot of flexibility when creating the same tabbed page over and over throughout your app as well as you can write an extension method once to consolidate this.
+public static class MyNavigationExtensions
+{
+ public static INavigationBuilder AddMyTabbedPage(this INavigationBuilder builder, string? selectedTab = null)
+ {
+ return builder.AddTabbedSegment(s =>
+ {
+ s.CreateTab(t => t.AddSegment<ViewAViewModel>())
+ .CreateTab(t => t.AddNavigationPage().AddSegment<ViewBViewModel>());
+ if (!string.IsNullOrEmpty(selectedTab))
+ {
+ s.SelectedTab(selectedTab);
+ }
+ });
+ }
+}
+
Note Prism automatically registers the .NET MAUI TabbedPage with the navigation key TabbedPage
. You do not need to register your own.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/platforms/maui/navigation/xaml-navigation.html b/docs/platforms/maui/navigation/xaml-navigation.html
index 080c826..8c82a55 100644
--- a/docs/platforms/maui/navigation/xaml-navigation.html
+++ b/docs/platforms/maui/navigation/xaml-navigation.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/uno/extensions.html b/docs/platforms/uno/extensions.html
index baa3bdd..6daf277 100644
--- a/docs/platforms/uno/extensions.html
+++ b/docs/platforms/uno/extensions.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/uno/index.html b/docs/platforms/uno/index.html
index b91c16e..e494481 100644
--- a/docs/platforms/uno/index.html
+++ b/docs/platforms/uno/index.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/wpf/dialog-service.html b/docs/platforms/wpf/dialog-service.html
index f08706a..6047bfa 100644
--- a/docs/platforms/wpf/dialog-service.html
+++ b/docs/platforms/wpf/dialog-service.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/wpf/getting-started.html b/docs/platforms/wpf/getting-started.html
index 47b3021..010dede 100644
--- a/docs/platforms/wpf/getting-started.html
+++ b/docs/platforms/wpf/getting-started.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/wpf/interactivity/event-to-command.html b/docs/platforms/wpf/interactivity/event-to-command.html
index ea029f3..ef7bb45 100644
--- a/docs/platforms/wpf/interactivity/event-to-command.html
+++ b/docs/platforms/wpf/interactivity/event-to-command.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/wpf/introduction.html b/docs/platforms/wpf/introduction.html
index 57a111e..1e92e6e 100644
--- a/docs/platforms/wpf/introduction.html
+++ b/docs/platforms/wpf/introduction.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/wpf/view-composition.html b/docs/platforms/wpf/view-composition.html
index e43689b..e05f3bc 100644
--- a/docs/platforms/wpf/view-composition.html
+++ b/docs/platforms/wpf/view-composition.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/xamarin-forms/Dependency-Service.html b/docs/platforms/xamarin-forms/Dependency-Service.html
index d626a60..0dccef9 100644
--- a/docs/platforms/xamarin-forms/Dependency-Service.html
+++ b/docs/platforms/xamarin-forms/Dependency-Service.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/xamarin-forms/Getting-Started.html b/docs/platforms/xamarin-forms/Getting-Started.html
index 2a5e431..40f1f92 100644
--- a/docs/platforms/xamarin-forms/Getting-Started.html
+++ b/docs/platforms/xamarin-forms/Getting-Started.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/xamarin-forms/application-lifecycle.html b/docs/platforms/xamarin-forms/application-lifecycle.html
index e055164..2b1777a 100644
--- a/docs/platforms/xamarin-forms/application-lifecycle.html
+++ b/docs/platforms/xamarin-forms/application-lifecycle.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/xamarin-forms/behaviors/eventtocommandbehavior.html b/docs/platforms/xamarin-forms/behaviors/eventtocommandbehavior.html
index 41ce175..fe739f8 100644
--- a/docs/platforms/xamarin-forms/behaviors/eventtocommandbehavior.html
+++ b/docs/platforms/xamarin-forms/behaviors/eventtocommandbehavior.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/xamarin-forms/behaviors/index.html b/docs/platforms/xamarin-forms/behaviors/index.html
index 9d9bb0c..e8380f5 100644
--- a/docs/platforms/xamarin-forms/behaviors/index.html
+++ b/docs/platforms/xamarin-forms/behaviors/index.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/xamarin-forms/behaviors/page-behavior-factory.html b/docs/platforms/xamarin-forms/behaviors/page-behavior-factory.html
index 275a889..cf0a598 100644
--- a/docs/platforms/xamarin-forms/behaviors/page-behavior-factory.html
+++ b/docs/platforms/xamarin-forms/behaviors/page-behavior-factory.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/xamarin-forms/converting-an-existing-app.html b/docs/platforms/xamarin-forms/converting-an-existing-app.html
index c5f4bb5..8d4e26d 100644
--- a/docs/platforms/xamarin-forms/converting-an-existing-app.html
+++ b/docs/platforms/xamarin-forms/converting-an-existing-app.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/xamarin-forms/creating-your-first-prism-app.html b/docs/platforms/xamarin-forms/creating-your-first-prism-app.html
index 0fa0239..25eb3ff 100644
--- a/docs/platforms/xamarin-forms/creating-your-first-prism-app.html
+++ b/docs/platforms/xamarin-forms/creating-your-first-prism-app.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/xamarin-forms/dialogs/dialog-service.html b/docs/platforms/xamarin-forms/dialogs/dialog-service.html
index cdc875f..e88f1ae 100644
--- a/docs/platforms/xamarin-forms/dialogs/dialog-service.html
+++ b/docs/platforms/xamarin-forms/dialogs/dialog-service.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/xamarin-forms/dialogs/index.html b/docs/platforms/xamarin-forms/dialogs/index.html
index 49b092b..6d3bc54 100644
--- a/docs/platforms/xamarin-forms/dialogs/index.html
+++ b/docs/platforms/xamarin-forms/dialogs/index.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/xamarin-forms/dialogs/page-dialog-service.html b/docs/platforms/xamarin-forms/dialogs/page-dialog-service.html
index ba0501f..d978da1 100644
--- a/docs/platforms/xamarin-forms/dialogs/page-dialog-service.html
+++ b/docs/platforms/xamarin-forms/dialogs/page-dialog-service.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/xamarin-forms/dialogs/styling-dialogs.html b/docs/platforms/xamarin-forms/dialogs/styling-dialogs.html
index d1af4db..1e6a023 100644
--- a/docs/platforms/xamarin-forms/dialogs/styling-dialogs.html
+++ b/docs/platforms/xamarin-forms/dialogs/styling-dialogs.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/xamarin-forms/navigation/confirming-navigation.html b/docs/platforms/xamarin-forms/navigation/confirming-navigation.html
index f955501..d62d5de 100644
--- a/docs/platforms/xamarin-forms/navigation/confirming-navigation.html
+++ b/docs/platforms/xamarin-forms/navigation/confirming-navigation.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/xamarin-forms/navigation/deep-linking.html b/docs/platforms/xamarin-forms/navigation/deep-linking.html
index 142b82b..405dc32 100644
--- a/docs/platforms/xamarin-forms/navigation/deep-linking.html
+++ b/docs/platforms/xamarin-forms/navigation/deep-linking.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/xamarin-forms/navigation/initialization.html b/docs/platforms/xamarin-forms/navigation/initialization.html
index f44f0ae..64b236f 100644
--- a/docs/platforms/xamarin-forms/navigation/initialization.html
+++ b/docs/platforms/xamarin-forms/navigation/initialization.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/xamarin-forms/navigation/navigation-basics.html b/docs/platforms/xamarin-forms/navigation/navigation-basics.html
index 17989ac..8f5f447 100644
--- a/docs/platforms/xamarin-forms/navigation/navigation-basics.html
+++ b/docs/platforms/xamarin-forms/navigation/navigation-basics.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/xamarin-forms/navigation/passing-parameters.html b/docs/platforms/xamarin-forms/navigation/passing-parameters.html
index da3a2a6..3ba101f 100644
--- a/docs/platforms/xamarin-forms/navigation/passing-parameters.html
+++ b/docs/platforms/xamarin-forms/navigation/passing-parameters.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/xamarin-forms/navigation/working-with-masterdetailpages.html b/docs/platforms/xamarin-forms/navigation/working-with-masterdetailpages.html
index 452ee96..7595e2c 100644
--- a/docs/platforms/xamarin-forms/navigation/working-with-masterdetailpages.html
+++ b/docs/platforms/xamarin-forms/navigation/working-with-masterdetailpages.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/xamarin-forms/navigation/working-with-navigationpages.html b/docs/platforms/xamarin-forms/navigation/working-with-navigationpages.html
index bd22a65..8b0c340 100644
--- a/docs/platforms/xamarin-forms/navigation/working-with-navigationpages.html
+++ b/docs/platforms/xamarin-forms/navigation/working-with-navigationpages.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/xamarin-forms/navigation/working-with-tabbedpages.html b/docs/platforms/xamarin-forms/navigation/working-with-tabbedpages.html
index f9bbf59..04d5a99 100644
--- a/docs/platforms/xamarin-forms/navigation/working-with-tabbedpages.html
+++ b/docs/platforms/xamarin-forms/navigation/working-with-tabbedpages.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/xamarin-forms/navigation/xaml-navigation.html b/docs/platforms/xamarin-forms/navigation/xaml-navigation.html
index a25ee41..601790c 100644
--- a/docs/platforms/xamarin-forms/navigation/xaml-navigation.html
+++ b/docs/platforms/xamarin-forms/navigation/xaml-navigation.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/xamarin-forms/page-lifecycle.html b/docs/platforms/xamarin-forms/page-lifecycle.html
index 541eb7a..9ea6b73 100644
--- a/docs/platforms/xamarin-forms/page-lifecycle.html
+++ b/docs/platforms/xamarin-forms/page-lifecycle.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/platforms/xamarin-forms/platform-reference/gtk.html b/docs/platforms/xamarin-forms/platform-reference/gtk.html
index de1e007..10624f9 100644
--- a/docs/platforms/xamarin-forms/platform-reference/gtk.html
+++ b/docs/platforms/xamarin-forms/platform-reference/gtk.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/plugins/essentials/appcontext.html b/docs/plugins/essentials/appcontext.html
index 5542e9b..d151e83 100644
--- a/docs/plugins/essentials/appcontext.html
+++ b/docs/plugins/essentials/appcontext.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/plugins/essentials/connectivity.html b/docs/plugins/essentials/connectivity.html
index 40e5904..92c225a 100644
--- a/docs/plugins/essentials/connectivity.html
+++ b/docs/plugins/essentials/connectivity.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/plugins/essentials/filesystem.html b/docs/plugins/essentials/filesystem.html
index 3076653..35c23f0 100644
--- a/docs/plugins/essentials/filesystem.html
+++ b/docs/plugins/essentials/filesystem.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
@@ -489,7 +513,14 @@
File System
-
+The IFileSystem
interface from Prism Essentials provides a simple to use DirectoryInfo
object for the AppData, Cache and Public file storage directories. From there is becomes a simple matter of normal File IO to locate, open and save files.
+You can additionally check if a file exists within an App Package:
+if (await fileSystem.FileExistsAsync("myFile.txt"))
+{
+ using var stream = await fileSystem.OpenFileAsync("myFile.txt");
+ // Do something with the file stream.
+}
+
diff --git a/docs/plugins/essentials/index.html b/docs/plugins/essentials/index.html
index ba14232..13746f7 100644
--- a/docs/plugins/essentials/index.html
+++ b/docs/plugins/essentials/index.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
@@ -505,13 +529,23 @@
Getting Started
Be sure to install Prism.Plugin.Essentials.Maui
-
+
builder.UseMauiApp<App>()
+ .UsePrism(prism => prism.UsePrismEssentials())
+
Be sure to install Prism.Plugin.Essentials.Wpf
-
+
protected override void RegisterTypes(IContainerRegistry containerRegistry)
+{
+ containerRegistry.UsePrismEssentials();
+}
+
+
protected override void RegisterTypes(IContainerRegistry containerRegistry)
+{
+ containerRegistry.UsePrismEssentials();
+}
+
Note Prism.Plugins including Prism.Plugin.Essentials is only available for those with an active Commercial Plus license, and is available on the private Prism NuGet server. Prism.Essentials does NOT support Prism.Forms as Xamarin.Forms is considered to be End of Life and the Prism 9.0 release for Xamarin.Forms is provided only to better assist developers to first update to the Prism 9.0 API prior to migrating to .NET MAUI.
diff --git a/docs/plugins/essentials/mainthread.html b/docs/plugins/essentials/mainthread.html
index 144c022..2be9a8b 100644
--- a/docs/plugins/essentials/mainthread.html
+++ b/docs/plugins/essentials/mainthread.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/plugins/essentials/permissions.html b/docs/plugins/essentials/permissions.html
new file mode 100644
index 0000000..fbff102
--- /dev/null
+++ b/docs/plugins/essentials/permissions.html
@@ -0,0 +1,793 @@
+
+
+
+
+
+
+
+ App Permissions | Prism
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/plugins/essentials/stores.html b/docs/plugins/essentials/stores.html
index 75c1248..3667cc6 100644
--- a/docs/plugins/essentials/stores.html
+++ b/docs/plugins/essentials/stores.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
diff --git a/docs/plugins/logging/gelf.html b/docs/plugins/logging/gelf.html
new file mode 100644
index 0000000..5eeceac
--- /dev/null
+++ b/docs/plugins/logging/gelf.html
@@ -0,0 +1,622 @@
+
+
+
+
+
+
+
+ Logging with Graylog (GELF) | Prism
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Logging with Graylog (GELF)
+
+Graylog is a great option for Developers. We find that there are generally 2 categories of developers that really love using Graylog:
+
+Developers who want to have logging that is disconnected from Visual Studio but something that can remain local on their developer machine. This can work fantastic in scenarios where you may be doing a demo from a pre-deploy dev build to a device without an active Debug session in Visual Studio. In these situations we have all had great demos where something goes wrong and we wish we could see what happened. Using the GELF logger this problem can be solved by ensuring that even while you're doing your demo the logs can continue to stream to your machine for you to review later.
+Some Enterprises in particular have very strict Data policies. As such owning the full End-to-End solution can be of great importance. For these customers Graylog can provide a fantastic option as you can control your options by deploying your own Graylog server into production.
+
+Setup
+Local Debugging
+Below is a sample docker file. You can use this to create a local Graylog stack using the Graylog Docker image . This can be useful for testing application logs locally. Requires Docker and Docker Compose.
+
+docker-compose up
+Navigate to http://localhost:9000
+Credentials: admin/admin
+Create a UDP input on port 12201 and set GelfLoggerOptions.Host
to localhost
.
+
+services:
+ mongo:
+ image: mongo:4.2
+ elasticsearch:
+ image: docker.elastic.co/elasticsearch/elasticsearch-oss:7.10.0
+ environment:
+ - http.host=0.0.0.0
+ - transport.host=localhost
+ - network.host=0.0.0.0
+ - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
+ ulimits:
+ memlock:
+ soft: -1
+ hard: -1
+ graylog:
+ image: graylog/graylog:4.0
+ environment:
+ - GRAYLOG_PASSWORD_SECRET="!ux*lAfQVjaRT8iI"
+ - GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
+ - GRAYLOG_HTTP_EXTERNAL_URI=http://localhost:9000/
+ entrypoint: /usr/bin/tini -- wait-for-it elasticsearch:9200 -- /docker-entrypoint.sh
+ restart: always
+ depends_on:
+ - mongo
+ - elasticsearch
+ ports:
+ - 9000:9000
+ - 1514:1514
+ - 1514:1514/udp
+ - 12201:12201
+ - 12201:12201/udp
+ - 12202:12202
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/plugins/logging/index.html b/docs/plugins/logging/index.html
new file mode 100644
index 0000000..a103e82
--- /dev/null
+++ b/docs/plugins/logging/index.html
@@ -0,0 +1,682 @@
+
+
+
+
+
+
+
+ Prism.Plugin.Logging | Prism
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Prism.Plugin.Logging
+
+Available now to Commercial Plus license holders on the Prism NuGet feed.
+Why another Logging Library?
+It's a fair question. Certainly you may be thinking we already have a number of logging options using Microsoft.Extensions.Logging. While Microsoft Logging works great for a number of solutions it falls flat in a few key areas:
+
+It's hard to collect metrics with the context of a specific user
+It doesn't map well for Tracking Events and Error Reports similar to what developers are used to with AppCenter
+
+Additionally Prism.Plugin.Logging allows you to opt into using the AggregateLogger. This allows you to register multiple logging providers which can be simultaneously streamed to. For instance you may want to use AppCenter while also testing out other providers like Graylog, Raygun or Sentry.
+Getting Started
+Prism.Plugin Logging has a number of providers out of the box and it's fairly straight forward to implement custom solutions. There are 4 key interfaces that you may want to use from Prism.Plugin.Logging.
+
+IAnalyticsService
+ICrashesService
+IUserProvider
+
+These 3 provide specific functionality that developers are generally looking for and can be helpful to write meaningful code as you can see clearly that you're tracking analytics, exceptions or managing the active user in your application. All 3 of these are included as part of the central ILogger
interface, which additionally exposes a more generic Log
method.
+By default Prism Logging provides an Aggregate Logger allowing you to register and configure multiple logging providers. There is no additional configuration that you need to do in order to use this feature. To get started with Prism Logging you simply need to register it with the IContainerProvider:
+containerRegistry.UsePrismLogging(logging => {
+ // Register your providers
+ logging.AddDebug();
+});
+
Configuration
+Some logging providers such as the Null, Debug and Testing providers are intentionally not configurable as it makes sense to log all messages sent to them, or in the case of the Null logger nothing is logged anyway. The rest of the Logging providers provide some degree of configuration. This ensures that you can tailor the logging experience based on the provider. By default all features of the ILogger are enabled, however by optionally configuring the options, you can disable Event Tracking, Error Reporting, or you can disable or tune the generic logging.
+To disable Event Tracking we can simply set the EnableEventTracking
property to false
+logging.AddConsole(o => o.EnableEventTracking = false);
+
To disable the Error Tracking we can simply set the EnableErrorTracking
property to false
+logging.AddConsole(o => o.EnableErrorTracking = false);
+
To disable generic logging we can simply set the EnableLogging
property to false
+logging.AddConsole(o => o.EnableLogging = false);
+
We can also tune the logging to filter out logged messages by category assuming that it has one. In the following case we will exclude any logs that have a property Category
with the value Debug
.
+logging.AddConsole(o => o.ExcludedLoggingCategories = [LogCategory.Debug]);
+
Similarly we could exclude logs which lack a category property.
+logging.AddConsole(o => o.ExcludedLoggingCategories = [LogCategory.Uncategorized]);
+
Logging Scopes
+Scopes allow you to provide additional properties automatically on any logs, events or errors that you send to the ILogger. This means that you can define a property one time and it will automatically be added for you without the need to specify it again within the scope. An implicit Service Scope can be created by providing a generic type argument when resolving the ILogger.
+public class MyViewModel(ILogger<MyViewModel> logger) : BindableBase
+{
+}
+
Keep in mind that the ILogger<T>
inherits from ILogger
so when working with a base Service or ViewModel you can have a requirement for ILogger
while injecting a typed ILogger
in the implementing class.
+public abstract class ViewModelBase(ILogger logger) : BindableBase { }
+
+public sealed class ViewAViewModel(ILogger<ViewAViewModel> logger) : ViewModelBase(logger) { }
+
In addition to implicit scoping you can provide an explicit logging scope by creating a disposable scope within your code. There are a number of times this could be useful for instance you may want to chain this within Commands or helper methods to help provide additional context about the code path that lead to an event or error.
+public abstract class ViewModelBase(ILogger logger, IRegionManager regionManager) : BindableBase
+{
+ protected void DoNavigation(string regionName, string viewName)
+ {
+ using (logger.CreateScope("Method", nameof(DoNavigation)))
+ {
+ logger.Debug($"Navigating to {viewName} in the {regionName} region.");
+ regionManager.RequestNavigate(regionName, viewName);
+ }
+ }
+}
+
+public sealed class ViewAViewModel(ILogger<ViewAViewModel> logger, IRegionManager regionManager) : ViewModelBase(logger, regionManager)
+{
+ private void OnLogin()
+ {
+ using var _ = logger.CreateScope("Command", nameof(LoginCommand));
+ // your login logic
+
+ DoNavigation("MyContent", "ViewB");
+ }
+}
+
In the above example we can see that we have a single Debug log generated which has a simple message. However due to the Implicit and Explicit scopes we can expect to see the Service type, the Command name, and the Method name all added automatically as properties to our logged message.
+Logging Providers
+Prism provides a number of logging providers available out of the box for you with additional providers currently under consideration. If we do not have integration for a provider that you would like please let us know on Discord.
+AppCenter
+As previously mentioned, Prism.Plugin.Logging has a couple of interfaces which help users better map to the sort of calls that you might be used to with the AppCenter SDK. This can really help you in 2 critical ways.
+1) By removing the static references to the AppCenter SDK from your codebase, your code becomes easier to manage over time as you have the ability to swap out providers or inject a mock for Unit Testing.
+2) Since AppCenter is nearing EOL, it will be critical for businesses to continue using App Center while they evaluate other options. Prism.Plugin.Logging will help you to do just that by combining the AppCenter provider with the AggregateLogger as you evaluate other providers.
+// By Default this registers Analytics and Crashes
+containerRegistry.RegisterAppCenterLogger("appSecret");
+
+// If you need to customize the list with other providers
+containerRegistry.RegisterAppCenterLogger("appSecret", typeof(Analytics), typeof(Crashes), typeof(Distribution));
+
Console Logger
+By installing the Prism.Plugin.Logging.Console
package you get access to the generic Console Logger. This will literally call System.Console.WriteLine
to write logging messages.
+containerRegistry.UsePrismLogging(logging => {
+ logging.AddConsole();
+});
+
Debug Logger
+Similar to the Console Logger is the Debug Logger. This will use System.Diagnostics.Debug.WriteLine
, and will only write to Debug.WriteLine
when the Debugger is currently attached. This is a great logger to use for debugging in your IDE and will not produce any logs in the device console if you forget to remove it for production.
+containerRegistry.UsePrismLogging(logging => {
+ logging.AddDebug();
+});
+
Graylog (GELF)
+For more information see the Gelf docs .
+Microsoft.Extensions.Logging Interoperability
+For more information see the Microsoft.Extensions.Logging Interoperability docs .
+Raygun
+containerRegistry.UsePrismLogging(logging => {
+ logging.AddRaygun("RaygunApiKey");
+});
+
Sentry
+containerRegistry.UsePrismLogging(logging => {
+ logging.AddSentry("sentryDsn");
+});
+
Testing
+For more information on Unit Testing support see the Prism.Plugin.Logging.Testing docs .
+Xunit
+Unit testing is critical to catching bugs early. But the logging that you might have in your application you probably don't want to have used in your unit tests. For this reason we have an Xunit provider that enables logging using the ITestOutputHelper. This will help to ensure that logs collected during a unit test are associated with the test and makes it easier to view the logged output from your tests.
+containerRegistry.UsePrismLogging(logging => {
+ logging.AddXunit(testOutputHelper);
+});
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/plugins/logging/microsoft.html b/docs/plugins/logging/microsoft.html
new file mode 100644
index 0000000..1cb17f8
--- /dev/null
+++ b/docs/plugins/logging/microsoft.html
@@ -0,0 +1,595 @@
+
+
+
+
+
+
+
+ Microsoft.Extensions.Logging Interop | Prism
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Microsoft.Extensions.Logging Interop
+
+We recognize that your apps (particularly .NET MAUI and Uno Platform), may have logging that occurs internally using Microsoft.Extensions.Logging. For this reason we've taken the time to put together a logging adapter that allows the logging output from the Microsoft.Extensions.Logging.ILogger to be passed through to the configured Prism Logging Providers that you have in your application. While the exact code may vary
+
+public class App : PrismApplication
+{
+ protected override void ConfigureHost(IHostBuilder hostBuilder)
+ {
+ builder.UseLogging(configure: (context, logBuilder) => {
+ logBuilder.AddPrismLogging();
+ });
+ }
+}
+
Prism for .NET MAUI
+public static class PrismStartup
+{
+ public static void Configure(PrismAppBuilder builder)
+ {
+ builder.ConfigureLogging(logging => logging.AddPrismLogging());
+ }
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/plugins/logging/testing.html b/docs/plugins/logging/testing.html
new file mode 100644
index 0000000..79ad987
--- /dev/null
+++ b/docs/plugins/logging/testing.html
@@ -0,0 +1,593 @@
+
+
+
+
+
+
+
+ Prism.Plugin.Logging.Testing | Prism
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Prism.Plugin.Logging.Testing
+
+Prism Logging also provides a more generic Testing logger that can be used to validate that logs were actually logged as part of your unit tests.
+containerRegistry.UsePrismLogging(logging => {
+ logging.AddTest();
+});
+
When unit testing you can take advantage of the an additional extension method to get the Logs from the Test Logger. You can then interrogate the logs for your unit tests.
+// NOTE: The Test logger can also be created manually for unit tests without the DI Container.
+var logger = TestLogger.Create();
+var service = new MyService(logger);
+service.DoSomething();
+
+var logs = logger.GetLogs();
+
+// assuming you're using FluentAssertions
+logs.Should().ContainSingle();
+
You can also use the Test logger with services that make use of the implicit type scope.
+var logger = TestLogger.Create();
+var service = new MyService(logger.AsGenericLogger<MyService>());
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/plugins/popups.html b/docs/plugins/popups.html
index d022b91..f2deada 100644
--- a/docs/plugins/popups.html
+++ b/docs/plugins/popups.html
@@ -178,6 +178,9 @@
Navigation
+
+
+ Logging
+
+
Popups
@@ -496,7 +520,9 @@
Rg.Plugins.Popup
does not support .NET MAUI applications, however the project has been forked and is now called Mopups
. To use the Popup Plugin, you must be a Commercial Plus subscriber and have added the private Prism NuGet feed. You can then install Prism.Plugin.Popups.Maui
. Once you have installed the package you simply need to call ConfigureMopupDialogs
on the PrismAppBuilder.
builder.UseMauiApp<App>()
.UsePrism(prism => prism.ConfigureMopupDialogs())
-
+
Note Using PopupPage's directly with Prism Navigation is no longer supported. PopupPage's are best used and make the most sense to be used as a Dialog. For this reason you should migrate your code to use the DialogService. Note that Prism.Plugin.Popups for .NET MAUI does expose a number of additional attached properties that you can use to configure the PopupPage that is created by the DialogService.
+
+
diff --git a/manifest.json b/manifest.json
index a000eee..74e3307 100644
--- a/manifest.json
+++ b/manifest.json
@@ -9,7 +9,7 @@
"output": {
".html": {
"relative_path": "docs/commands/async-commands.html",
- "hash": "TnpL9kcwlcsLueO2hoPVQw=="
+ "hash": "v92M7ArQJ3VhiuTayzV10A=="
}
},
"is_incremental": false,
@@ -21,7 +21,7 @@
"output": {
".html": {
"relative_path": "docs/commands/commanding.html",
- "hash": "K6s1rFfvo0874wafDj6xZQ=="
+ "hash": "RMdr9rkF+7RE6MmMwU8qaw=="
}
},
"is_incremental": false,
@@ -33,7 +33,7 @@
"output": {
".html": {
"relative_path": "docs/commands/composite-commands.html",
- "hash": "pAkCuW/EDS/hPOe3CWviuA=="
+ "hash": "FXA4iroLjrSUT/iBtERFxg=="
}
},
"is_incremental": false,
@@ -45,7 +45,7 @@
"output": {
".html": {
"relative_path": "docs/commands/error-handling.html",
- "hash": "0y138F70Mj448YXKz2xCpg=="
+ "hash": "KKKXOeS3lhsB8m0ywOxydQ=="
}
},
"is_incremental": false,
@@ -57,7 +57,7 @@
"output": {
".html": {
"relative_path": "docs/dependency-injection/add-custom-container.html",
- "hash": "4uzOQzZMDKAxLQZqPwd8Ug=="
+ "hash": "ezphkDDO3XQ77VeYL05/UQ=="
}
},
"is_incremental": false,
@@ -69,7 +69,7 @@
"output": {
".html": {
"relative_path": "docs/dependency-injection/appendix.html",
- "hash": "O8sXOQW/VK1GblCQGBk/qQ=="
+ "hash": "bNpLqbYE0h5lLm9sJJbPug=="
}
},
"is_incremental": false,
@@ -81,7 +81,7 @@
"output": {
".html": {
"relative_path": "docs/dependency-injection/container-locator.html",
- "hash": "RwgBieJrwRegOj2vrsbk9A=="
+ "hash": "GnrEYgZXHmWXNSl7NAysaw=="
}
},
"is_incremental": false,
@@ -93,7 +93,7 @@
"output": {
".html": {
"relative_path": "docs/dependency-injection/index.html",
- "hash": "0DO1S5+eG0pT4Ex3rtu9AA=="
+ "hash": "Cv9MrkXEBflvSmz3yqjOWQ=="
}
},
"is_incremental": false,
@@ -105,7 +105,7 @@
"output": {
".html": {
"relative_path": "docs/dependency-injection/platform-specific-services.html",
- "hash": "o5Juy6/GbDBXqq+MJHw6AQ=="
+ "hash": "F1AB3pRSvdCaKDEtrJY1oA=="
}
},
"is_incremental": false,
@@ -117,7 +117,7 @@
"output": {
".html": {
"relative_path": "docs/dependency-injection/registering-types.html",
- "hash": "Czh/QjaAPRgKXEMeYClS3w=="
+ "hash": "0nqzTcpP6bJ2HVjUKSIUTg=="
}
},
"is_incremental": false,
@@ -129,7 +129,7 @@
"output": {
".html": {
"relative_path": "docs/dependency-injection/resolution-errors.html",
- "hash": "cSe5xu5qoeOL4k8WRnv0ZA=="
+ "hash": "UJYpf46HQM4CEzD+rP6+Mw=="
}
},
"is_incremental": false,
@@ -141,7 +141,7 @@
"output": {
".html": {
"relative_path": "docs/dependency-injection/servicecollection-supplement.html",
- "hash": "57wfV92NlkuUDBP27/SHjw=="
+ "hash": "fQGVJ1HjJd84PLEhMM/uzg=="
}
},
"is_incremental": false,
@@ -153,7 +153,7 @@
"output": {
".html": {
"relative_path": "docs/dialogs/dialog-aware.html",
- "hash": "4eqbWziLwb0FRYBrWIDQiA=="
+ "hash": "YXS8Wm94GCsU9GgQC2o1ag=="
}
},
"is_incremental": false,
@@ -165,7 +165,7 @@
"output": {
".html": {
"relative_path": "docs/dialogs/dialog-window.html",
- "hash": "gwBGjIee7VFjyggTaBHnPQ=="
+ "hash": "YTbunHrEHrLgDiKTcDaowQ=="
}
},
"is_incremental": false,
@@ -177,7 +177,7 @@
"output": {
".html": {
"relative_path": "docs/dialogs/index.html",
- "hash": "UEMEFI1hpcZ9VwWe2AmkqQ=="
+ "hash": "qIIuqwAk7BpaKvANUoC5MQ=="
}
},
"is_incremental": false,
@@ -189,7 +189,7 @@
"output": {
".html": {
"relative_path": "docs/event-aggregator.html",
- "hash": "uxs1+UK80/gg2hx6oBnSCw=="
+ "hash": "PQFrvbTg5SHc7YvqP+4KfQ=="
}
},
"is_incremental": false,
@@ -441,6 +441,17 @@
"is_incremental": false,
"version": ""
},
+ {
+ "type": "Resource",
+ "source_relative_path": "docs/images/circle_green_checkmark.png",
+ "output": {
+ "resource": {
+ "relative_path": "docs/images/circle_green_checkmark.png"
+ }
+ },
+ "is_incremental": false,
+ "version": ""
+ },
{
"type": "Resource",
"source_relative_path": "docs/images/composite-commands-1.png",
@@ -463,6 +474,17 @@
"is_incremental": false,
"version": ""
},
+ {
+ "type": "Resource",
+ "source_relative_path": "docs/images/cross_red_circle.png",
+ "output": {
+ "resource": {
+ "relative_path": "docs/images/cross_red_circle.png"
+ }
+ },
+ "is_incremental": false,
+ "version": ""
+ },
{
"type": "Resource",
"source_relative_path": "docs/images/demodialog-small.png",
@@ -502,7 +524,7 @@
"output": {
".html": {
"relative_path": "docs/index.html",
- "hash": "QfadBHlguo/9quv17AAOBw=="
+ "hash": "fOKUR8c0P8CoApvhxvrs+g=="
}
},
"is_incremental": false,
@@ -514,7 +536,7 @@
"output": {
".html": {
"relative_path": "docs/magician/index.html",
- "hash": "7YIPsOBq0U22PFpLwd05VQ=="
+ "hash": "nDoki/0y5fZpxVTQy+uQJQ=="
}
},
"is_incremental": false,
@@ -526,7 +548,7 @@
"output": {
".html": {
"relative_path": "docs/modularity/index.html",
- "hash": "KhqG5aAcORfpKkj+iKwcHw=="
+ "hash": "KdotqWLLbHwYoxgZPoceVQ=="
}
},
"is_incremental": false,
@@ -538,7 +560,7 @@
"output": {
".html": {
"relative_path": "docs/modularity/module-catalog.html",
- "hash": "oP3l+sJddB3cTqGvVNyexg=="
+ "hash": "dGR10QtK6GvFAHU2qG5kZg=="
}
},
"is_incremental": false,
@@ -550,7 +572,7 @@
"output": {
".html": {
"relative_path": "docs/modularity/module-initialization.html",
- "hash": "jLu3Vi2dFXpQxRA/kAE5uA=="
+ "hash": "7ya0slL2Ufw4VY++YQHslQ=="
}
},
"is_incremental": false,
@@ -562,7 +584,7 @@
"output": {
".html": {
"relative_path": "docs/mvvm/bindablebase.html",
- "hash": "OzJz2hAaZTrk5LIBTQYc7g=="
+ "hash": "q8XKJsimWB5rUolS/c2/ew=="
}
},
"is_incremental": false,
@@ -574,7 +596,19 @@
"output": {
".html": {
"relative_path": "docs/mvvm/viewmodel-locator.html",
- "hash": "NYHKyDdfnaQibG2JESASsQ=="
+ "hash": "H62eqYGYtKwvGa5B7LqRbQ=="
+ }
+ },
+ "is_incremental": false,
+ "version": ""
+ },
+ {
+ "type": "Conceptual",
+ "source_relative_path": "docs/navigation/index.md",
+ "output": {
+ ".html": {
+ "relative_path": "docs/navigation/index.html",
+ "hash": "a0gkzbhE3rnJbNcVROGXSg=="
}
},
"is_incremental": false,
@@ -586,7 +620,7 @@
"output": {
".html": {
"relative_path": "docs/navigation/navigation-parameters.html",
- "hash": "cQcU6OvkLBiTSgoiSfcrYQ=="
+ "hash": "+ut3BFVwJtCn3BMtyAOb4w=="
}
},
"is_incremental": false,
@@ -598,7 +632,7 @@
"output": {
".html": {
"relative_path": "docs/navigation/page-navigation.html",
- "hash": "2HfvD1ioPATNGLxhNR1yUw=="
+ "hash": "EhkFyg2YCIfP0RHuc2NAOQ=="
}
},
"is_incremental": false,
@@ -610,7 +644,7 @@
"output": {
".html": {
"relative_path": "docs/navigation/regions/basic-region-navigation.html",
- "hash": "OC1M4cDNfP+siLLVcknxFw=="
+ "hash": "uYxowrX2mpJwvZ8RnE/PaQ=="
}
},
"is_incremental": false,
@@ -622,7 +656,7 @@
"output": {
".html": {
"relative_path": "docs/navigation/regions/confirming-navigation.html",
- "hash": "/wzJJ7sEOVG+DUI2G51Paw=="
+ "hash": "U8Jy1q9CRZm0tcRfxjd1sw=="
}
},
"is_incremental": false,
@@ -634,7 +668,7 @@
"output": {
".html": {
"relative_path": "docs/navigation/regions/controlling-view-lifetime.html",
- "hash": "NFsZALfKV2B9qklalewhhQ=="
+ "hash": "P2IwS632q/UzFd18r466Hw=="
}
},
"is_incremental": false,
@@ -646,7 +680,7 @@
"output": {
".html": {
"relative_path": "docs/navigation/regions/index.html",
- "hash": "kq4gvZcnDdqwUdYTCAx0Vg=="
+ "hash": "wmaqkvc9Pn7G3UktOIgGow=="
}
},
"is_incremental": false,
@@ -658,7 +692,7 @@
"output": {
".html": {
"relative_path": "docs/navigation/regions/navigation-existing-views.html",
- "hash": "PLNz0ZyaUCzjAsoDG/Ub/A=="
+ "hash": "bLrUCtTiM9UbBv88IpApPQ=="
}
},
"is_incremental": false,
@@ -670,7 +704,7 @@
"output": {
".html": {
"relative_path": "docs/navigation/regions/navigation-journal.html",
- "hash": "U5TfhAAYZ/jlFjFdfe4BSQ=="
+ "hash": "C4XD/IvPADrB8nZWh5t3iQ=="
}
},
"is_incremental": false,
@@ -682,7 +716,7 @@
"output": {
".html": {
"relative_path": "docs/navigation/regions/passing-parameters.html",
- "hash": "vwwvcA9SKgnRxtzVpjNkDw=="
+ "hash": "QjBs5KiXc/OqxFk8dEbCSw=="
}
},
"is_incremental": false,
@@ -694,7 +728,7 @@
"output": {
".html": {
"relative_path": "docs/navigation/regions/region-adapters.html",
- "hash": "/iugtit18SA2wv3lLv/QBg=="
+ "hash": "o7++OHsTFDBuqg5fBN/7RA=="
}
},
"is_incremental": false,
@@ -706,7 +740,7 @@
"output": {
".html": {
"relative_path": "docs/navigation/regions/region-behaviors.html",
- "hash": "QOlJCmWLcwjwxgaRi94odQ=="
+ "hash": "ar18vmA24oYUcqGey1PBKg=="
}
},
"is_incremental": false,
@@ -718,7 +752,7 @@
"output": {
".html": {
"relative_path": "docs/navigation/regions/region-manager.html",
- "hash": "rr3fGc2560BJ3hlQyUxD9w=="
+ "hash": "JfSbBm/cSSv7Zl+aGsSDlA=="
}
},
"is_incremental": false,
@@ -730,7 +764,7 @@
"output": {
".html": {
"relative_path": "docs/navigation/regions/view-viewmodel-participation.html",
- "hash": "9S65+1m0LDQkz8YbEb1d3Q=="
+ "hash": "1A8yGTPhnLEEbWEh8EeDRw=="
}
},
"is_incremental": false,
@@ -742,7 +776,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/maui/appbuilder.html",
- "hash": "Q5wsZ7s6SijZ7g5R/cmSmA=="
+ "hash": "KQL8pkSGPLQ4hXdjv/Cibw=="
}
},
"is_incremental": false,
@@ -754,7 +788,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/maui/appmodel/pagelifecycleaware.html",
- "hash": "bg/FhfT6BsiEndOtKMaWWQ=="
+ "hash": "2bjQgT0lD/gmCh7uzfsr9g=="
}
},
"is_incremental": false,
@@ -766,7 +800,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/maui/behaviors/behaviorbase.html",
- "hash": "NCn/nro62bESUeRvlGN8Yw=="
+ "hash": "kjjRe3RyuYoJNcDYmSmGJA=="
}
},
"is_incremental": false,
@@ -778,7 +812,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/maui/behaviors/eventtocommandbehavior.html",
- "hash": "HkclG2P22iyHn3HMYR5YkA=="
+ "hash": "/YRzoR+Fhs6kchexi2XO9g=="
}
},
"is_incremental": false,
@@ -790,7 +824,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/maui/behaviors/index.html",
- "hash": "7Snbaqdj8CInj7xKkehaKA=="
+ "hash": "fnVhunWEEbW9qa/adFaLkw=="
}
},
"is_incremental": false,
@@ -802,7 +836,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/maui/behaviors/pagebehaviorfactory.html",
- "hash": "O7zpmtEaKMu6md4W/sLISQ=="
+ "hash": "/fmPu94tmgYMVivhqkPQOg=="
}
},
"is_incremental": false,
@@ -814,7 +848,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/maui/dialogs/index.html",
- "hash": "26RNDRFX1irNs1tNtbCCWg=="
+ "hash": "noTAQ+TH5X1+IKIR2/OKHg=="
}
},
"is_incremental": false,
@@ -826,7 +860,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/maui/dialogs/pagedialogs.html",
- "hash": "n1xpheDwtxGbHdr4JoDmZA=="
+ "hash": "AGrZEUVG9yS+aZo9NY4b3w=="
}
},
"is_incremental": false,
@@ -882,7 +916,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/maui/index.html",
- "hash": "888aLwGtx53ApD9oTkwkWA=="
+ "hash": "qUpmov2G+8XWIlwmmM0mZg=="
}
},
"is_incremental": false,
@@ -894,7 +928,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/maui/migrating.html",
- "hash": "1pCvYygLMV65faXAgjmdpg=="
+ "hash": "C4RqhDSmPVXHeeGvPMEqPA=="
}
},
"is_incremental": false,
@@ -906,7 +940,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/maui/navigation/global-navigation-observer.html",
- "hash": "H9kf6uZQ0vZ2BqGyA2c0qw=="
+ "hash": "HKNCTKkCa3NPX9o4yleldQ=="
}
},
"is_incremental": false,
@@ -918,7 +952,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/maui/navigation/index.html",
- "hash": "EZxqSKeCbYFnFsfFgTVrCw=="
+ "hash": "V8jYbONW2OedyUMjl+JWUg=="
}
},
"is_incremental": false,
@@ -930,7 +964,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/maui/navigation/navigation-builder.html",
- "hash": "+aNRjO6C/IVQ5rkOjRJspw=="
+ "hash": "UzINW6NoOGcWHrAvFN/8VA=="
}
},
"is_incremental": false,
@@ -942,7 +976,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/maui/navigation/navigation-exceptions.html",
- "hash": "8PqUxga356bmDu92nW/9Wg=="
+ "hash": "4QZ19tLc0f/zEVKLaFqG+Q=="
}
},
"is_incremental": false,
@@ -954,7 +988,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/maui/navigation/navigation-result.html",
- "hash": "o8UdDGAoWp3qk9n+4MIqLw=="
+ "hash": "E6XhZdfG09PnCPkP0gv4Tw=="
}
},
"is_incremental": false,
@@ -966,7 +1000,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/maui/navigation/page-navigation.html",
- "hash": "oQM0P/EBDowHU6nPphHelw=="
+ "hash": "9X8ACyKWluZyT8gtB9ZTfA=="
}
},
"is_incremental": false,
@@ -978,7 +1012,19 @@
"output": {
".html": {
"relative_path": "docs/platforms/maui/navigation/prismnavigationpage.html",
- "hash": "o5xwktkn0F6Ru9CXGwFiSg=="
+ "hash": "IVdslTeutMAhFWp5ANlpmg=="
+ }
+ },
+ "is_incremental": false,
+ "version": ""
+ },
+ {
+ "type": "Conceptual",
+ "source_relative_path": "docs/platforms/maui/navigation/tabbed-navigation.md",
+ "output": {
+ ".html": {
+ "relative_path": "docs/platforms/maui/navigation/tabbed-navigation.html",
+ "hash": "Wc6q21sL8VmT+f4vVuQLdw=="
}
},
"is_incremental": false,
@@ -990,7 +1036,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/maui/navigation/xaml-navigation.html",
- "hash": "wqdyEAnkfsiKoz9RDcEskg=="
+ "hash": "TnazlVuSyKsx4zySnEWyRg=="
}
},
"is_incremental": false,
@@ -1002,7 +1048,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/uno/extensions.html",
- "hash": "YzQnrxF86IBk8OsRRKkVlA=="
+ "hash": "xvg1qXf/EoZaWbbMx9eEQQ=="
}
},
"is_incremental": false,
@@ -1014,7 +1060,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/uno/index.html",
- "hash": "BCfJLhF1/j1pd66uR0aLmQ=="
+ "hash": "1oloffurHOatLV1f9R0rHg=="
}
},
"is_incremental": false,
@@ -1026,7 +1072,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/wpf/dialog-service.html",
- "hash": "MXC2eeIhuaA47+WnsUgymA=="
+ "hash": "3C/qj0jHw1ynCn2IfSRr9w=="
}
},
"is_incremental": false,
@@ -1038,7 +1084,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/wpf/getting-started.html",
- "hash": "IQcIrt257Jhk6F/6qGe40Q=="
+ "hash": "LNBLliHb77sSUcswSQpYPg=="
}
},
"is_incremental": false,
@@ -1248,7 +1294,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/wpf/interactivity/event-to-command.html",
- "hash": "jcYjnrw9s3mnMaKx3SJ/bw=="
+ "hash": "nOe6YsYauUvPPir4u3tYUg=="
}
},
"is_incremental": false,
@@ -1260,7 +1306,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/wpf/introduction.html",
- "hash": "sMCT0Ef8ZGSL+X1gifL+bQ=="
+ "hash": "O6IixwbugQIIm0cXNa8rsA=="
}
},
"is_incremental": false,
@@ -1272,7 +1318,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/wpf/view-composition.html",
- "hash": "uhLcVtMIqe5d7xn2AB4tpA=="
+ "hash": "0x4jXEeyaCXNkYAq5tqzsw=="
}
},
"is_incremental": false,
@@ -1284,7 +1330,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/xamarin-forms/Dependency-Service.html",
- "hash": "Lz2POaOfcgKlkf5rx5vKdw=="
+ "hash": "5zGweA7e0evqVXG8tKMjtg=="
}
},
"is_incremental": false,
@@ -1296,7 +1342,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/xamarin-forms/Getting-Started.html",
- "hash": "xMzEWL1pKyaTJjiBFaJihw=="
+ "hash": "degIWKjyivD6DmNS/aUClA=="
}
},
"is_incremental": false,
@@ -1308,7 +1354,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/xamarin-forms/application-lifecycle.html",
- "hash": "HGjqMNLOAU5sElFrMCOAgQ=="
+ "hash": "mCumazbEhuDPHcriwGwV9A=="
}
},
"is_incremental": false,
@@ -1320,7 +1366,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/xamarin-forms/behaviors/eventtocommandbehavior.html",
- "hash": "ILCTscC0auftLqUjGZnenw=="
+ "hash": "xKpIu9RzENxA/6inwjEEmQ=="
}
},
"is_incremental": false,
@@ -1332,7 +1378,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/xamarin-forms/behaviors/index.html",
- "hash": "ef1Sbj7b0DeqAIVXye3xJQ=="
+ "hash": "73KJBXsAQJfIyXAO9jmhfw=="
}
},
"is_incremental": false,
@@ -1344,7 +1390,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/xamarin-forms/behaviors/page-behavior-factory.html",
- "hash": "D1sOIqU55QIvKbx1Pd6qRg=="
+ "hash": "z/bysyg39MpPNKSWht7/1g=="
}
},
"is_incremental": false,
@@ -1356,7 +1402,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/xamarin-forms/converting-an-existing-app.html",
- "hash": "Nix7PaaUbma4fYKQrxe8AA=="
+ "hash": "vK26xo8WfTMnII9gJSv7bA=="
}
},
"is_incremental": false,
@@ -1368,7 +1414,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/xamarin-forms/creating-your-first-prism-app.html",
- "hash": "8zzZFVbd3mijiaVDHEj7rw=="
+ "hash": "c9yivmmyUYW/Z1Dmt5TRjQ=="
}
},
"is_incremental": false,
@@ -1380,7 +1426,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/xamarin-forms/dialogs/dialog-service.html",
- "hash": "ZVN/XfpXY+Djt/24IHeiiw=="
+ "hash": "bd4AbbWkFyNpjBp/CyxcIQ=="
}
},
"is_incremental": false,
@@ -1392,7 +1438,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/xamarin-forms/dialogs/index.html",
- "hash": "ozA37LYmYtIvmXm+s5QGQg=="
+ "hash": "pMdClC1rINODCMS+7w/oxA=="
}
},
"is_incremental": false,
@@ -1404,7 +1450,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/xamarin-forms/dialogs/page-dialog-service.html",
- "hash": "pcop10p4TvHXmB5ypCUERg=="
+ "hash": "NRii8mlUMFmBroEzCIOsmw=="
}
},
"is_incremental": false,
@@ -1419,7 +1465,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/xamarin-forms/dialogs/styling-dialogs.html",
- "hash": "FILyqcfN7TIuty0HXz++Ww=="
+ "hash": "8EsmOC/iYT1ZvDTOe5mJ1w=="
}
},
"is_incremental": false,
@@ -1563,7 +1609,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/xamarin-forms/navigation/confirming-navigation.html",
- "hash": "D/Sc3rtdACE52uEC7VMrgw=="
+ "hash": "G26inbv0Wb19I4R3ej6ULw=="
}
},
"is_incremental": false,
@@ -1575,7 +1621,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/xamarin-forms/navigation/deep-linking.html",
- "hash": "HGbSBrsLkg6Sl8wGV2fcLQ=="
+ "hash": "fxjsu2Cp6ccG5VYJgK8pug=="
}
},
"is_incremental": false,
@@ -1587,7 +1633,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/xamarin-forms/navigation/initialization.html",
- "hash": "HOdayfHEhq1fuqA+3R1PGg=="
+ "hash": "+8LKkzoHZhD/rfnQXObyTA=="
}
},
"is_incremental": false,
@@ -1599,7 +1645,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/xamarin-forms/navigation/navigation-basics.html",
- "hash": "LW940Ht4IgkHQUqvk21CbQ=="
+ "hash": "2+B03yNMCkddH4UN6XdheA=="
}
},
"is_incremental": false,
@@ -1611,7 +1657,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/xamarin-forms/navigation/passing-parameters.html",
- "hash": "ILwvbtTEBqwjvKQ/AhpX1Q=="
+ "hash": "W/eYJH347f3zf2mj9TqozA=="
}
},
"is_incremental": false,
@@ -1623,7 +1669,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/xamarin-forms/navigation/working-with-masterdetailpages.html",
- "hash": "HfSwloZg6xRrO0QNDtHHIA=="
+ "hash": "EPs6m45m5Vv7+XYtVrqEEQ=="
}
},
"is_incremental": false,
@@ -1635,7 +1681,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/xamarin-forms/navigation/working-with-navigationpages.html",
- "hash": "6bZPYzOspS8oBfYaO3tW7w=="
+ "hash": "uTvDQQt2GKIzbRO5QNKj+g=="
}
},
"is_incremental": false,
@@ -1647,7 +1693,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/xamarin-forms/navigation/working-with-tabbedpages.html",
- "hash": "q/o6x42D5GcQqW1xeNc09w=="
+ "hash": "yWzPpc3xyOgT6ZLyX+K/Ng=="
}
},
"is_incremental": false,
@@ -1659,7 +1705,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/xamarin-forms/navigation/xaml-navigation.html",
- "hash": "Ux3Om6N5tob5kYMGHK1kiA=="
+ "hash": "pJzyx+Aw6QrpTxz5bzTFZw=="
}
},
"is_incremental": false,
@@ -1671,7 +1717,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/xamarin-forms/page-lifecycle.html",
- "hash": "U6uQ8Lq07ju9+fkYVU1MNg=="
+ "hash": "JMZJ3is8Hr21Rraui3rs0g=="
}
},
"is_incremental": false,
@@ -1683,7 +1729,7 @@
"output": {
".html": {
"relative_path": "docs/platforms/xamarin-forms/platform-reference/gtk.html",
- "hash": "3wS0fFG7wXiw0H10L0RN1w=="
+ "hash": "TmIoI+ZqH0kSIXKO/0XH1w=="
}
},
"is_incremental": false,
@@ -1739,7 +1785,7 @@
"output": {
".html": {
"relative_path": "docs/plugins/essentials/appcontext.html",
- "hash": "9ZGgRmS1fuVmtxOpRuv2Yg=="
+ "hash": "R9e/qsiW4eq2o+HX9CWFew=="
}
},
"is_incremental": false,
@@ -1751,7 +1797,7 @@
"output": {
".html": {
"relative_path": "docs/plugins/essentials/connectivity.html",
- "hash": "srihu/LTSBwAWck3GlVlqQ=="
+ "hash": "+XpC/JKO3GNvTxfdOxDIsQ=="
}
},
"is_incremental": false,
@@ -1763,7 +1809,7 @@
"output": {
".html": {
"relative_path": "docs/plugins/essentials/filesystem.html",
- "hash": "LIidUF7LFcxyYSubKeouFA=="
+ "hash": "O0YwHYdcKhQrKcXdF0HMlg=="
}
},
"is_incremental": false,
@@ -1775,7 +1821,7 @@
"output": {
".html": {
"relative_path": "docs/plugins/essentials/index.html",
- "hash": "DMdfhtUtVZUxpA+vcxUwfA=="
+ "hash": "bsk5le0N7EziBjksAUexiQ=="
}
},
"is_incremental": false,
@@ -1787,7 +1833,22 @@
"output": {
".html": {
"relative_path": "docs/plugins/essentials/mainthread.html",
- "hash": "s7SfVLtiMTiYARwLi0yOVg=="
+ "hash": "ZLT/sQazSpamX2VmuDD+Eg=="
+ }
+ },
+ "is_incremental": false,
+ "version": ""
+ },
+ {
+ "log_codes": [
+ "DuplicateUids"
+ ],
+ "type": "Conceptual",
+ "source_relative_path": "docs/plugins/essentials/permissions.md",
+ "output": {
+ ".html": {
+ "relative_path": "docs/plugins/essentials/permissions.html",
+ "hash": "jX06u3RsnZQPc3ocUbcC3g=="
}
},
"is_incremental": false,
@@ -1799,7 +1860,58 @@
"output": {
".html": {
"relative_path": "docs/plugins/essentials/stores.html",
- "hash": "AycMrw2Za+NpVWKfavOFbg=="
+ "hash": "8AnV2d5+3qHEUt4VG0sg3A=="
+ }
+ },
+ "is_incremental": false,
+ "version": ""
+ },
+ {
+ "type": "Conceptual",
+ "source_relative_path": "docs/plugins/logging/gelf.md",
+ "output": {
+ ".html": {
+ "relative_path": "docs/plugins/logging/gelf.html",
+ "hash": "kSslgOSIt0NKKFn9IBtVIA=="
+ }
+ },
+ "is_incremental": false,
+ "version": ""
+ },
+ {
+ "log_codes": [
+ "UidNotFound"
+ ],
+ "type": "Conceptual",
+ "source_relative_path": "docs/plugins/logging/index.md",
+ "output": {
+ ".html": {
+ "relative_path": "docs/plugins/logging/index.html",
+ "hash": "8cVx36Z2HYvWVq9mA5iHSg=="
+ }
+ },
+ "is_incremental": false,
+ "version": ""
+ },
+ {
+ "type": "Conceptual",
+ "source_relative_path": "docs/plugins/logging/microsoft.md",
+ "output": {
+ ".html": {
+ "relative_path": "docs/plugins/logging/microsoft.html",
+ "hash": "mrUqkNwtBmC/f+rH6yIfng=="
+ }
+ },
+ "is_incremental": false,
+ "version": ""
+ },
+ {
+ "type": "Conceptual",
+ "source_relative_path": "docs/plugins/logging/testing.md",
+ "output": {
+ ".html": {
+ "relative_path": "docs/plugins/logging/testing.html",
+ "hash": "iSfjwG4zTb1hRHIiDYU43w=="
}
},
"is_incremental": false,
@@ -1811,7 +1923,7 @@
"output": {
".html": {
"relative_path": "docs/plugins/popups.html",
- "hash": "cmc3ifzCV35zBe3mAmOxTQ=="
+ "hash": "kgNVytKRuqCiKkWNzRIY0g=="
}
},
"is_incremental": false,
@@ -1898,7 +2010,7 @@
"ConceptualDocumentProcessor": {
"can_incremental": false,
"incrementalPhase": "build",
- "total_file_count": 95,
+ "total_file_count": 102,
"skipped_file_count": 0
},
"ResourceDocumentProcessor": {
diff --git a/xrefmap.yml b/xrefmap.yml
index 68929f1..b7f5ce4 100644
--- a/xrefmap.yml
+++ b/xrefmap.yml
@@ -70,6 +70,9 @@ references:
- uid: Mvvm.ViewModelLocator
name: Using the ViewModelLocator
href: docs/mvvm/viewmodel-locator.html
+- uid: Navigation.Home
+ name: Navigation
+ href: docs/navigation/index.html
- uid: Navigation.INavigationParameters
name: INavigationParameters
href: docs/navigation/navigation-parameters.html
@@ -154,6 +157,9 @@ references:
- uid: Platforms.Maui.Navigation.PrismNavigationPage
name: PrismNavigationPage
href: docs/platforms/maui/navigation/prismnavigationpage.html
+- uid: Platforms.Maui.Navigation.TabbedNavigation
+ name: TabbedPages
+ href: docs/platforms/maui/navigation/tabbed-navigation.html
- uid: Platforms.Maui.Navigation.XamlNavigation
name: XAML Navigation
href: docs/platforms/maui/navigation/xaml-navigation.html
@@ -217,6 +223,12 @@ references:
- uid: Plugins.Essentials.Stores
name: Stores
href: docs/plugins/essentials/stores.html
+- uid: Plugins.Logging.Gelf
+ name: Logging with Graylog (GELF)
+ href: docs/plugins/logging/gelf.html
+- uid: Plugins.Logging.Testing
+ name: Prism.Plugin.Logging.Testing
+ href: docs/plugins/logging/testing.html
- uid: Plugins.Popups
name: Getting Started
href: docs/plugins/popups.html