diff --git a/ModernKeePass/Controls/OpenDatabaseUserControl.xaml b/ModernKeePass/Controls/OpenDatabaseUserControl.xaml
index 6f36170..23f1941 100644
--- a/ModernKeePass/Controls/OpenDatabaseUserControl.xaml
+++ b/ModernKeePass/Controls/OpenDatabaseUserControl.xaml
@@ -7,14 +7,14 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="65"
- d:DesignWidth="400">
+ d:DesignWidth="335" Loaded="UserControl_Loaded">
-
+
-
-
+
diff --git a/ModernKeePass/Controls/OpenDatabaseUserControl.xaml.cs b/ModernKeePass/Controls/OpenDatabaseUserControl.xaml.cs
index 7442bce..ca1831b 100644
--- a/ModernKeePass/Controls/OpenDatabaseUserControl.xaml.cs
+++ b/ModernKeePass/Controls/OpenDatabaseUserControl.xaml.cs
@@ -1,5 +1,7 @@
using System;
+using System.Threading.Tasks;
using Windows.System;
+using Windows.UI.Core;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Input;
@@ -13,11 +15,10 @@ namespace ModernKeePass.Controls
public OpenDatabaseUserControl()
{
InitializeComponent();
- PasswordBox.Focus(FocusState.Programmatic);
}
- public delegate void PasswordCheckedEventHandler(object sender, EventArgs e);
public event PasswordCheckedEventHandler ValidationChecked;
+ public delegate void PasswordCheckedEventHandler(object sender, EventArgs e);
private void OpenButton_OnClick(object sender, RoutedEventArgs e)
{
@@ -30,5 +31,12 @@ namespace ModernKeePass.Controls
{
if (e.Key == VirtualKey.Enter) OpenButton_OnClick(null, null);
}
+
+ private void UserControl_Loaded(object sender, RoutedEventArgs e)
+ {
+ Task.Factory.StartNew(
+ () => Dispatcher.RunAsync(CoreDispatcherPriority.Low,
+ () => PasswordBox.Focus(FocusState.Programmatic)));
+ }
}
}
diff --git a/ModernKeePass/MainPage.xaml b/ModernKeePass/MainPage.xaml
index e791cf7..c562222 100644
--- a/ModernKeePass/MainPage.xaml
+++ b/ModernKeePass/MainPage.xaml
@@ -30,6 +30,7 @@
SelectionChanged="ListView_SelectionChanged"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
ItemsSource="{Binding Source={StaticResource MenuItemsSource}}"
+ SelectedItem="{Binding SelectedItem, Mode=TwoWay}"
IsSynchronizedWithCurrentItem="False">
diff --git a/ModernKeePass/MainPage.xaml.cs b/ModernKeePass/MainPage.xaml.cs
index 9908d5b..57409a1 100644
--- a/ModernKeePass/MainPage.xaml.cs
+++ b/ModernKeePass/MainPage.xaml.cs
@@ -1,10 +1,5 @@
-using System.Collections.ObjectModel;
-using System.Linq;
-using Windows.Storage.AccessCache;
-using Windows.UI.Xaml;
-using Windows.UI.Xaml.Controls;
+using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;
-using ModernKeePass.Pages;
using ModernKeePass.ViewModels;
// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238
@@ -24,38 +19,13 @@ namespace ModernKeePass
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
- var mainMenuItems = new ObservableCollection
- {
- new MainMenuItemVm {Title = "Open", PageType = typeof(OpenDatabasePage), Destination = MenuFrame, Parameter = Frame, SymbolIcon = Symbol.Page2},
- new MainMenuItemVm {Title = "New" /*, PageType = typeof(NewDatabasePage)*/, Destination = MenuFrame, SymbolIcon = Symbol.Add},
- new MainMenuItemVm {Title = "Save" , PageType = typeof(SaveDatabasePage), Destination = MenuFrame, Parameter = Frame, SymbolIcon = Symbol.Save},
- new MainMenuItemVm {Title = "Recent" , PageType = typeof(RecentDatabasesPage), Destination = MenuFrame, Parameter = Frame, SymbolIcon = Symbol.Copy}
- };
- var app = (App)Application.Current;
- if (app.Database != null && app.Database.IsOpen)
- mainMenuItems.Add(new MainMenuItemVm
- {
- Title = app.Database.Name,
- PageType = typeof(GroupDetailPage),
- Destination = Frame,
- Parameter = app.Database.RootGroup,
- Group = 1,
- SymbolIcon = Symbol.ProtectedDocument
- });
- var mainVm = DataContext as MainVm;
- mainVm.MainMenuItems = from item in mainMenuItems group item by item.Group into grp orderby grp.Key select grp;
- /*if (app.Database == null || !app.Database.IsOpen)
- {
- var mru = StorageApplicationPermissions.MostRecentlyUsedList;
- if (mru.Entries.Count > 0) MenuListView.SelectedIndex = 3;
- }*/
- //mainVm.NotifyPropertyChanged("MainMenuItems");
+ DataContext = new MainVm(Frame, MenuFrame);
}
private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
- var mainMenuItem = e.AddedItems[0] as MainMenuItemVm;
- mainMenuItem?.Destination.Navigate(mainMenuItem.PageType, mainMenuItem.Parameter);
+ var mainVm = DataContext as MainVm;
+ mainVm.SelectedItem?.Destination.Navigate(mainVm.SelectedItem.PageType, mainVm.SelectedItem.Parameter);
}
}
}
diff --git a/ModernKeePass/ModernKeePass.csproj b/ModernKeePass/ModernKeePass.csproj
index 408d85b..58fe225 100644
--- a/ModernKeePass/ModernKeePass.csproj
+++ b/ModernKeePass/ModernKeePass.csproj
@@ -200,6 +200,11 @@
Designer
MSBuild:Compile
+
+ Designer
+ MSBuild:Compile
+ PreserveNewest
+
diff --git a/ModernKeePass/Pages/EntryDetailPage.xaml b/ModernKeePass/Pages/EntryDetailPage.xaml
index 7bed9cd..6170bca 100644
--- a/ModernKeePass/Pages/EntryDetailPage.xaml
+++ b/ModernKeePass/Pages/EntryDetailPage.xaml
@@ -37,21 +37,19 @@
-
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/ModernKeePass/Pages/GroupDetailPage.xaml b/ModernKeePass/Pages/GroupDetailPage.xaml
index 42e6365..5c05dd0 100644
--- a/ModernKeePass/Pages/GroupDetailPage.xaml
+++ b/ModernKeePass/Pages/GroupDetailPage.xaml
@@ -42,7 +42,7 @@
-
+
-
+
diff --git a/ModernKeePass/Pages/GroupDetailPage.xaml.cs b/ModernKeePass/Pages/GroupDetailPage.xaml.cs
index eb58bb0..9235ee0 100644
--- a/ModernKeePass/Pages/GroupDetailPage.xaml.cs
+++ b/ModernKeePass/Pages/GroupDetailPage.xaml.cs
@@ -104,5 +104,13 @@ namespace ModernKeePass.Pages
group?.RemoveGroup();
if (Frame.CanGoBack) Frame.GoBack();
}
+
+ private void SemanticZoom_ViewChangeStarted(object sender, SemanticZoomViewChangedEventArgs e)
+ {
+ if (e.IsSourceZoomedInView == false)
+ {
+ e.DestinationItem.Item = e.SourceItem.Item;
+ }
+ }
}
}
diff --git a/ModernKeePass/Pages/RecentDatabasesPage.xaml b/ModernKeePass/Pages/RecentDatabasesPage.xaml
index 4029a03..62c4b76 100644
--- a/ModernKeePass/Pages/RecentDatabasesPage.xaml
+++ b/ModernKeePass/Pages/RecentDatabasesPage.xaml
@@ -5,22 +5,19 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:viewModels="using:ModernKeePass.ViewModels"
xmlns:local="using:ModernKeePass.Controls"
- xmlns:Converters="using:ModernKeePass.Converters"
+ xmlns:converters="using:ModernKeePass.Converters"
x:Class="ModernKeePass.Pages.RecentDatabasesPage"
mc:Ignorable="d">
-
-
+
+
diff --git a/ModernKeePass/Pages/RecentDatabasesPage.xaml.cs b/ModernKeePass/Pages/RecentDatabasesPage.xaml.cs
index e293fa5..03433a0 100644
--- a/ModernKeePass/Pages/RecentDatabasesPage.xaml.cs
+++ b/ModernKeePass/Pages/RecentDatabasesPage.xaml.cs
@@ -1,7 +1,7 @@
using System;
-using System.Collections.ObjectModel;
-using System.Linq;
+using System.Threading.Tasks;
using Windows.Storage.AccessCache;
+using Windows.UI.Core;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;
@@ -28,12 +28,6 @@ namespace ModernKeePass.Pages
{
base.OnNavigatedTo(e);
_mainFrame = e.Parameter as Frame;
- var mru = StorageApplicationPermissions.MostRecentlyUsedList;
- var recentVm = DataContext as RecentVm;
- if (recentVm == null) return;
- recentVm.RecentItems = new ObservableCollection(
- from entry in mru.Entries
- select new RecentItemVm {Name = entry.Metadata, Token = entry.Token});
}
private async void RecentListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
diff --git a/ModernKeePass/Styles/TextBoxWithButtonStyle.xaml b/ModernKeePass/Styles/TextBoxWithButtonStyle.xaml
new file mode 100644
index 0000000..35c9875
--- /dev/null
+++ b/ModernKeePass/Styles/TextBoxWithButtonStyle.xaml
@@ -0,0 +1,7 @@
+
+
+
+
diff --git a/ModernKeePass/ViewModels/Items/MainMenuItemVm.cs b/ModernKeePass/ViewModels/Items/MainMenuItemVm.cs
index 9d59e3c..14070ef 100644
--- a/ModernKeePass/ViewModels/Items/MainMenuItemVm.cs
+++ b/ModernKeePass/ViewModels/Items/MainMenuItemVm.cs
@@ -1,12 +1,14 @@
using System;
using Windows.UI.Xaml.Controls;
+using ModernKeePass.Common;
using ModernKeePass.Interfaces;
namespace ModernKeePass.ViewModels
{
- public class MainMenuItemVm: IIsEnabled
+ public class MainMenuItemVm: NotifyPropertyChangedBase, IIsEnabled
{
private string _title;
+ private bool _isSelected;
public string Title
{
@@ -21,6 +23,12 @@ namespace ModernKeePass.ViewModels
public Symbol SymbolIcon { get; set; }
public bool IsEnabled => PageType != null;
+ public bool IsSelected
+ {
+ get { return _isSelected; }
+ set { SetProperty(ref _isSelected, value); }
+ }
+
public override string ToString()
{
return Title;
diff --git a/ModernKeePass/ViewModels/Items/RecentItemVm.cs b/ModernKeePass/ViewModels/Items/RecentItemVm.cs
index b9ef4d1..1c047dc 100644
--- a/ModernKeePass/ViewModels/Items/RecentItemVm.cs
+++ b/ModernKeePass/ViewModels/Items/RecentItemVm.cs
@@ -1,6 +1,4 @@
-using System.ComponentModel;
-using Windows.UI.Xaml;
-using ModernKeePass.Common;
+using ModernKeePass.Common;
namespace ModernKeePass.ViewModels
{
diff --git a/ModernKeePass/ViewModels/MainVm.cs b/ModernKeePass/ViewModels/MainVm.cs
index bf5e9b9..646547a 100644
--- a/ModernKeePass/ViewModels/MainVm.cs
+++ b/ModernKeePass/ViewModels/MainVm.cs
@@ -1,16 +1,73 @@
-using System.Linq;
+using System.Collections.ObjectModel;
+using System.Linq;
+using Windows.Storage.AccessCache;
+using Windows.UI.Xaml;
+using Windows.UI.Xaml.Controls;
using ModernKeePass.Common;
+using ModernKeePass.Pages;
namespace ModernKeePass.ViewModels
{
public class MainVm : NotifyPropertyChangedBase
{
private IOrderedEnumerable> _mainMenuItems;
+ private MainMenuItemVm _selectedItem;
public IOrderedEnumerable> MainMenuItems
{
get { return _mainMenuItems; }
set { SetProperty(ref _mainMenuItems, value); }
}
+
+ public MainMenuItemVm SelectedItem
+ {
+ get { return _selectedItem; }
+ set
+ {
+ if (_selectedItem == value) return;
+ if (_selectedItem != null)
+ {
+ _selectedItem.IsSelected = false;
+ }
+
+ SetProperty(ref _selectedItem, value);
+
+ if (_selectedItem != null)
+ {
+ _selectedItem.IsSelected = true;
+ }
+ }
+ }
+
+ public MainVm() {}
+
+ public MainVm(Frame referenceFrame, Frame destinationFrame)
+ {
+ var app = (App)Application.Current;
+ var mru = StorageApplicationPermissions.MostRecentlyUsedList;
+
+ var mainMenuItems = new ObservableCollection
+ {
+ new MainMenuItemVm {Title = "Open", PageType = typeof(OpenDatabasePage), Destination = destinationFrame, Parameter = referenceFrame, SymbolIcon = Symbol.Page2},
+ new MainMenuItemVm {Title = "New" /*, PageType = typeof(NewDatabasePage)*/, Destination = destinationFrame, SymbolIcon = Symbol.Add},
+ new MainMenuItemVm {Title = "Save" , PageType = typeof(SaveDatabasePage), Destination = destinationFrame, Parameter = referenceFrame, SymbolIcon = Symbol.Save},
+ new MainMenuItemVm {Title = "Recent" , PageType = typeof(RecentDatabasesPage), Destination = destinationFrame, Parameter = referenceFrame, SymbolIcon = Symbol.Copy,
+ IsSelected = (app.Database == null || !app.Database.IsOpen) && mru.Entries.Count > 0}
+ };
+ // Auto-select the Recent Items menu item if the conditions are met
+ SelectedItem = mainMenuItems.FirstOrDefault(m => m.IsSelected);
+ if (app.Database != null && app.Database.IsOpen)
+ mainMenuItems.Add(new MainMenuItemVm
+ {
+ Title = app.Database.Name,
+ PageType = typeof(GroupDetailPage),
+ Destination = referenceFrame,
+ Parameter = app.Database.RootGroup,
+ Group = 1,
+ SymbolIcon = Symbol.ProtectedDocument
+ });
+
+ MainMenuItems = from item in mainMenuItems group item by item.Group into grp orderby grp.Key select grp;
+ }
}
}
diff --git a/ModernKeePass/ViewModels/RecentVm.cs b/ModernKeePass/ViewModels/RecentVm.cs
index bdf337c..93b7752 100644
--- a/ModernKeePass/ViewModels/RecentVm.cs
+++ b/ModernKeePass/ViewModels/RecentVm.cs
@@ -1,4 +1,6 @@
using System.Collections.ObjectModel;
+using System.Linq;
+using Windows.Storage.AccessCache;
using ModernKeePass.Common;
namespace ModernKeePass.ViewModels
@@ -8,6 +10,16 @@ namespace ModernKeePass.ViewModels
private RecentItemVm _selectedItem;
private ObservableCollection _recentItems;
+ public RecentVm()
+ {
+ var mru = StorageApplicationPermissions.MostRecentlyUsedList;
+ RecentItems = new ObservableCollection(
+ from entry in mru.Entries
+ select new RecentItemVm { Name = entry.Metadata, Token = entry.Token });
+ if (RecentItems.Count > 0)
+ SelectedItem = RecentItems[0];
+ }
+
public ObservableCollection RecentItems
{
get { return _recentItems; }