WPF(Windows Presentation Foundation)是微软推出的基于Windows 的用户界面框架,属于.NET Framework 3.0的一部分。它提供了统一的编程模型、语言和框架,真正做到了分离界面设计人员与开发人员的工作;同时它提供了全新的多媒体交互用户图形界面。
MVVM是Model-View-ViewModel的简写。它就是将其中的View 的状态和行为抽象化,让我们将视图 UI 和业务逻辑分开。当然这些事 ViewModel 已经帮我们做了,它可以取出 Model 的数据同时帮忙处理 View 中由于需要展示内容而涉及的业务逻辑。微软的WPF带来了新的技术体验,如Silverlight、音频、视频、3D、动画……,这导致了软件UI层更加细节化、可定制化。同时,在技术层面,WPF也带来了 诸如Binding、Dependency Property、Routed Events、Command、DataTemplate、ControlTemplate等新特性。MVVM(Model-View-ViewModel)框架的由来便是MVP(Model-View-Presenter)模式与WPF结合的应用方式时发展演变过来的一种新型架构框架。它立足于原有MVP框架并且把WPF的新特性糅合进去,以应对客户日益复杂的需求变化。
-
窗口事件
1.窗口事件注册
public class WindowBehaviours : Behavior<Window>
{
public static readonly DependencyProperty CloseProperty =
DependencyProperty.Register(
"Close",
typeof(bool),
typeof(WindowBehaviours),
new FrameworkPropertyMetadata(
false,
OnCloseChanged));
public bool Close
{
get { return (bool)GetValue(CloseProperty); }
set { SetValue(CloseProperty, value); }
}
private static void OnCloseChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var window = ((WindowBehaviours)d).AssociatedObject;
var newValue = ((bool)e.NewValue);
if (newValue)
{
window.Close();
}
}
public static readonly DependencyProperty ShowInTaskbarProperty =
DependencyProperty.Register(
"IsShowInTaskbar",
typeof(bool),
typeof(WindowBehaviours),
new FrameworkPropertyMetadata(
false,
OnIsShowInTaskbarChanged));
public bool IsShowInTaskbar
{
get { return (bool)GetValue(ShowInTaskbarProperty); }
set { SetValue(ShowInTaskbarProperty, value); }
}
private static void OnIsShowInTaskbarChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var window = ((WindowBehaviours)d).AssociatedObject;
var newValue = ((bool)e.NewValue);
window.ShowInTaskbar = newValue;
}
}
2.窗口事件使用
<Window x:Class="BookStore.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:BookStore.Vm"
xmlns:event="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
Title="欢迎使用图书商城" Height="300" Width="425" WindowStartupLocation="CenterScreen" Icon="pack://siteoforigin:,,,/Resources/smartATE.ico" WindowStyle="ToolWindow" ResizeMode="NoResize">
<event:Interaction.Behaviors>
<local:WindowBehaviours Close="{Binding IsWinClose}"/>
<local:WindowBehaviours IsShowInTaskbar="{Binding IsShowInTaskbar}"/>
</event:Interaction.Behaviors>
</Window>
数据绑定
<TextBlock Grid.Column="1" Margin="0" Grid.Row="1" TextWrapping="Wrap" Width="auto" Text="用户" TextAlignment="Center" />
<TextBlock Grid.Column="1" Margin="0" Grid.Row="3" Grid.RowSpan="1" TextWrapping="Wrap" Width="auto" Text="密码" TextAlignment="Center" />
<TextBox Grid.Column="2" Margin="0" Grid.Row="1" Grid.RowSpan="1" TextWrapping="Wrap" Text="{Binding UserID}" Width="auto"/>
<PasswordBox Grid.Column="2" Margin="0" Grid.Row="3" Grid.RowSpan="1" local:PasswordBoxHelper.Attach ="True" Name="pwd"
local:PasswordBoxHelper.Password ="{Binding Password, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
密码框绑定辅助类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
namespace BookStore.Vm
{
public static class PasswordBoxHelper
{
public static readonly DependencyProperty PasswordProperty = DependencyProperty.RegisterAttached("Password", typeof(string), typeof(PasswordBoxHelper),
new FrameworkPropertyMetadata(string.Empty, OnPasswordPropertyChanged));
public static readonly DependencyProperty AttachProperty = DependencyProperty.RegisterAttached("Attach", typeof(bool), typeof(PasswordBoxHelper), new PropertyMetadata(false, OnAttachPropertyChanged));
private static readonly DependencyProperty IsUpdatingProperty = DependencyProperty.RegisterAttached("IsUpdating", typeof(bool), typeof(PasswordBoxHelper));
public static void SetAttach(DependencyObject dp, bool value)
{
dp.SetValue(AttachProperty, value);
}
public static bool GetAttach(DependencyObject dp)
{
return (bool)dp.GetValue(AttachProperty);
}
public static string GetPassword(DependencyObject dp)
{
return (string)dp.GetValue(PasswordProperty);
}
public static void SetPassword(DependencyObject dp, string value)
{
dp.SetValue(PasswordProperty, value);
}
private static bool GetIsUpdating(DependencyObject dp)
{
return (bool)dp.GetValue(IsUpdatingProperty);
}
private static void SetIsUpdating(DependencyObject dp, bool value)
{
dp.SetValue(IsUpdatingProperty, value);
}
private static void OnPasswordPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
PasswordBox passwordBox = sender as PasswordBox;
passwordBox.PasswordChanged -= PasswordChanged;
if (!(bool)GetIsUpdating(passwordBox))
{
passwordBox.Password = (string)e.NewValue;
}
passwordBox.PasswordChanged += PasswordChanged;
}
private static void OnAttachPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
PasswordBox passwordBox = sender as PasswordBox;
if (passwordBox == null)
{
return;
}
if ((bool)e.OldValue)
{
passwordBox.PasswordChanged -= PasswordChanged;
}
if ((bool)e.NewValue)
{
passwordBox.PasswordChanged += PasswordChanged;
}
}
private static void PasswordChanged(object sender, RoutedEventArgs e)
{
PasswordBox passwordBox = sender as PasswordBox;
SetIsUpdating(passwordBox, true);
SetPassword(passwordBox, passwordBox.Password);
SetIsUpdating(passwordBox, false);
}
}
}
按钮事件绑定
<Button Content="登录" Width="auto" Margin="0" Grid.Column="1" Command="{Binding LoginCommand}"/>
<Button Content="取消" Width="auto" Margin="0" Grid.Column="3" Command="{Binding CancelCommand}" />
后台代码
using BookStore.View;
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
namespace BookStore.ViewMode
{
public class Vm_MainWindow : ViewModelBase
{
public Vm_MainWindow()
{
LoginCommand = new RelayCommand(ProcessLogin);
CancelCommand = new RelayCommand(ProcessCancel);
}
public void ProcessLogin()
{
if (UserID == "Admin" && Password == "123")
{
IsShowInTaskbar = false;
Tip = "";
WindowBookStore wi = new WindowBookStore();
//wi.Owner = this;
wi.ShowDialog();
}
else
Tip = "用户名或密码错误";
}
public void ProcessCancel()
{
IsWinClose = true;
}
#region
private ICommand _loginCommand;
public ICommand LoginCommand
{
get { return _loginCommand; }
set { _loginCommand = value; }
}
private ICommand _cancelCommand;
public ICommand CancelCommand
{
get { return _cancelCommand; }
set { _cancelCommand = value; }
}
private bool _isWinClose;
/// <summary>
/// 指示窗口是否关闭
/// </summary>
public bool IsWinClose
{
get { return _isWinClose; }
set
{
_isWinClose = value;
RaisePropertyChanged("IsWinClose");
//窗口关闭则重置窗口状态
if (IsWinClose)
{
ResetWindowCloseState();
}
}
}
//重置窗口状态
private void ResetWindowCloseState()
{
IsWinClose = false;
}
private string _userID = "Admin";
public string UserID
{
get { return _userID; }
set
{
_userID = value;
RaisePropertyChanged("UserID");
}
}
private string _password = "123";
public string Password
{
get { return _password; }
set
{
_password = value;
RaisePropertyChanged("Password");
}
}
private string _Tip;
public string Tip
{
get { return _Tip; }
set
{
_Tip = value;
RaisePropertyChanged("Tip");
}
}
#region IsShowInTaskbar
private bool _IsShowInTaskbar = true;
public bool IsShowInTaskbar
{
get { return _IsShowInTaskbar; }
set
{
_IsShowInTaskbar = value;
RaisePropertyChanged("IsShowInTaskbar");
}
}
#endregion
#endregion
}
}
前台代码
<Window x:Class="BookStore.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:BookStore.Vm"
xmlns:event="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
Title="欢迎使用图书商城" Height="300" Width="425" WindowStartupLocation="CenterScreen" Icon="pack://siteoforigin:,,,/Resources/smartATE.ico" WindowStyle="ToolWindow" ResizeMode="NoResize">
<event:Interaction.Behaviors>
<local:WindowBehaviours Close="{Binding IsWinClose}"/>
<local:WindowBehaviours IsShowInTaskbar="{Binding IsShowInTaskbar}"/>
</event:Interaction.Behaviors>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="95*"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="57*"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="57*"/>
<RowDefinition Height="31*"/>
<RowDefinition Height="45*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50*"/>
<ColumnDefinition Width="60*"/>
<ColumnDefinition Width="120*"/>
<ColumnDefinition Width="50*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="1" Margin="0" Grid.Row="1" TextWrapping="Wrap" Width="auto" Text="用户" TextAlignment="Center" />
<TextBlock Grid.Column="1" Margin="0" Grid.Row="3" Grid.RowSpan="1" TextWrapping="Wrap" Width="auto" Text="密码" TextAlignment="Center" />
<TextBox Grid.Column="2" Margin="0" Grid.Row="1" Grid.RowSpan="1" TextWrapping="Wrap" Text="{Binding UserID}" Width="auto"/>
<PasswordBox Grid.Column="2" Margin="0" Grid.Row="3" Grid.RowSpan="1" local:PasswordBoxHelper.Attach ="True" Name="pwd"
local:PasswordBoxHelper.Password ="{Binding Password, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
<Grid Grid.ColumnSpan="2" Grid.Column="1" Height="auto" Margin="0" Grid.Row="5" Grid.RowSpan="1" Width="auto">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50*"/>
<ColumnDefinition Width="60*"/>
<ColumnDefinition Width="40*"/>
<ColumnDefinition Width="50*"/>
<ColumnDefinition Width="50*"/>
</Grid.ColumnDefinitions>
<Button Content="登录" Width="auto" Margin="0" Grid.Column="1" Command="{Binding LoginCommand}"/>
<Button Content="取消" Width="auto" Margin="0" Grid.Column="3" Command="{Binding CancelCommand}" />
</Grid>
<Label Content="{Binding Tip}" Grid.Column="1" Margin="0" Grid.Row="4" Grid.ColumnSpan="2" Width="auto" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" Foreground="#FFB20808" />
</Grid>
</Window>
DataGrid选择行颜色设置
<DataGrid.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="#FF7ECB7E"/>
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#FF72DBE0"/>
</DataGrid.Resources>