Attempt to fix a bunch of navigation issues
This commit is contained in:
@@ -18,18 +18,15 @@ public class FrameHandler :
|
|||||||
frame.NavigationPageFactory ??= new NavigationPageFactory();
|
frame.NavigationPageFactory ??= new NavigationPageFactory();
|
||||||
if (args.Template is Control control)
|
if (args.Template is Control control)
|
||||||
{
|
{
|
||||||
void NavigatingFrom(object? sender,
|
void NavigatingFrom(Control sender)
|
||||||
Control control)
|
|
||||||
{
|
{
|
||||||
async void HandleNavigatingFrom(object? _,
|
async void HandleNavigatingFrom(object? _,
|
||||||
NavigatingCancelEventArgs args)
|
NavigatingCancelEventArgs args)
|
||||||
{
|
{
|
||||||
Dictionary<string, object> results = [];
|
sender.RemoveHandler(Frame.NavigatingFromEvent, HandleNavigatingFrom);
|
||||||
|
NavigatedFrom(sender);
|
||||||
|
|
||||||
control.RemoveHandler(Frame.NavigatingFromEvent, HandleNavigatingFrom);
|
if (sender.DataContext is object content)
|
||||||
NavigatedFrom(sender, control, () => results);
|
|
||||||
|
|
||||||
if (control.DataContext is object content)
|
|
||||||
{
|
{
|
||||||
if (content is IConfirmation confirmation &&
|
if (content is IConfirmation confirmation &&
|
||||||
!await confirmation.Confirm())
|
!await confirmation.Confirm())
|
||||||
@@ -47,68 +44,41 @@ public class FrameHandler :
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
control.AddHandler(Frame.NavigatingFromEvent, HandleNavigatingFrom);
|
sender.AddHandler(Frame.NavigatingFromEvent, HandleNavigatingFrom);
|
||||||
}
|
}
|
||||||
|
|
||||||
void NavigatedFrom(object? sender,
|
void NavigatedFrom(Control sender)
|
||||||
Control control,
|
|
||||||
Func<Dictionary<string, object>> resultCallBack)
|
|
||||||
{
|
{
|
||||||
async void HandleNavigatedFrom(object? _,
|
async void HandleNavigatedFrom(object? _,
|
||||||
NavigationEventArgs args)
|
NavigationEventArgs args)
|
||||||
{
|
{
|
||||||
control.RemoveHandler(Frame.NavigatedFromEvent, HandleNavigatedFrom);
|
sender.RemoveHandler(Frame.NavigatedFromEvent, HandleNavigatedFrom);
|
||||||
if (args.NavigationMode == NavigationMode.New)
|
if (sender.DataContext is object content)
|
||||||
{
|
{
|
||||||
NavigatedTo(sender, control);
|
if (content is IDeactivated deactivated)
|
||||||
}
|
|
||||||
|
|
||||||
Dictionary<string, object> results = resultCallBack.Invoke();
|
|
||||||
async Task DoNavigatedFromAsync(object? content)
|
|
||||||
{
|
|
||||||
if (content is not null)
|
|
||||||
{
|
{
|
||||||
if (content is IDeactivated deactivated)
|
await deactivated.OnDeactivated();
|
||||||
{
|
|
||||||
await deactivated.OnDeactivated();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (args.Source is TemplatedControl sourceTemplate)
|
if (content is IDisposable disposable)
|
||||||
{
|
|
||||||
if (sourceTemplate.DataContext is object content)
|
|
||||||
{
|
{
|
||||||
await DoNavigatedFromAsync(content);
|
disposable.Dispose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sender is TemplatedControl senderTemplate)
|
|
||||||
{
|
|
||||||
if (senderTemplate.DataContext is object content)
|
|
||||||
{
|
|
||||||
await DoNavigatedFromAsync(content);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
await DoNavigatedFromAsync(sender);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
control.AddHandler(Frame.NavigatedFromEvent, HandleNavigatedFrom);
|
sender.AddHandler(Frame.NavigatedFromEvent, HandleNavigatedFrom);
|
||||||
}
|
}
|
||||||
|
|
||||||
void NavigatedTo(object? sender,
|
void NavigatedTo(Control sender)
|
||||||
Control control)
|
|
||||||
{
|
{
|
||||||
async void HandleNavigatedTo(object? _,
|
async void HandleNavigatedTo(object? _,
|
||||||
NavigationEventArgs __)
|
NavigationEventArgs __)
|
||||||
{
|
{
|
||||||
control.RemoveHandler(Frame.NavigatedToEvent, HandleNavigatedTo);
|
sender.RemoveHandler(Frame.NavigatedToEvent, HandleNavigatedTo);
|
||||||
NavigatingFrom(sender, control);
|
NavigatingFrom(sender);
|
||||||
|
|
||||||
if (control.DataContext is object content)
|
if (sender.DataContext is object content)
|
||||||
{
|
{
|
||||||
if (content is IInitializer initializer)
|
if (content is IInitializer initializer)
|
||||||
{
|
{
|
||||||
@@ -122,11 +92,11 @@ public class FrameHandler :
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
control.AddHandler(Frame.NavigatedToEvent, HandleNavigatedTo);
|
sender.AddHandler(Frame.NavigatedToEvent, HandleNavigatedTo);
|
||||||
}
|
}
|
||||||
|
|
||||||
control.DataContext = args.Content;
|
control.DataContext = args.Content;
|
||||||
NavigatedTo(args.Sender, control);
|
NavigatedTo(control);
|
||||||
frame.NavigateFromObject(control, new FrameNavigationOptions { TransitionInfoOverride = new SuppressNavigationTransitionInfo() });
|
frame.NavigateFromObject(control, new FrameNavigationOptions { TransitionInfoOverride = new SuppressNavigationTransitionInfo() });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -319,10 +319,8 @@ public partial class ObservableCollection<TItem> :
|
|||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task Handle(SelectionEventArgs<TItem> args)
|
public Task Handle(SelectionEventArgs<TItem> args) =>
|
||||||
{
|
Task.CompletedTask;
|
||||||
return Task.CompletedTask;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int IndexOf(TItem item) =>
|
public int IndexOf(TItem item) =>
|
||||||
collection.IndexOf(item);
|
collection.IndexOf(item);
|
||||||
@@ -513,6 +511,17 @@ public partial class ObservableCollection<TItem> :
|
|||||||
added.Selected = true;
|
added.Selected = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
partial void OnSelectedItemChanged(TItem? oldValue, TItem? newValue)
|
||||||
|
{
|
||||||
|
if (SelectedItem is not null && !SelectedItem.Equals(oldValue))
|
||||||
|
{
|
||||||
|
if (oldValue is ISelectable selectable)
|
||||||
|
{
|
||||||
|
selectable.Selected = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public partial class ObservableCollection<TValue, TViewModel>(IServiceProvider provider,
|
public partial class ObservableCollection<TValue, TViewModel>(IServiceProvider provider,
|
||||||
|
|||||||
Reference in New Issue
Block a user