背景
MVVM 是一种软件架构模式,用于创建用户界面。它将用户界面(View)、业务逻辑(ViewModel)和数据模型(Model)分离开来,以提高代码的可维护性和可测试性。
MainWindow 类是 View(视图),负责用户界面的呈现和交互,它是用户直接看到和操作的部分。
LoginVM 类是 ViewModel(视图模型),它充当了 View 和 Model 之间的中介,处理了视图与数据模型之间的交互逻辑,以及用户操作的响应逻辑。
LoginModel 类是 Model(模型),它包含了应用程序的数据和业务逻辑,用于存储和处理用户的身份验证信息。
展示
代码
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"); } } /// /// 登录方法 /// 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
登录
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 { /// /// MainWindow.xaml 的交互逻辑 /// 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 { /// /// 命令是否能够执行 /// readonly Func _canExecute; /// /// 命令需要执行的方法 /// readonly Action _exexute; public RelayCommand(Action exexute,Func 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
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)); } }
数据字典
CustombuttonStyles.xaml
文章版权声明:除非注明,否则均为VPS857原创文章,转载或复制请以超链接形式并注明出处。
还没有评论,来说两句吧...