Fix navigation issue

Applied some syntax style
This commit is contained in:
Geoffroy BONNEVILLE
2021-06-15 10:16:58 +02:00
parent 77b5927d46
commit 5387f1c5a1
4 changed files with 85 additions and 48 deletions

View File

@@ -85,7 +85,7 @@ namespace ModernKeePass.Views.BasePages
/// <summary> /// <summary>
/// Preserves state associated with this page in case the application is suspended or the /// Preserves state associated with this page in case the application is suspended or the
/// page is discarded from the navigation cache. Values must conform to the serialization /// page is discarded from the navigation cache. Values must conform to the serialization
/// requirements of <see cref="Common.SuspensionManager.SessionState"/>. /// requirements of <see cref="SuspensionManager.SessionState"/>.
/// </summary> /// </summary>
/// <param name="sender">The source of the event; typically <see cref="Common.NavigationHelper"/></param> /// <param name="sender">The source of the event; typically <see cref="Common.NavigationHelper"/></param>
/// <param name="e">Event data that provides an empty dictionary to be populated with /// <param name="e">Event data that provides an empty dictionary to be populated with

View File

@@ -13,38 +13,50 @@ namespace ModernKeePass.Views
/// </summary> /// </summary>
public sealed partial class MainPage public sealed partial class MainPage
{ {
public new MainVm Model => (MainVm)DataContext; public new MainVm Model => (MainVm) DataContext;
public MainPage() public MainPage()
{ {
InitializeComponent(); InitializeComponent();
ListView = MenuListView; ListView = MenuListView;
ListViewSource = MenuItemsSource; ListViewSource = MenuItemsSource;
} }
private new void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e) private new void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{ {
base.ListView_SelectionChanged(sender, e); base.ListView_SelectionChanged(sender, e);
var selectedItem = Model.SelectedItem as MainMenuItemVm; var selectedItem = Model.SelectedItem as MainMenuItemVm;
if (selectedItem == null) MenuFrame.Navigate(typeof(WelcomePage)); if (selectedItem == null)
else selectedItem.Destination.Navigate(selectedItem.PageType, selectedItem.Parameter); {
MenuFrame.Navigate(typeof(WelcomePage));
}
else
{
selectedItem.Destination.Navigate(selectedItem.PageType, selectedItem.Parameter);
}
} }
protected override async void OnNavigatedTo(NavigationEventArgs e) protected override async void OnNavigatedTo(NavigationEventArgs e)
{ {
base.OnNavigatedTo(e); base.OnNavigatedTo(e);
FileInfo file; FileInfo file;
if (e.NavigationMode == NavigationMode.Back) if (e.NavigationMode == NavigationMode.Back)
{
file = null; file = null;
}
else else
{
file = e.Parameter as FileInfo; file = e.Parameter as FileInfo;
}
await Model.Initialize(Frame, MenuFrame, file); await Model.Initialize(Frame, MenuFrame, file);
} }
protected override void OnNavigatedFrom(NavigationEventArgs e) protected override void OnNavigatedFrom(NavigationEventArgs e)
{ {
Model.Cleanup(); Model.Cleanup();
base.OnNavigatedFrom(e);
} }
} }
} }

View File

@@ -120,15 +120,10 @@ namespace ModernKeePass.Common
/// </summary> /// </summary>
public RelayCommand GoBackCommand public RelayCommand GoBackCommand
{ {
get get { return _goBackCommand ?? (_goBackCommand = new RelayCommand(GoBack, CanGoBack)); }
{ set { _goBackCommand = value; }
return _goBackCommand ?? (_goBackCommand = new RelayCommand(GoBack, CanGoBack));
}
set
{
_goBackCommand = value;
}
} }
/// <summary> /// <summary>
/// <see cref="RelayCommand"/> used for navigating to the most recent item in /// <see cref="RelayCommand"/> used for navigating to the most recent item in
/// the forward navigation history, if a Frame manages its own navigation history. /// the forward navigation history, if a Frame manages its own navigation history.
@@ -150,6 +145,7 @@ namespace ModernKeePass.Common
{ {
return Frame != null && Frame.CanGoBack; return Frame != null && Frame.CanGoBack;
} }
/// <summary> /// <summary>
/// Virtual method used by the <see cref="GoForwardCommand"/> property /// Virtual method used by the <see cref="GoForwardCommand"/> property
/// to determine if the <see cref="Frame"/> can go forward. /// to determine if the <see cref="Frame"/> can go forward.
@@ -169,15 +165,22 @@ namespace ModernKeePass.Common
/// </summary> /// </summary>
public virtual void GoBack() public virtual void GoBack()
{ {
if (Frame != null && Frame.CanGoBack) Frame.GoBack(); if (Frame != null && Frame.CanGoBack)
{
Frame.GoBack();
}
} }
/// <summary> /// <summary>
/// Virtual method used by the <see cref="GoForwardCommand"/> property /// Virtual method used by the <see cref="GoForwardCommand"/> property
/// to invoke the <see cref="Windows.UI.Xaml.Controls.Frame.GoForward"/> method. /// to invoke the <see cref="Windows.UI.Xaml.Controls.Frame.GoForward"/> method.
/// </summary> /// </summary>
public virtual void GoForward() public virtual void GoForward()
{ {
if (Frame != null && Frame.CanGoForward) Frame.GoForward(); if (Frame != null && Frame.CanGoForward)
{
Frame.GoForward();
}
} }
#if WINDOWS_PHONE_APP #if WINDOWS_PHONE_APP
@@ -203,16 +206,16 @@ namespace ModernKeePass.Common
/// <param name="sender">Instance that triggered the event.</param> /// <param name="sender">Instance that triggered the event.</param>
/// <param name="e">Event data describing the conditions that led to the event.</param> /// <param name="e">Event data describing the conditions that led to the event.</param>
private void CoreDispatcher_AcceleratorKeyActivated(CoreDispatcher sender, private void CoreDispatcher_AcceleratorKeyActivated(CoreDispatcher sender,
AcceleratorKeyEventArgs e) AcceleratorKeyEventArgs e)
{ {
var virtualKey = e.VirtualKey; var virtualKey = e.VirtualKey;
// Only investigate further when Left, Right, or the dedicated Previous or Next keys // Only investigate further when Left, Right, or the dedicated Previous or Next keys
// are pressed // are pressed
if ((e.EventType == CoreAcceleratorKeyEventType.SystemKeyDown || if ((e.EventType == CoreAcceleratorKeyEventType.SystemKeyDown ||
e.EventType == CoreAcceleratorKeyEventType.KeyDown) && e.EventType == CoreAcceleratorKeyEventType.KeyDown) &&
(virtualKey == VirtualKey.Left || virtualKey == VirtualKey.Right || (virtualKey == VirtualKey.Left || virtualKey == VirtualKey.Right ||
(int)virtualKey == 166 || (int)virtualKey == 167)) (int) virtualKey == 166 || (int) virtualKey == 167))
{ {
var coreWindow = Window.Current.CoreWindow; var coreWindow = Window.Current.CoreWindow;
const CoreVirtualKeyStates downState = CoreVirtualKeyStates.Down; const CoreVirtualKeyStates downState = CoreVirtualKeyStates.Down;
@@ -222,15 +225,15 @@ namespace ModernKeePass.Common
var noModifiers = !menuKey && !controlKey && !shiftKey; var noModifiers = !menuKey && !controlKey && !shiftKey;
var onlyAlt = menuKey && !controlKey && !shiftKey; var onlyAlt = menuKey && !controlKey && !shiftKey;
if ((int)virtualKey == 166 && noModifiers || if ((int) virtualKey == 166 && noModifiers ||
virtualKey == VirtualKey.Left && onlyAlt) virtualKey == VirtualKey.Left && onlyAlt)
{ {
// When the previous key or Alt+Left are pressed navigate back // When the previous key or Alt+Left are pressed navigate back
e.Handled = true; e.Handled = true;
GoBackCommand.Execute(null); GoBackCommand.Execute(null);
} }
else if ((int)virtualKey == 167 && noModifiers || else if ((int) virtualKey == 167 && noModifiers ||
virtualKey == VirtualKey.Right && onlyAlt) virtualKey == VirtualKey.Right && onlyAlt)
{ {
// When the next key or Alt+Right are pressed navigate forward // When the next key or Alt+Right are pressed navigate forward
e.Handled = true; e.Handled = true;
@@ -247,22 +250,32 @@ namespace ModernKeePass.Common
/// <param name="sender">Instance that triggered the event.</param> /// <param name="sender">Instance that triggered the event.</param>
/// <param name="e">Event data describing the conditions that led to the event.</param> /// <param name="e">Event data describing the conditions that led to the event.</param>
private void CoreWindow_PointerPressed(CoreWindow sender, private void CoreWindow_PointerPressed(CoreWindow sender,
PointerEventArgs e) PointerEventArgs e)
{ {
var properties = e.CurrentPoint.Properties; var properties = e.CurrentPoint.Properties;
// Ignore button chords with the left, right, and middle buttons // Ignore button chords with the left, right, and middle buttons
if (properties.IsLeftButtonPressed || properties.IsRightButtonPressed || if (properties.IsLeftButtonPressed || properties.IsRightButtonPressed ||
properties.IsMiddleButtonPressed) return; properties.IsMiddleButtonPressed)
{
return;
}
// If back or forward are pressed (but not both) navigate appropriately // If back or forward are pressed (but not both) navigate appropriately
var backPressed = properties.IsXButton1Pressed; var backPressed = properties.IsXButton1Pressed;
var forwardPressed = properties.IsXButton2Pressed; var forwardPressed = properties.IsXButton2Pressed;
if (backPressed ^ forwardPressed) if (backPressed ^ forwardPressed)
{ {
e.Handled = true; e.Handled = true;
if (backPressed) GoBackCommand.Execute(null); if (backPressed)
if (forwardPressed) GoForwardCommand.Execute(null); {
GoBackCommand.Execute(null);
}
if (forwardPressed)
{
GoForwardCommand.Execute(null);
}
} }
} }
#endif #endif
@@ -279,6 +292,7 @@ namespace ModernKeePass.Common
/// state provided when recreating a page from a prior session. /// state provided when recreating a page from a prior session.
/// </summary> /// </summary>
public event LoadStateEventHandler LoadState; public event LoadStateEventHandler LoadState;
/// <summary> /// <summary>
/// Register this event on the current page to preserve /// Register this event on the current page to preserve
/// state associated with the current page in case the /// state associated with the current page in case the
@@ -303,7 +317,7 @@ namespace ModernKeePass.Common
{ {
// Clear existing state for forward navigation when adding a new page to the // Clear existing state for forward navigation when adding a new page to the
// navigation stack // navigation stack
var nextPageKey = _pageKey; var nextPageKey = _pageKey;
var nextPageIndex = Frame.BackStackDepth; var nextPageIndex = Frame.BackStackDepth;
while (frameState.Remove(nextPageKey)) while (frameState.Remove(nextPageKey))
{ {
@@ -319,7 +333,7 @@ namespace ModernKeePass.Common
// Pass the navigation parameter and preserved page state to the page, using // Pass the navigation parameter and preserved page state to the page, using
// the same strategy for loading suspended state and recreating pages discarded // the same strategy for loading suspended state and recreating pages discarded
// from cache // from cache
LoadState?.Invoke(this, new LoadStateEventArgs(e.Parameter, (Dictionary<string, object>)frameState[_pageKey])); LoadState?.Invoke(this, new LoadStateEventArgs(e.Parameter, (Dictionary<string, object>) frameState[_pageKey]));
} }
} }
@@ -333,7 +347,7 @@ namespace ModernKeePass.Common
public void OnNavigatedFrom(NavigationEventArgs e) public void OnNavigatedFrom(NavigationEventArgs e)
{ {
var frameState = SuspensionManager.SessionStateForFrame(Frame); var frameState = SuspensionManager.SessionStateForFrame(Frame);
var pageState = new Dictionary<string, object>(); var pageState = new Dictionary<string, object>();
SaveState?.Invoke(this, new SaveStateEventArgs(pageState)); SaveState?.Invoke(this, new SaveStateEventArgs(pageState));
frameState[_pageKey] = pageState; frameState[_pageKey] = pageState;
} }
@@ -345,6 +359,7 @@ namespace ModernKeePass.Common
/// Represents the method that will handle the <see cref="NavigationHelper.LoadState"/>event /// Represents the method that will handle the <see cref="NavigationHelper.LoadState"/>event
/// </summary> /// </summary>
public delegate void LoadStateEventHandler(object sender, LoadStateEventArgs e); public delegate void LoadStateEventHandler(object sender, LoadStateEventArgs e);
/// <summary> /// <summary>
/// Represents the method that will handle the <see cref="NavigationHelper.SaveState"/>event /// Represents the method that will handle the <see cref="NavigationHelper.SaveState"/>event
/// </summary> /// </summary>
@@ -360,6 +375,7 @@ namespace ModernKeePass.Common
/// when this page was initially requested. /// when this page was initially requested.
/// </summary> /// </summary>
public object NavigationParameter { get; private set; } public object NavigationParameter { get; private set; }
/// <summary> /// <summary>
/// A dictionary of state preserved by this page during an earlier /// A dictionary of state preserved by this page during an earlier
/// session. This will be null the first time a page is visited. /// session. This will be null the first time a page is visited.
@@ -380,9 +396,10 @@ namespace ModernKeePass.Common
public LoadStateEventArgs(object navigationParameter, Dictionary<string, object> pageState) public LoadStateEventArgs(object navigationParameter, Dictionary<string, object> pageState)
{ {
NavigationParameter = navigationParameter; NavigationParameter = navigationParameter;
PageState = pageState; PageState = pageState;
} }
} }
/// <summary> /// <summary>
/// Class used to hold the event data required when a page attempts to save state. /// Class used to hold the event data required when a page attempts to save state.
/// </summary> /// </summary>

View File

@@ -15,35 +15,39 @@ namespace ModernKeePass.ViewModels
public class BreadcrumbControlVm public class BreadcrumbControlVm
{ {
public ObservableCollection<BreadcrumbItem> BreadcrumbItems { get; } public ObservableCollection<BreadcrumbItem> BreadcrumbItems { get; }
public string ParentGroupName { get; private set; } public string ParentGroupName { get; private set; }
public Icon ParentGroupIcon { get; private set; } = Icon.Folder; public Icon ParentGroupIcon { get; private set; } = Icon.Folder;
public RelayCommand GoBackCommand { get; } public RelayCommand GoBackCommand { get; }
public RelayCommand GoUpCommand { get; private set; } public RelayCommand GoUpCommand { get; private set; }
public RelayCommand<int> GoToCommand { get; } public RelayCommand<int> GoToCommand { get; }
private readonly IMediator _mediator; private readonly IMediator _mediator;
private readonly INavigationService _navigation; private readonly INavigationService _navigation;
public BreadcrumbControlVm(IMediator mediator, INavigationService navigation) public BreadcrumbControlVm(IMediator mediator, INavigationService navigation)
{ {
_mediator = mediator; _mediator = mediator;
_navigation = navigation; _navigation = navigation;
BreadcrumbItems = new ObservableCollection<BreadcrumbItem>(); BreadcrumbItems = new ObservableCollection<BreadcrumbItem>();
GoBackCommand = new RelayCommand(() => _navigation.GoBack()); GoBackCommand = new RelayCommand(() => _navigation.GoBack());
GoToCommand = new RelayCommand<int>(GoTo); GoToCommand = new RelayCommand<int>(GoTo);
GoUpCommand = new RelayCommand(() => GoTo(BreadcrumbItems.Count - 1), () => !string.IsNullOrEmpty(ParentGroupName)); GoUpCommand = new RelayCommand(() => GoTo(BreadcrumbItems.Count - 1), () => !string.IsNullOrEmpty(ParentGroupName));
} }
public async Task Initialize(GroupVm group) public async Task Initialize(GroupVm group)
{ {
if (group == null) return; if (group == null)
{
return;
}
GoBackCommand.RaiseCanExecuteChanged(); GoBackCommand.RaiseCanExecuteChanged();
ParentGroupName = group.Title; ParentGroupName = group.Title;
ParentGroupIcon = group.Icon; ParentGroupIcon = group.Icon;
BreadcrumbItems.Add(new BreadcrumbItem { Path = group.Id, Name = group.Title, Icon = group.Icon }); BreadcrumbItems.Add(new BreadcrumbItem {Path = group.Id, Name = group.Title, Icon = group.Icon});
var parentGroup = group; var parentGroup = group;
while (!string.IsNullOrEmpty(parentGroup.ParentGroupId)) while (!string.IsNullOrEmpty(parentGroup.ParentGroupId))
{ {
@@ -54,9 +58,13 @@ namespace ModernKeePass.ViewModels
private void GoTo(int index) private void GoTo(int index)
{ {
if (BreadcrumbItems.Count == 0) return; if (BreadcrumbItems.Count == 0)
{
return;
}
var breadcrumb = BreadcrumbItems[index]; var breadcrumb = BreadcrumbItems[index];
_navigation.NavigateTo(Constants.Navigation.GroupPage, new NavigationItem { Id = breadcrumb.Path }); _navigation.NavigateTo(Constants.Navigation.GroupPage, new NavigationItem {Id = breadcrumb.Path});
} }
} }
} }