• C# WPF 表单更改提示


    微信公众号:Dotnet9,网站:Dotnet9,问题或建议,请网站留言;
    如果您觉得Dotnet9对您有帮助,欢迎赞赏

    C# WPF 表单更改提示

    内容目录

    1. 实现效果
    2. 业务场景
    3. 编码实现
    4. 本文参考
    5. 源码下载

    1.实现效果

    未做修改的表单展示
    未做修改的表单展示

    表单变化,关闭窗体提示
    表单变化,关闭窗体提示

    来个Gif动态操作看看
    来个Gif动态操作看看

    2.业务场景

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

    3.编码实现

    3.1 添加Nuget库

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

    MaterialDesign控件库
    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();
            }
    
        }
    }
    

    4.本文参考

    Design com WPF 大神的学习视频:Validate Data Change

    开源控件库:MaterialDesignInXamlToolkit

    本站对MD开源控件库的介绍:控件介绍

    5.代码下载

    Github源码下载:下载

    除非注明,文章均由 Dotnet9 整理发布,欢迎转载。

    转载请注明本文地址:https://dotnet9.com/6823.html

    欢迎扫描下方二维码关注 Dotnet9 的微信公众号,本站会及时推送最新技术文章

    Dotnet9

  • 相关阅读:
    java equals与==的区别
    java中switch能否使用String作为参数?
    java九种数据类型以及封装类
    JavaWeb-----------------Json(一)
    JavaWeb-----------Ajax页面局部刷新(三)
    Linux下的C语言读写练习(二)
    Nginx HTTP负载均衡和反向代理的配置与优化
    kafka端口和zookeeper端口
    Correct the classpath of your application so that it contains a single, compatible version of org.springframework.util.Assert
    nginx简介&nginx基本配置和优化
  • 原文地址:https://www.cnblogs.com/Dotnet9-com/p/12155815.html
Copyright © 2020-2023  润新知