UI threading work

This commit is contained in:
TheXamlGuy
2024-01-13 13:47:26 +00:00
parent 70e0ae9492
commit 66f4bb8757
5 changed files with 35 additions and 5 deletions
+4 -1
View File
@@ -39,14 +39,17 @@ public partial class App :
services.AddSingleton<IDisposer, Disposer>(); services.AddSingleton<IDisposer, Disposer>();
services.AddHostedService<AppService>(); services.AddHostedService<AppService>();
services.AddConfiguration<AppConfiguration>();
services.AddTransient<IInitializer, AppInitializer>(); services.AddTransient<IInitializer, AppInitializer>();
services.AddTransient<ITemplateFactory, TemplateFactory>(); services.AddTransient<ITemplateFactory, TemplateFactory>();
services.AddTransient<DesktopFlyout>(); services.AddSingleton<DesktopFlyout>();
services.AddContentTemplate<WidgetBarViewModel, WidgetBarView>(); services.AddContentTemplate<WidgetBarViewModel, WidgetBarView>();
services.AddHandler<AppConfigurationChangedHandler>();
//services.AddWidgetProvider<MediaControllerWidgetProvider>(); //services.AddWidgetProvider<MediaControllerWidgetProvider>();
services.AddWidgetProvider<PrimaryWidgetProvider>(); services.AddWidgetProvider<PrimaryWidgetProvider>();
@@ -0,0 +1,8 @@
using Hyperbar.Windows.Controls;
namespace Hyperbar.Windows;
public class AppConfiguration
{
public DesktopFlyoutPlacement Placement { get; set; }
}
@@ -5,14 +5,15 @@ namespace Hyperbar.Windows;
public class AppInitializer([FromKeyedServices(nameof(WidgetBarViewModel))] WidgetBarView view, public class AppInitializer([FromKeyedServices(nameof(WidgetBarViewModel))] WidgetBarView view,
[FromKeyedServices(nameof(WidgetBarViewModel))] WidgetBarViewModel viewModel, [FromKeyedServices(nameof(WidgetBarViewModel))] WidgetBarViewModel viewModel,
DesktopFlyout desktopFlyout) : DesktopFlyout desktopFlyout,
AppConfiguration configuration) :
IInitializer IInitializer
{ {
public Task InitializeAsync() public Task InitializeAsync()
{ {
view.DataContext = viewModel; view.DataContext = viewModel;
desktopFlyout.Placement = DesktopFlyoutPlacement.Top; desktopFlyout.Placement = configuration.Placement;
desktopFlyout.Content = view; desktopFlyout.Content = view;
return Task.CompletedTask; return Task.CompletedTask;
@@ -0,0 +1,14 @@
using Hyperbar.Windows.Controls;
namespace Hyperbar.Windows.Primary;
public class AppConfigurationChangedHandler(DesktopFlyout desktopFlyout,
AppConfiguration configuration) :
INotificationHandler<ConfigurationChanged<AppConfiguration>>
{
public ValueTask Handle(ConfigurationChanged<AppConfiguration> notification, CancellationToken cancellationToken)
{
desktopFlyout.Placement = configuration.Placement;
return ValueTask.CompletedTask;
}
}
+6 -2
View File
@@ -6,9 +6,11 @@ namespace Hyperbar;
public class Mediator(IServiceProvider provider) : public class Mediator(IServiceProvider provider) :
IMediator IMediator
{ {
private readonly SynchronizationContext? context = SynchronizationContext.Current;
private readonly ConditionalWeakTable<Type, dynamic> subjects = []; private readonly ConditionalWeakTable<Type, dynamic> subjects = [];
public async ValueTask PublishAsync<TNotification>(TNotification notification, public ValueTask PublishAsync<TNotification>(TNotification notification,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
where TNotification : where TNotification :
INotification INotification
@@ -26,8 +28,10 @@ public class Mediator(IServiceProvider provider) :
foreach (INotificationHandler<TNotification> handler in handlers) foreach (INotificationHandler<TNotification> handler in handlers)
{ {
await handler.Handle(notification, cancellationToken); context?.Post(async state => await handler.Handle(notification, cancellationToken), null);
} }
return ValueTask.CompletedTask;
} }
public ValueTask<TResponse> SendAsync<TResponse>(IRequest<TResponse> request, public ValueTask<TResponse> SendAsync<TResponse>(IRequest<TResponse> request,