Created shell and login WPF forms
This commit is contained in:
parent
f582cf6653
commit
ad7cb45908
@ -1,4 +1,5 @@
|
||||
using Caliburn.Micro;
|
||||
using RMWPFUserInterface.Helpers;
|
||||
using RMWPFUserInterface.ViewModels;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
@ -6,6 +7,7 @@ using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
|
||||
namespace RMWPFUserInterface
|
||||
{
|
||||
@ -15,6 +17,11 @@ namespace RMWPFUserInterface
|
||||
public BootStrapper()
|
||||
{
|
||||
Initialize();
|
||||
|
||||
ConventionManager.AddElementConvention<PasswordBox>(
|
||||
PasswordBoxHelper.BoundPasswordProperty,
|
||||
"Password",
|
||||
"PasswordChanged");
|
||||
}
|
||||
protected override void Configure()
|
||||
{
|
||||
|
67
RMWPFUserInterface/Helpers/PasswordBoxHelper.cs
Normal file
67
RMWPFUserInterface/Helpers/PasswordBoxHelper.cs
Normal file
@ -0,0 +1,67 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
|
||||
namespace RMWPFUserInterface.Helpers
|
||||
{
|
||||
public static class PasswordBoxHelper
|
||||
{
|
||||
public static readonly DependencyProperty BoundPasswordProperty =
|
||||
DependencyProperty.RegisterAttached("BoundPassword",
|
||||
typeof(string),
|
||||
typeof(PasswordBoxHelper),
|
||||
new FrameworkPropertyMetadata(string.Empty, OnBoundPasswordChanged));
|
||||
|
||||
public static string GetBoundPassword(DependencyObject d)
|
||||
{
|
||||
var box = d as PasswordBox;
|
||||
if (box != null)
|
||||
{
|
||||
// this funny little dance here ensures that we've hooked the
|
||||
// PasswordChanged event once, and only once.
|
||||
box.PasswordChanged -= PasswordChanged;
|
||||
box.PasswordChanged += PasswordChanged;
|
||||
}
|
||||
|
||||
return (string)d.GetValue(BoundPasswordProperty);
|
||||
}
|
||||
|
||||
public static void SetBoundPassword(DependencyObject d, string value)
|
||||
{
|
||||
if (string.Equals(value, GetBoundPassword(d)))
|
||||
return; // and this is how we prevent infinite recursion
|
||||
|
||||
d.SetValue(BoundPasswordProperty, value);
|
||||
}
|
||||
|
||||
private static void OnBoundPasswordChanged(
|
||||
DependencyObject d,
|
||||
DependencyPropertyChangedEventArgs e)
|
||||
{
|
||||
var box = d as PasswordBox;
|
||||
|
||||
if (box == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
box.Password = GetBoundPassword(d);
|
||||
}
|
||||
|
||||
private static void PasswordChanged(object sender, RoutedEventArgs e)
|
||||
{
|
||||
PasswordBox password = sender as PasswordBox;
|
||||
|
||||
SetBoundPassword(password, password.Password);
|
||||
|
||||
// set cursor past the last character in the password box
|
||||
password.GetType().GetMethod("Select", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(password, new object[] { password.Password.Length, 0 });
|
||||
|
||||
}
|
||||
}
|
||||
}
|
@ -74,7 +74,12 @@
|
||||
<SubType>Designer</SubType>
|
||||
</ApplicationDefinition>
|
||||
<Compile Include="BootStrapper.cs" />
|
||||
<Compile Include="Helpers\PasswordBoxHelper.cs" />
|
||||
<Compile Include="ViewModels\LoginViewModel.cs" />
|
||||
<Compile Include="ViewModels\ShellViewModel.cs" />
|
||||
<Compile Include="Views\LoginView.xaml.cs">
|
||||
<DependentUpon>LoginView.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Views\ShellView.xaml.cs">
|
||||
<DependentUpon>ShellView.xaml</DependentUpon>
|
||||
</Compile>
|
||||
@ -82,6 +87,10 @@
|
||||
<DependentUpon>App.xaml</DependentUpon>
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Page Include="Views\LoginView.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</Page>
|
||||
<Page Include="Views\ShellView.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
|
57
RMWPFUserInterface/ViewModels/LoginViewModel.cs
Normal file
57
RMWPFUserInterface/ViewModels/LoginViewModel.cs
Normal file
@ -0,0 +1,57 @@
|
||||
using Caliburn.Micro;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace RMWPFUserInterface.ViewModels
|
||||
{
|
||||
public class LoginViewModel : Screen
|
||||
{
|
||||
private string _userName;
|
||||
private string _password;
|
||||
public string UserName
|
||||
{
|
||||
get { return _userName; }
|
||||
set
|
||||
{
|
||||
_userName = value;
|
||||
NotifyOfPropertyChange(() => UserName);
|
||||
NotifyOfPropertyChange(() => CanLogIn);
|
||||
}
|
||||
}
|
||||
|
||||
public string Password
|
||||
{
|
||||
get { return _password; }
|
||||
set
|
||||
{
|
||||
_password = value;
|
||||
NotifyOfPropertyChange(() => Password);
|
||||
NotifyOfPropertyChange(() => CanLogIn);
|
||||
}
|
||||
}
|
||||
|
||||
public bool CanLogIn
|
||||
{
|
||||
get{
|
||||
|
||||
bool output = false;
|
||||
|
||||
if (UserName?.Length > 0 && Password?.Length > 0)
|
||||
{
|
||||
output = true;
|
||||
}
|
||||
|
||||
return output;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public void LogIn()
|
||||
{
|
||||
Console.WriteLine();
|
||||
}
|
||||
}
|
||||
}
|
@ -3,10 +3,17 @@ using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Caliburn.Micro;
|
||||
|
||||
namespace RMWPFUserInterface.ViewModels
|
||||
{
|
||||
public class ShellViewModel
|
||||
public class ShellViewModel : Conductor<Object>
|
||||
{
|
||||
private LoginViewModel _loginVM;
|
||||
public ShellViewModel(LoginViewModel loginVM)
|
||||
{
|
||||
_loginVM = loginVM;
|
||||
ActivateItemAsync(_loginVM);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
46
RMWPFUserInterface/Views/LoginView.xaml
Normal file
46
RMWPFUserInterface/Views/LoginView.xaml
Normal file
@ -0,0 +1,46 @@
|
||||
<UserControl x:Class="RMWPFUserInterface.Views.LoginView"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:local="clr-namespace:RMWPFUserInterface.Views"
|
||||
mc:Ignorable="d" Background="White" FontSize="24"
|
||||
d:DesignHeight="425" d:DesignWidth="800">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*" />
|
||||
<ColumnDefinition Width="auto" />
|
||||
<ColumnDefinition Width="auto" />
|
||||
<ColumnDefinition Width="*" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="auto"/>
|
||||
<RowDefinition Height="auto"/>
|
||||
<RowDefinition Height="auto"/>
|
||||
<RowDefinition Height="auto"/>
|
||||
<RowDefinition Height="*"/>
|
||||
</Grid.RowDefinitions>
|
||||
<TextBlock Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="2" Margin="0 0 0 20"
|
||||
HorizontalAlignment="Center" FontSize="64" FontFamily="Segoe UI Light">
|
||||
Login Form
|
||||
</TextBlock>
|
||||
|
||||
<!-- Username row -->
|
||||
<TextBlock Grid.Row="1" Grid.Column="1" Margin="0 0 10 20">
|
||||
Username:
|
||||
</TextBlock>
|
||||
<TextBox x:Name="UserName" Grid.Row="1" Grid.Column="2" MinWidth="200" Margin="0 0 0 10"/>
|
||||
|
||||
<!-- Password row -->
|
||||
<TextBlock Grid.Row="2" Grid.Column="1" Margin="0 0 10 20">
|
||||
Password:
|
||||
</TextBlock>
|
||||
<PasswordBox x:Name="Password" Grid.Row="2" Grid.Column="2" MinWidth="200" Margin="0 0 0 10"/>
|
||||
|
||||
<!-- Login button -->
|
||||
<Button Grid.Row="3" Grid.Column="1" Grid.ColumnSpan="2" Padding="20 5"
|
||||
HorizontalAlignment="Center" x:Name="LogIn">
|
||||
Log in
|
||||
</Button>
|
||||
</Grid>
|
||||
</UserControl>
|
28
RMWPFUserInterface/Views/LoginView.xaml.cs
Normal file
28
RMWPFUserInterface/Views/LoginView.xaml.cs
Normal file
@ -0,0 +1,28 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Navigation;
|
||||
using System.Windows.Shapes;
|
||||
|
||||
namespace RMWPFUserInterface.Views
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for LoginView.xaml
|
||||
/// </summary>
|
||||
public partial class LoginView : UserControl
|
||||
{
|
||||
public LoginView()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
@ -6,7 +6,17 @@
|
||||
xmlns:local="clr-namespace:RMWPFUserInterface.Views"
|
||||
mc:Ignorable="d"
|
||||
Title="ShellView" Height="450" Width="800">
|
||||
<Grid>
|
||||
|
||||
</Grid>
|
||||
<DockPanel>
|
||||
<Menu DockPanel.Dock="Top" FontSize="18">
|
||||
<MenuItem Header="_File">
|
||||
|
||||
</MenuItem>
|
||||
<MenuItem Header="_Account">
|
||||
<MenuItem x:Name="LoginScreen" Header="_Login" />
|
||||
</MenuItem>
|
||||
</Menu>
|
||||
<Grid>
|
||||
<ContentControl x:Name="ActiveItem" Margin="5" />
|
||||
</Grid>
|
||||
</DockPanel>
|
||||
</Window>
|
||||
|
Loading…
Reference in New Issue
Block a user