C#登錄界面代碼詳細(xì)圖文教程
背景
MVVM 是一種軟件架構(gòu)模式,用于創(chuàng)建用戶界面。它將用戶界面(View)、業(yè)務(wù)邏輯(ViewModel)和數(shù)據(jù)模型(Model)分離開來,以提高代碼的可維護(hù)性和可測試性。
MainWindow 類是 View(視圖),負(fù)責(zé)用戶界面的呈現(xiàn)和交互,它是用戶直接看到和操作的部分。
LoginVM 類是 ViewModel(視圖模型),它充當(dāng)了 View 和 Model 之間的中介,處理了視圖與數(shù)據(jù)模型之間的交互邏輯,以及用戶操作的響應(yīng)邏輯。
LoginModel 類是 Model(模型),它包含了應(yīng)用程序的數(shù)據(jù)和業(yè)務(wù)邏輯,用于存儲(chǔ)和處理用戶的身份驗(yàn)證信息。
展示
代碼
LoginModel.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace WpfApp2 { public class LoginModel { private string _UserName; public string UserName { get { return _UserName; } set { _UserName = value; } } private string _Password; public string Password { get { return _Password; } set { _Password = value; } } } }
LoginVM.cs
using Sys tem; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Input; namespace WpfApp2 { public class LoginVM : INotifyPropertyChanged { private MainWindow _main; public LoginVM(MainWindow main) { _main = main; } public event PropertyChangedEventHandler PropertyChanged; private void RaisePropetyChanged(string propertyName) { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) { handler(this, new PropertyChangedEventArgs(propertyName)); } } private LoginModel _LoginM = new LoginModel(); public string UserName { get { return _LoginM.UserName; } set { _LoginM.UserName = value; RaisePropetyChanged("UserName"); } } public string Password { get { return _LoginM.Password; } set { _LoginM.Password = value; RaisePropetyChanged("Password"); } } /// <summary> /// 登錄方法 /// </summary> void Loginfunc() { if (UserName == "wpf" && Password == "666") { MessageBox.Show("OK"); Index index = new Index(); index.Show(); //想辦法拿到mainwindow _main.Hide(); } else { MessageBox.Show("輸入的用戶名或密碼不正確"); UserName = ""; Password = ""; } } bool CanLoginExecute() { return true; } public ICommand LoginAction { get { return new RelayCommand(Loginfunc,CanLoginExecute); } } } }
MainWindow.xaml
<Window x:Class="WpfApp2.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfApp2" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="auto"></RowDefinition> <RowDefinition Height="auto"></RowDefinition> <RowDefinition Height="1*"></RowDefinition> <RowDefinition Height="9*"></RowDefinition> </Grid.RowDefinitions> <TextBlock Grid.Row="0" Grid.Column="0" Text="上海市-市圖書館" FontSize="18" HorizontalAlignment="Center"></TextBlock> <StackPanel Grid.Row="1" Grid.Column="0" Background="#0078d4"> <TextBlock Text="登錄" FontSize="22" HorizontalAlignment="Center" Foreground="Wheat" Margin="5"> </TextBlock> </StackPanel> <Grid Grid.Row="3" ShowGridLines="False" HorizontalAlignment="Center"> <Grid.RowDefinitions> <RowDefinition Height="30"></RowDefinition> <RowDefinition Height="30"></RowDefinition> <RowDefinition Height="30"></RowDefinition> <RowDefinition Height="30"></RowDefinition> </Grid.RowDefinitions> <Grid.ColumnDefinitions > <ColumnDefinition Width="auto"></ColumnDefinition> <ColumnDefinition Width="200"></ColumnDefinition> </Grid.ColumnDefinitions> <TextBlock Text="用戶名" Grid.Row="0" Grid.Column="0" VerticalAlignment="Center"></TextBlock> <TextBox Text="{Binding UserName}" Grid.Row="0" Grid.Column="1" Margin="2" ></TextBox> <TextBlock Text="密碼" Grid.Row="1" Grid.Column="0" VerticalAlignment="Center"></TextBlock> <TextBox Text="{Binding Password}" Grid.Row="1" Grid.Column="1" Margin="2"></TextBox> <CheckBox Grid.ColumnSpan="2" Content="記住密碼" Grid.Row="2"></CheckBox> <local:CustomButton ButtonCornerRadius="5" BackgroundHover="Red" BackgroundPressed="Green" Foreground="#FFFFFF" Background="#3C7FF8" Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" Command="{Binding LoginAction}" Height="30" VerticalAlignment="Top">登錄</local:CustomButton> </Grid> </Grid> </Window>
MainWindow.xaml.cs
using System; using System.Collections.Generic; using System.ComponentModel; 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 WpfApp2 { /// <summary> /// MainWindow.xaml 的交互邏輯 /// </summary> public partial class MainWindow : Window { LoginVM loginVM; public MainWindow() { InitializeComponent(); loginVM = new LoginVM(this); this.DataContext = loginVM; } } }
RelayCommand.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Input; namespace WpfApp2 { public class RelayCommand : ICommand { /// <summary> /// 命令是否能夠執(zhí)行 /// </summary> readonly Func<bool> _canExecute; /// <summary> /// 命令需要執(zhí)行的方法 /// </summary> readonly Action _exexute; public RelayCommand(Action exexute,Func<bool> canExecute) { _canExecute = canExecute; _exexute = exexute; } public bool CanExecute(object parameter) { if (_canExecute == null) { return true; } return _canExecute(); } public void Execute(object parameter) { _exexute(); } public event EventHandler CanExecuteChanged { add { if (_canExecute != null) { CommandManager.RequerySuggested += value; } } remove { if (_canExecute != null) { CommandManager.RequerySuggested -= value; } } } } }
自定義按鈕CustomButton
App.xaml.cs
<Application x:Class="WpfApp2.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:WpfApp2" StartupUri="MainWindow.xaml"> <Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="CustomButtonStyles.xaml"></ResourceDictionary> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Application.Resources> </Application>
CustomButton.cs
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.Media; namespace WpfApp2 { public class CustomButton:Button { //依賴屬性 public CornerRadius ButtonCornerRadius { get { return (CornerRadius)GetValue(ButtonCornerRadiusProperty); } set { SetValue(ButtonCornerRadiusProperty, value); } } // Using a DependencyProperty as the backing store for ButtonCornerRadius. This enables animation, styling, binding, etc... public static readonly DependencyProperty ButtonCornerRadiusProperty = DependencyProperty.Register("ButtonCornerRadius", typeof(CornerRadius), typeof(CustomButton)); public Brush BackgroundHover { get { return (Brush)GetValue(BackgroundHoverProperty); } set { SetValue(BackgroundHoverProperty, value); } } // Using a DependencyProperty as the backing store for BackgroundHover. This enables animation, styling, binding, etc... public static readonly DependencyProperty BackgroundHoverProperty = DependencyProperty.Register("BackgroundHover", typeof(Brush), typeof(CustomButton)); public Brush BackgroundPressed { get { return (Brush)GetValue(BackgroundPressedProperty); } set { SetValue(BackgroundPressedProperty, value); } } // Using a DependencyProperty as the backing store for BackgroundPressed. This enables animation, styling, binding, etc... public static readonly DependencyProperty BackgroundPressedProperty = DependencyProperty.Register("BackgroundPressed", typeof(Brush), typeof(CustomButton)); } }
數(shù)據(jù)字典
CustombuttonStyles.xaml
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:bb="clr-namespace:WpfApp2"> <Style TargetType="{x:Type bb:CustomButton}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type bb:CustomButton}"> <Border x:Name="buttonBorder" Background="{TemplateBinding Background}" CornerRadius="{TemplateBinding ButtonCornerRadius}"> <TextBlock Text="{TemplateBinding Content}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"></TextBlock> </Border> <!--觸發(fā)器--> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter TargetName="buttonBorder" Property="Background" Value="{Binding BackgroundHover,RelativeSource={RelativeSource TemplatedParent}}"></Setter> </Trigger> <Trigger Property="IsPressed" Value="True"> <Setter TargetName="buttonBorder" Property="Background" Value="{Binding BackgroundPressed,RelativeSource={RelativeSource TemplatedParent}}"></Setter> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> </ResourceDictionary>
總結(jié)
到此這篇關(guān)于C#登錄界面代碼的文章就介紹到這了,更多相關(guān)C#登錄界面代碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C# 委托的三種調(diào)用示例(同步調(diào)用 異步調(diào)用 異步回調(diào))
本文將主要通過同步調(diào)用、異步調(diào)用、異步回調(diào)三個(gè)示例來講解在用委托執(zhí)行同一個(gè)加法類的時(shí)候的的區(qū)別和利弊2013-12-12C# CAD SelectionFilter下TypedValue數(shù)組使用方式
這篇文章主要介紹了C# CAD SelectionFilter下TypedValue數(shù)組使用方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02NumberToUpper數(shù)字轉(zhuǎn)中文詳解
本文介紹NumberToUpper數(shù)字轉(zhuǎn)中文的方法,大家參考使用吧2013-12-12C#使用linq語句查詢數(shù)組中以特定字符開頭元素的方法
這篇文章主要介紹了C#使用linq語句查詢數(shù)組中以特定字符開頭元素的方法,涉及C#使用linq進(jìn)行查詢的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04C#實(shí)現(xiàn)23種常見的設(shè)計(jì)模式的示例詳解
設(shè)計(jì)模式通常分為三個(gè)主要類別:創(chuàng)建型模式、結(jié)構(gòu)型模式和行為型模式,這些模式是用于解決常見的對象導(dǎo)向設(shè)計(jì)問題的最佳實(shí)踐,本文為大家整理了23種常見的設(shè)計(jì)模式的實(shí)現(xiàn)代碼,需要的可以參考一下2023-06-06Python設(shè)計(jì)模式編程中的備忘錄模式與對象池模式示例
這篇文章主要介紹了Python設(shè)計(jì)模式編程中的備忘錄模式與對象池模式,文中分別舉了表單和線程的相關(guān)示例,需要的朋友可以參考下2016-02-02