moer changes

This commit is contained in:
TheXamlGuy
2024-02-09 20:58:50 +00:00
parent 41d003f436
commit ecfac99868
39 changed files with 210 additions and 190 deletions
@@ -11,6 +11,7 @@
<ItemGroup>
<PackageReference Include="Microsoft.WindowsAppSDK" Version="1.5.240124002-experimental2" />
<PackageReference Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.26031-preview" />
<PackageReference Include="Microsoft.Xaml.Behaviors.WinUI.Managed" Version="2.0.9" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Hyperbar.Interop.Windows\Hyperbar.Interop.Windows.csproj" />
@@ -0,0 +1,6 @@
namespace Hyperbar.UI.Windows;
public interface IViewModelTemplate
{
}
+34
View File
@@ -0,0 +1,34 @@
using Microsoft.UI.Xaml;
using Microsoft.Xaml.Interactivity;
namespace Hyperbar.UI.Windows;
public sealed class NavigateAction :
DependencyObject,
IAction
{
public static readonly DependencyProperty PathProperty =
DependencyProperty.Register(nameof(Path),
typeof(string), typeof(NavigateAction),
new PropertyMetadata(null));
public string Path
{
get => (string)GetValue(PathProperty);
set => SetValue(PathProperty, value);
}
public object Execute(object sender, object parameter)
{
if (sender is FrameworkElement frameworkElement)
{
if (frameworkElement.DataContext is IObservableViewModel observableViewModel)
{
observableViewModel.Mediator.PublishAsync(new Navigate(Path))
.GetAwaiter().GetResult();
}
}
return true;
}
}
+32
View File
@@ -0,0 +1,32 @@
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Markup;
namespace Hyperbar.UI.Windows;
public class ViewModelTemplate(IViewModelTemplateDescriptorProvider descriptors) :
DataTemplateSelector,
IViewModelTemplate
{
protected override DataTemplate SelectTemplateCore(object item)
{
return descriptors.Get(item.GetType().Name) is IViewModelTemplateDescriptor descriptor
? CreateDataTemplate(descriptor)
: new DataTemplate();
}
protected override DataTemplate SelectTemplateCore(object item,
DependencyObject container) =>
SelectTemplateCore(item);
private DataTemplate CreateDataTemplate(IViewModelTemplateDescriptor descriptor)
{
string xamlString = @$"
<DataTemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
xmlns:ui=""using:{descriptor.TemplateType.Namespace}"">
<ui:{descriptor.TemplateType.Name} />
</DataTemplate>";
return (DataTemplate)XamlReader.Load(xamlString);
}
}
@@ -1,23 +0,0 @@
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
namespace Hyperbar.UI.Windows;
public class ViewModelTemplatePresenter :
ContentPresenter
{
public ViewModelTemplatePresenter()
{
DataContextChanged += OnDataContextChanged;
}
private void OnDataContextChanged(FrameworkElement sender,
DataContextChangedEventArgs args)
{
//if (DataContext is IViewModelTemplate templatedViewModel)
//{
// Content = templatedViewModel.TemplateFactory
// .Create(DataContext.GetType().Name);
//}
}
}
@@ -1,40 +0,0 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Markup;
namespace Hyperbar.UI.Windows;
public class ViewModelTemplate :
MarkupExtension
{
protected override object ProvideValue(IXamlServiceProvider serviceProvider) =>
new ViewModelTemplateSelector();
internal class ViewModelTemplateSelector :
DataTemplateSelector
{
protected override DataTemplate SelectTemplateCore(object item) =>
item is IObservableViewModel observableViewModel &&
observableViewModel.ServiceProvider.GetService<IViewModelTemplateDescriptorProvider>()
is ViewModelTemplateDescriptorProvider descriptors &&
descriptors.Get(item.GetType().Name) is IViewModelTemplateDescriptor descriptor
? CreateDataTemplate(descriptor)
: new DataTemplate();
protected override DataTemplate SelectTemplateCore(object item,
DependencyObject container) =>
SelectTemplateCore(item);
private DataTemplate CreateDataTemplate(IViewModelTemplateDescriptor descriptor)
{
string xamlString = @$"
<DataTemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
xmlns:ui=""using:{descriptor.TemplateType.Namespace}"">
<ui:{descriptor.TemplateType.Name} />
</DataTemplate>";
return (DataTemplate)XamlReader.Load(xamlString);
}
}
}
+24 -2
View File
@@ -1,7 +1,19 @@
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
namespace Hyperbar.UI.Windows;
public class FrameHandler :
INavigationHandler<Frame>
{
public Task Handle(Navigate<Frame> args,
CancellationToken cancellationToken = default)
{
return Task.CompletedTask;
}
}
public class WindowHandler :
INavigationHandler<Window>
{
@@ -10,9 +22,19 @@ public class WindowHandler :
{
if (args.Template is Window window)
{
if (window.Content is FrameworkElement frameworkElement)
if (window.Content is FrameworkElement content)
{
frameworkElement.DataContext = args.Content;
void HandleClosed(object sender, WindowEventArgs args)
{
window.Closed -= HandleClosed;
if (content.DataContext is IObservableViewModel observableViewModel)
{
observableViewModel.Dispose();
}
}
window.Closed += HandleClosed;
content.DataContext = args.Content;
}
window.Activate();