伍佰目录 短网址
  当前位置:海洋目录网 » 站长资讯 » 教育考试 » 文章详细 订阅RssFeed

C# WPF 表单更改提示

来源:本站原创 浏览:85次 时间:2022-12-20
1.实现效果

未做修改的表单展示 

表单变化,关闭窗体提示 

来个Gif动态操作看看 

2.业务场景

表单修改后,关闭窗体前检查提示

3.编码实现3.1 添加Nuget库

使用 .Net Core 3.1 创建名为“ValidateDataChange”的WPF解决方案,添加两个Nuget库:MaterialDesignThemes和MaterialDesignColors。

MaterialDesign控件库 

3.2 工程结构

4个文件变动:

  1. App.xaml:添加MD控件样式

  2. MainWindow.xaml:主窗口实现效果

  3. MainWindow.xaml.cs:主窗口后台绑定及关闭验证

  4. Contact.cs:绑定的实体

3.3 App.xaml引入MD控件样式
<Application x:Class="ValidateDataChange.App"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:ValidateDataChange"
            StartupUri="MainWindow.xaml">
   <Application.Resources>
       <ResourceDictionary>
           <ResourceDictionary.MergedDictionaries>
               <ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Light.xaml"/>
               <ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml"/>
               <ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Primary/MaterialDesignColor.DeepPurple.xaml"/>
               <ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Accent/MaterialDesignColor.Blue.xaml"/>
           </ResourceDictionary.MergedDictionaries>
       </ResourceDictionary>
   </Application.Resources>
</Application>
3.4 主窗体 MainWindow.xaml

表单展示,使用MD控件的Snackbar作为消息提示

<Window x:Class="ValidateDataChange.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:ValidateDataChange"
       mc:Ignorable="d"
       xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
       Title="编辑联系人" Height="500" Width="400" ResizeMode="NoResize" FontFamily="Roboto"
       FontSize="14" WindowStartupLocation="CenterScreen" Closing="Window_Closing">
   <Grid>
       <Grid.RowDefinitions>
           <RowDefinition Height="100"/>
           <RowDefinition Height="*"/>
       </Grid.RowDefinitions>
       <materialDesign:ColorZone Mode="PrimaryMid" Grid.Row="0" VerticalAlignment="Stretch">
           <TextBlock Text="联系人" VerticalAlignment="Center" Margin="20" FontSize="30"/>
       </materialDesign:ColorZone>

       <StackPanel Margin="10 30" Grid.Row="1">
           <Grid>
               <materialDesign:PackIcon Kind="Face" VerticalAlignment="Bottom" Margin="2 12" Foreground="{Binding BorderBrush, ElementName=TextBoxName}"/>
               <TextBox x:Name="TextBoxName" Margin="5" materialDesign:HintAssist.Hint="名字" Padding="8 0 0 0" Text="{Binding Name}"
                        Style="{StaticResource MaterialDesignFloatingHintTextBox}"/>
           </Grid>
           <Grid>
               <materialDesign:PackIcon Kind="At" VerticalAlignment="Bottom" Margin="2 12" Foreground="{Binding BorderBrush, ElementName=TextBoxEmail}"/>
               <TextBox x:Name="TextBoxEmail" Margin="5" materialDesign:HintAssist.Hint="邮件" Padding="8 0 0 0" Text="{Binding Email}"
                        Style="{StaticResource MaterialDesignFloatingHintTextBox}"/>
           </Grid>
           <Grid>
               <StackPanel Orientation="Horizontal" VerticalAlignment="Bottom" Margin="2 10">
                   <materialDesign:PackIcon Kind="Facebook" Foreground="{Binding BorderBrush, ElementName=TextBoxFacebook}"/>
                   <TextBlock Text="facebook.com/" Foreground="{Binding BorderBrush, ElementName=TextBoxFacebook}"/>
               </StackPanel>
               <TextBox x:Name="TextBoxFacebook" Margin="5" materialDesign:HintAssist.Hint="Facebook" Padding="54 0 0 0" Text="{Binding Facebook}"
                        Style="{StaticResource MaterialDesignFloatingHintTextBox}"/>
           </Grid>
       </StackPanel>
       <Button Grid.RowSpan="2" Margin="50 72" HorizontalAlignment="Right" VerticalAlignment="Top" Style="{StaticResource MaterialDesignFloatingActionAccentButton}"
               Click="Button_Click">
           <materialDesign:PackIcon Kind="ContentSave"/>
       </Button>

       <materialDesign:Snackbar Grid.Row="1" HorizontalAlignment="Stretch" x:Name="SnackbarUnsavedChanges" VerticalAlignment="Bottom">
           <materialDesign:SnackbarMessage
               Content="有未保存的更改,是否放弃修改?"
               ActionContent="放弃" ActionClick="SnackbarMessage_ActionClick"/>
       </materialDesign:Snackbar>
   </Grid>
</Window>
3.5 MainWindow.xaml.cs

数据绑定,窗体关闭前表单验证:简单使用hashcode判断绑定实体是否有变化。

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 ValidateDataChange
{
   /// <summary>
   /// Interaction logic for MainWindow.xaml
   /// </summary>
   public partial class MainWindow : Window
   {
       int hash;
       bool discardChanges;

       public MainWindow()
       {
           InitializeComponent();

           discardChanges = false;

           var contact = new Contact("Dotnet9", "632871194@qq.com", "Dotnet9");
           hash = contact.GetHashCode();

           this.DataContext = contact;
       }

       private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
       {
           if (this.DataContext.GetHashCode() != hash && !discardChanges)
           {
               SnackbarUnsavedChanges.IsActive = true;
               e.Cancel = true;
           }
       }

       private void Button_Click(object sender, RoutedEventArgs e)
       {
           //保存数据
       }

       private void SnackbarMessage_ActionClick(object sender, RoutedEventArgs e)
       {
           SnackbarUnsavedChanges.IsActive = false;
           discardChanges = true;
           this.Close();
       }
   }
}
3.6 Contact.cs

联系人实体类

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;

namespace ValidateDataChange
{
   internal class Contact : INotifyPropertyChanged
   {
       public event PropertyChangedEventHandler PropertyChanged;
       private void NotifyPropertyChanged(string info)
       {
           if (PropertyChanged != null)
           {
               PropertyChanged(this, new PropertyChangedEventArgs(info));
           }
       }


       private string name;
       public string Name
       {
           get { return name; }
           set { name = value; NotifyPropertyChanged("Name"); }
       }
       private string email;
       public string Email
       {
           get { return email; }
           set { email = value; NotifyPropertyChanged("Email"); }
       }
       private string facebook;
       public string Facebook
       {
           get { return facebook; }
           set { facebook = value; NotifyPropertyChanged("Facebook"); }
       }

       public Contact(string name, string email, string facebook)
       {
           this.name = name;
           this.email = email;
           this.facebook = facebook;
       }

       public override int GetHashCode()
       {
           return (name + email + facebook).GetHashCode();
       }

   }
}


  推荐站点

  • At-lib分类目录At-lib分类目录

    At-lib网站分类目录汇集全国所有高质量网站,是中国权威的中文网站分类目录,给站长提供免费网址目录提交收录和推荐最新最全的优秀网站大全是名站导航之家

    www.at-lib.cn
  • 中国链接目录中国链接目录

    中国链接目录简称链接目录,是收录优秀网站和淘宝网店的网站分类目录,为您提供优质的网址导航服务,也是网店进行收录推广,站长免费推广网站、加快百度收录、增加友情链接和网站外链的平台。

    www.cnlink.org
  • 35目录网35目录网

    35目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向35目录推荐、提交优秀网站。

    www.35mulu.com
  • 就要爱网站目录就要爱网站目录

    就要爱网站目录,按主题和类别列出网站。所有提交的网站都经过人工审查,确保质量和无垃圾邮件的结果。

    www.912219.com
  • 伍佰目录伍佰目录

    伍佰网站目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向伍佰目录推荐、提交优秀网站。

    www.wbwb.net