Get ContentControl navigation working

This commit is contained in:
TheXamlGuy
2024-02-11 18:09:22 +00:00
parent 565c6866d8
commit 812556f8b0
133 changed files with 335 additions and 195 deletions
+12 -5
View File
@@ -21,7 +21,7 @@ public partial class App :
base.OnLaunched(args);
IHost? host = new HostBuilder()
.UseContentRoot(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
.UseContentRoot(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
Assembly.GetEntryAssembly()?.GetName().Name!), true)
.ConfigureAppConfiguration(config =>
{
@@ -36,18 +36,24 @@ public partial class App :
services.AddHostedService<AppService>();
services.AddSingleton<IDispatcher>(new Dispatcher(DispatcherQueue.GetForCurrentThread()));
services.AddSingleton((IDispatcher)new Dispatcher(DispatcherQueue.GetForCurrentThread()));
services.AddTransient<IViewModelTemplate, ViewModelTemplate>();
services.AddTransient<IViewModelTemplateDescriptorProvider, ViewModelTemplateDescriptorProvider>();
services.AddTransient<INavigationProvider, NavigationProvider>();
services.AddSingleton<NavigationTargetCollection>();
services.AddTransient<INavigationTargetProvider, NavigationTargetProvider>();
services.AddTransient<IViewModelContentBinder, ViewModelContentBinder>();
services.AddTransient<IViewModelTemplateSelector, ViewModelTemplateSelector>();
services.AddTransient<IViewModelTemplateProvider, ViewModelTemplateProvider>();
services.AddHandler<AppConfigurationChangedHandler>();
services.AddConfiguration<AppConfiguration>(args =>
services.AddConfiguration((AppConfiguration args) =>
{
args.Placement = DesktopApplicationBarPlacemenet.Top;
});
services.AddNavigationHandler<WindowHandler>();
services.AddNavigationHandler<ContentControlHandler>();
services.AddSingleton<DesktopApplicationBar>();
services.AddContentTemplate<ApplicationBarViewModel, ApplicationBarView>();
@@ -59,6 +65,7 @@ public partial class App :
services.AddContentTemplate<GeneralSettingsNavigationViewModel, GeneralSettingsNavigationView>();
services.AddContentTemplate<WidgetSettingsNavigationViewModel, WidgetSettingsNavigationView>();
services.AddContentTemplate<WidgetSettingsViewModel, WidgetSettingsView>("WidgetSettings");
services.AddTransient<IInitializer, AppInitializer>();
})
+1 -1
View File
@@ -17,7 +17,7 @@
</UserControl.Resources>
<ItemsControl
Margin="6,0,6,0"
ItemTemplateSelector="{Binding Template}"
ItemTemplateSelector="{Binding ViewModelTemplateSelector}"
ItemsSource="{x:Bind ViewModel, Mode=OneWay}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
+3 -3
View File
@@ -7,18 +7,18 @@ namespace Hyperbar.Widget;
public partial class ApplicationBarViewModel :
ObservableCollectionViewModel<IDisposable>
{
public ApplicationBarViewModel(IViewModelTemplate template,
public ApplicationBarViewModel(IViewModelTemplateSelector viewModelTemplateSelector,
IServiceProvider serviceProvider,
IServiceFactory serviceFactory,
IPublisher publisher,
ISubscriber subscriber,
IDisposer disposer) : base(serviceProvider, serviceFactory, publisher, subscriber, disposer)
{
Template = template;
ViewModelTemplateSelector = viewModelTemplateSelector;
Add<PrimaryViewModel>(0);
Add<SecondaryViewModel>(1);
}
public IViewModelTemplate Template { get; }
public IViewModelTemplateSelector ViewModelTemplateSelector { get; }
}
@@ -6,6 +6,4 @@ public class GeneralSettingsNavigationViewModel(IServiceProvider serviceProvider
ISubscriber subscriber,
IDisposer disposer,
string text) :
NavigationViewModel(serviceProvider, serviceFactory, publisher, subscriber, disposer, text)
{
}
NavigationViewModel(serviceProvider, serviceFactory, publisher, subscriber, disposer, text);
+6
View File
@@ -21,6 +21,7 @@
<None Remove="SettingsButtonView.xaml" />
<None Remove="SettingsView.xaml" />
<None Remove="WidgetSettingsNavigationView.xaml" />
<None Remove="WidgetSettingsView.xaml" />
</ItemGroup>
<ItemGroup>
<Content Include="Assets\SplashScreen.scale-200.png" />
@@ -57,6 +58,11 @@
<ProjectReference Include="..\Hyperbar.Widget\Hyperbar.Widget.csproj" />
<ProjectReference Include="..\Hyperbar\Hyperbar.csproj" />
</ItemGroup>
<ItemGroup>
<Page Update="WidgetSettingsView.xaml">
<Generator>MSBuild:Compile</Generator>
</Page>
</ItemGroup>
<ItemGroup>
<Page Update="GeneralSettingsNavigationView.xaml">
<Generator>MSBuild:Compile</Generator>
+2 -3
View File
@@ -2,11 +2,10 @@
<UserControl
x:Class="Hyperbar.Windows.PrimaryView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ui="using:Hyperbar.UI.Windows">
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ItemsControl
HorizontalAlignment="Center"
ItemTemplateSelector="{Binding Template}"
ItemTemplateSelector="{Binding ViewModelTemplateSelector}"
ItemsSource="{x:Bind ViewModel}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
+2 -2
View File
@@ -4,7 +4,7 @@ using Hyperbar.UI.Windows;
namespace Hyperbar.Widget;
[NotificationHandler(nameof(IWidgetHostViewModel))]
public partial class PrimaryViewModel(IViewModelTemplate template,
public partial class PrimaryViewModel(IViewModelTemplateSelector viewModelTemplateSelector,
IServiceProvider serviceProvider,
IServiceFactory serviceFactory,
IPublisher publisher,
@@ -17,6 +17,6 @@ public partial class PrimaryViewModel(IViewModelTemplate template,
[ObservableProperty]
private int index = index;
public IViewModelTemplate Template => template;
public IViewModelTemplateSelector ViewModelTemplateSelector => viewModelTemplateSelector;
}
+2 -3
View File
@@ -2,10 +2,9 @@
<UserControl
x:Class="Hyperbar.Windows.SecondaryView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ui="using:Hyperbar.UI.Windows">
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<ItemsControl ItemTemplateSelector="{Binding Template}" ItemsSource="{x:Bind ViewModel, Mode=OneWay}">
<ItemsControl ItemTemplateSelector="{Binding ViewModelTemplateSelector}" ItemsSource="{x:Bind ViewModel, Mode=OneWay}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<ItemsStackPanel Orientation="Horizontal" />
+3 -3
View File
@@ -10,7 +10,7 @@ public partial class SecondaryViewModel :
[ObservableProperty]
private int index;
public SecondaryViewModel(IViewModelTemplate template,
public SecondaryViewModel(IViewModelTemplateSelector viewModelTemplateSelector,
IServiceProvider serviceProvider,
IServiceFactory serviceFactory,
IPublisher publisher,
@@ -18,12 +18,12 @@ public partial class SecondaryViewModel :
IDisposer disposer,
int index) : base(serviceProvider, serviceFactory, publisher, subscriber, disposer)
{
Template = template;
ViewModelTemplateSelector = viewModelTemplateSelector;
this.index = index;
Add<SettingsButtonViewModel>();
}
public IViewModelTemplate Template { get; }
public IViewModelTemplateSelector ViewModelTemplateSelector { get; }
}
+1 -1
View File
@@ -26,7 +26,7 @@
FontSize="16">
<interactivity:Interaction.Behaviors>
<interactions:EventTriggerBehavior EventName="Click">
<windows:NavigateAction Path="Settings" />
<windows:NavigateAction Name="Settings" />
</interactions:EventTriggerBehavior>
</interactivity:Interaction.Behaviors>
</Button>
+2 -2
View File
@@ -2,12 +2,12 @@
namespace Hyperbar.Windows;
public partial class SettingsButtonViewModel(IViewModelTemplate template,
public partial class SettingsButtonViewModel(IViewModelTemplateSelector viewModelTemplateSelector,
IServiceProvider serviceProvider,
IServiceFactory serviceFactory,
IPublisher publisher,
IDisposer disposer) :
ObservableViewModel(serviceProvider, serviceFactory, publisher, disposer)
{
public IViewModelTemplate Template => template;
public IViewModelTemplateSelector ViewModelTemplateSelector => viewModelTemplateSelector;
}
+2 -1
View File
@@ -7,9 +7,10 @@
<MicaBackdrop />
</Window.SystemBackdrop>
<NavigationView
x:Name="Settings"
IsBackButtonVisible="Collapsed"
IsPaneToggleButtonVisible="False"
IsSettingsVisible="False"
MenuItemTemplateSelector="{Binding Template}"
MenuItemTemplateSelector="{Binding ViewModelTemplateSelector}"
MenuItemsSource="{x:Bind ViewModel, Mode=OneWay}" />
</Window>
+1
View File
@@ -4,6 +4,7 @@ using Microsoft.UI.Xaml;
namespace Hyperbar.Windows;
[NavigationTarget("Settings")]
public partial class SettingsView :
Window
{
+3 -3
View File
@@ -5,18 +5,18 @@ namespace Hyperbar.Windows;
public partial class SettingsViewModel :
ObservableCollectionViewModel<INavigationViewModel>
{
public SettingsViewModel(IViewModelTemplate template,
public SettingsViewModel(IViewModelTemplateSelector viewModelTemplateSelector,
IServiceProvider serviceProvider,
IServiceFactory serviceFactory,
IPublisher publisher,
ISubscriber subscriber,
IDisposer disposer) : base(serviceProvider, serviceFactory, publisher, subscriber, disposer)
{
Template = template;
ViewModelTemplateSelector = viewModelTemplateSelector;
Add<GeneralSettingsNavigationViewModel>("General");
Add<WidgetSettingsNavigationViewModel>("Widgets");
}
public IViewModelTemplate Template { get; }
public IViewModelTemplateSelector ViewModelTemplateSelector { get; }
}
@@ -9,7 +9,7 @@
Content="Widgets">
<interactivity:Interaction.Behaviors>
<interactions:EventTriggerBehavior EventName="Tapped">
<ui:NavigateAction />
<ui:NavigateAction Name="WidgetSettings" TargetName="Settings" />
</interactions:EventTriggerBehavior>
</interactivity:Interaction.Behaviors>
</NavigationViewItem>
@@ -6,7 +6,4 @@ public class WidgetSettingsNavigationViewModel(IServiceProvider serviceProvider,
ISubscriber subscriber,
IDisposer disposer,
string text) :
NavigationViewModel<WidgetNavigationViewModel>(serviceProvider, serviceFactory, publisher, subscriber, disposer, text)
{
}
NavigationViewModel<WidgetNavigationViewModel>(serviceProvider, serviceFactory, publisher, subscriber, disposer, text);
+9
View File
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8" ?>
<UserControl
x:Class="Hyperbar.Windows.WidgetSettingsView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<Button>Test</Button>
</Grid>
</UserControl>
@@ -0,0 +1,12 @@
using Microsoft.UI.Xaml.Controls;
namespace Hyperbar.Windows;
public partial class WidgetSettingsView : UserControl
{
public WidgetSettingsView() =>
InitializeComponent();
protected WidgetSettingsViewModel ViewModel =>
(WidgetSettingsViewModel)DataContext;
}
@@ -0,0 +1,19 @@
using Hyperbar.UI.Windows;
namespace Hyperbar.Windows;
public class WidgetSettingsViewModel :
ObservableCollectionViewModel<INavigationViewModel>
{
public WidgetSettingsViewModel(IViewModelTemplateSelector viewModelTemplateSelector,
IServiceProvider serviceProvider,
IServiceFactory serviceFactory,
IPublisher publisher,
ISubscriber subscriber,
IDisposer disposer) : base(serviceProvider, serviceFactory, publisher, subscriber, disposer)
{
ViewModelTemplateSelector = viewModelTemplateSelector;
}
public IViewModelTemplateSelector ViewModelTemplateSelector { get; }
}