This commit is contained in:
TheXamlGuy
2024-02-14 22:54:22 +00:00
parent 9fe2317c4f
commit cc61842c9a
23 changed files with 138 additions and 93 deletions
@@ -8,9 +8,9 @@
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<None Remove="WidgetConfigurationNavigationView.xaml" />
<None Remove="WidgetConfigurationView.xaml" />
<None Remove="WidgetNavigationView.xaml" />
<None Remove="WidgetSettingsNavigationView.xaml" />
<None Remove="WidgetSettingsView.xaml" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.WindowsAppSDK" Version="1.5.240124002-experimental2" />
@@ -24,7 +24,7 @@
<ProjectReference Include="..\Hyperbar\Hyperbar.csproj" />
</ItemGroup>
<ItemGroup>
<Page Update="WidgetSettingsNavigationView.xaml">
<Page Update="WidgetConfigurationNavigationView.xaml">
<XamlRuntime>$(DefaultXamlRuntime)</XamlRuntime>
<SubType>Designer</SubType>
</Page>
@@ -32,7 +32,7 @@
<XamlRuntime>$(DefaultXamlRuntime)</XamlRuntime>
<SubType>Designer</SubType>
</Page>
<Page Update="WidgetSettingsView.xaml">
<Page Update="WidgetConfigurationView.xaml">
<XamlRuntime>$(DefaultXamlRuntime)</XamlRuntime>
<SubType>Designer</SubType>
</Page>
@@ -36,8 +36,8 @@ public static class IServiceCollectionExtensions
services.AddContentTemplate<WidgetButtonViewModel, WidgetButtonView>();
services.AddContentTemplate<WidgetSplitButtonViewModel, WidgetSplitButtonView>();
services.AddContentTemplate<WidgetSettingsNavigationViewModel, WidgetSettingsNavigationView>();
services.AddContentTemplate<WidgetSettingsViewModel, WidgetSettingsView>("WidgetSettings");
services.AddContentTemplate<WidgetConfigurationNavigationViewModel, WidgetConfigurationNavigationView>();
services.AddContentTemplate<WidgetConfigurationViewModel, WidgetConfigurationView>("WidgetSettings");
})));
return services;
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<NavigationViewItem
x:Class="Hyperbar.Widget.Windows.WidgetSettingsNavigationView"
x:Class="Hyperbar.Widget.Windows.WidgetConfigurationNavigationView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:interactions="using:Microsoft.Xaml.Interactions.Core"
@@ -2,9 +2,9 @@ using Microsoft.UI.Xaml.Controls;
namespace Hyperbar.Widget.Windows;
public sealed partial class WidgetSettingsNavigationView :
public sealed partial class WidgetConfigurationNavigationView :
NavigationViewItem
{
public WidgetSettingsNavigationView() =>
public WidgetConfigurationNavigationView() =>
InitializeComponent();
}
@@ -1,6 +1,6 @@
namespace Hyperbar.Widget.Windows;
public class WidgetSettingsNavigationViewModel(IServiceProvider serviceProvider,
public class WidgetConfigurationNavigationViewModel(IServiceProvider serviceProvider,
IServiceFactory serviceFactory,
IPublisher publisher,
ISubscriber subscriber,
@@ -2,19 +2,19 @@
namespace Hyperbar.Widget.Windows;
public class WidgetSettingsNavigationViewModelEnumerator(IPublisher publisher,
public class WidgetConfigurationNavigationViewModelEnumerator(IPublisher publisher,
IWidgetHostCollection widgetHosts) :
INotificationHandler<Enumerate<WidgetSettingsNavigationViewModel>>
INotificationHandler<Enumerate<WidgetConfigurationNavigationViewModel>>
{
public async Task Handle(Enumerate<WidgetSettingsNavigationViewModel> args,
public async Task Handle(Enumerate<WidgetConfigurationNavigationViewModel> args,
CancellationToken cancellationToken = default)
{
foreach (IWidgetHost host in widgetHosts)
{
if (host.Services.GetService<IServiceFactory>() is IServiceFactory serviceFactory)
{
await publisher.PublishAsync(new Create<WidgetSettingsNavigationViewModel>(serviceFactory
.Create<WidgetSettingsNavigationViewModel>(host.Configuration.Name)),
await publisher.PublishAsync(new Create<WidgetConfigurationNavigationViewModel>(serviceFactory
.Create<WidgetConfigurationNavigationViewModel>(host.Configuration.Name)),
nameof(WidgetNavigationViewModel), cancellationToken);
}
}
@@ -1,9 +1,7 @@
<?xml version="1.0" encoding="utf-8" ?>
<UserControl
x:Class="Hyperbar.Widget.Windows.WidgetSettingsView"
x:Class="Hyperbar.Widget.Windows.WidgetConfigurationView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<Button>Test</Button>
</Grid>
<ListBox ItemsSource="{Binding Mode=TwoWay}" />
</UserControl>
@@ -0,0 +1,12 @@
using Microsoft.UI.Xaml.Controls;
namespace Hyperbar.Widget.Windows;
public partial class WidgetConfigurationView : UserControl
{
public WidgetConfigurationView() =>
InitializeComponent();
protected WidgetConfigurationViewModel ViewModel =>
(WidgetConfigurationViewModel)DataContext;
}
@@ -0,0 +1,51 @@
using Hyperbar.UI.Windows;
namespace Hyperbar.Widget.Windows;
public class WidgetConfigurationViewModel<TConfiguration, TValue> :
ValueViewModel<TValue>,
INotificationHandler<Changed<TConfiguration>>
where TConfiguration :
class
{
private readonly Func<TConfiguration, TValue> valueFactory;
public WidgetConfigurationViewModel(IServiceProvider serviceProvider,
IServiceFactory serviceFactory,
IPublisher publisher,
IDisposer disposer,
Func<TConfiguration, TValue> valueFactory) : base(serviceProvider, serviceFactory, publisher, disposer)
{
this.valueFactory = valueFactory;
}
public Task Handle(Changed<TConfiguration> args,
CancellationToken cancellationToken = default)
{
if (args.Value is TConfiguration configuration)
{
valueFactory.Invoke(configuration);
}
return Task.CompletedTask;
}
}
public class WidgetConfigurationViewModel :
ObservableCollectionViewModel<IObservableViewModel>
{
public WidgetConfigurationViewModel(IViewModelTemplateSelector viewModelTemplateSelector,
IServiceProvider serviceProvider,
IServiceFactory serviceFactory,
IPublisher publisher,
ISubscriber subscriber,
IDisposer disposer) : base(serviceProvider, serviceFactory, publisher, subscriber, disposer)
{
ViewModelTemplateSelector = viewModelTemplateSelector;
Add<WidgetConfigurationViewModel<WidgetAvailability,
bool>>((Func<WidgetAvailability, bool>)(config => config.Value));
}
public IViewModelTemplateSelector ViewModelTemplateSelector { get; }
}
@@ -10,7 +10,7 @@ public class WidgetNavigationViewModel(IViewModelTemplateSelector viewModelTempl
ISubscriber subscriber,
IDisposer disposer,
string text) :
NavigationViewModel<WidgetSettingsNavigationViewModel>(serviceProvider, serviceFactory, publisher, subscriber, disposer, text)
NavigationViewModel<WidgetConfigurationNavigationViewModel>(serviceProvider, serviceFactory, publisher, subscriber, disposer, text)
{
public IViewModelTemplateSelector ViewModelTemplateSelector => viewModelTemplateSelector;
}
@@ -1,12 +0,0 @@
using Microsoft.UI.Xaml.Controls;
namespace Hyperbar.Widget.Windows;
public partial class WidgetSettingsView : UserControl
{
public WidgetSettingsView() =>
InitializeComponent();
protected WidgetSettingsViewModel ViewModel =>
(WidgetSettingsViewModel)DataContext;
}
@@ -1,14 +0,0 @@
using Hyperbar.UI.Windows;
namespace Hyperbar.Widget.Windows;
public class WidgetSettingsViewModel(IViewModelTemplateSelector viewModelTemplateSelector,
IServiceProvider serviceProvider,
IServiceFactory serviceFactory,
IPublisher publisher,
ISubscriber subscriber,
IDisposer disposer) :
ObservableCollectionViewModel<IObservableViewModel>(serviceProvider, serviceFactory, publisher, subscriber, disposer)
{
public IViewModelTemplateSelector ViewModelTemplateSelector => viewModelTemplateSelector;
}
+17 -19
View File
@@ -5,23 +5,21 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:interactions="using:Microsoft.Xaml.Interactions.Core"
xmlns:interactivity="using:Microsoft.Xaml.Interactivity">
<Grid>
<ItemsControl ItemTemplateSelector="{Binding ViewModelTemplateSelector}" ItemsSource="{Binding Mode=TwoWay}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" Spacing="8" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerTransitions>
<TransitionCollection>
<AddDeleteThemeTransition />
</TransitionCollection>
</ItemsControl.ItemContainerTransitions>
<interactivity:Interaction.Behaviors>
<interactions:EventTriggerBehavior EventName="Loaded">
<interactions:InvokeCommandAction Command="{Binding InitializeCommand}" />
</interactions:EventTriggerBehavior>
</interactivity:Interaction.Behaviors>
</ItemsControl>
</Grid>
<ItemsControl ItemTemplateSelector="{Binding ViewModelTemplateSelector}" ItemsSource="{Binding Mode=TwoWay}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" Spacing="8" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerTransitions>
<TransitionCollection>
<AddDeleteThemeTransition />
</TransitionCollection>
</ItemsControl.ItemContainerTransitions>
<interactivity:Interaction.Behaviors>
<interactions:EventTriggerBehavior EventName="Loaded">
<interactions:InvokeCommandAction Command="{Binding InitializeCommand}" />
</interactions:EventTriggerBehavior>
</interactivity:Interaction.Behaviors>
</ItemsControl>
</UserControl>