moer changes
This commit is contained in:
@@ -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
|
||||
{
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user