构建智能暖箱监控系统:基于C#和WPF的完整指南

news2024/11/28 18:41:40

在这里插入图片描述

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:Java Fans的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:Java案例分享专栏
✨特色专栏:国学周更-心性养成之路
🥭本文内容:构建智能暖箱监控系统:基于C#和WPF的完整指南

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

文章目录

    • 前言
      • 1. 项目结构
        • 1.1 Views(视图)
        • 1.2 ViewModels(视图模型)
        • 1.3 Models(模型)
        • 1.4 App.xaml
        • 1.5 其他建议
      • 2. 登录界面
        • 2.1 设计思路
        • 2.2 界面布局
        • 2.3 功能实现
        • 2.4 交互逻辑
        • 2.5 错误处理
      • 3. 注册界面
        • 3.1 设计思路
        • 3.2 界面布局
        • 3.3 功能实现
        • 3.4 交互逻辑
        • 3.5 错误处理
      • 4. 用户管理界面
        • 4.1 设计思路
        • 4.2 界面布局
        • 4.3 视图模型实现
        • 4.4 用户模型
        • 4.5 用户服务
        • 4.6 添加用户界面
        • 4.7 编辑用户界面
        • 4.8 交互逻辑
        • 4.9 错误处理
      • 5. 上位机监控界面
        • 5.1 设计思路
        • 5.2 界面布局
        • 5.3 功能实现
        • 5.4 数据模型
        • 5.5 交互逻辑
        • 5.6 错误处理
    • 总结
    • 投票

在这里插入图片描述

前言

  在现代农业和实验室研究中,温度和湿度的精确控制至关重要。暖箱监控系统作为一种高效的环境控制工具,能够实时监测和调节内部条件,以确保植物生长或实验样本的最佳状态。本文将详细介绍如何使用C#和WPF构建一个功能全面的暖箱监控系统。我们将涵盖系统的各个模块,包括用户登录、注册、用户管理以及实时监控界面,旨在为开发者提供一个清晰的实现框架和实用的代码示例。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的参考和启发。让我们一起探索如何将理论转化为实践,构建一个智能的暖箱监控系统。

1. 项目结构

  在构建一个基于C#和WPF的暖箱监控系统时,合理的项目结构是确保代码可维护性和可扩展性的关键。以下是项目结构的详细阐述:

WarmBoxMonitoringSystem
│
├── Views
│   ├── LoginView.xaml
│   ├── RegisterView.xaml
│   ├── UserManagementView.xaml
│   └── MonitoringView.xaml
│
├── ViewModels
│   ├── LoginViewModel.cs
│   ├── RegisterViewModel.cs
│   ├── UserManagementViewModel.cs
│   └── MonitoringViewModel.cs
│
├── Models
│   ├── User.cs
│   └── MonitoringData.cs
│
└── App.xaml
1.1 Views(视图)

Views 文件夹包含所有用户界面的 XAML 文件。每个视图负责展示特定的功能模块,确保用户能够与系统进行交互。

  • LoginView.xaml:登录界面,用户输入用户名和密码以访问系统。
  • RegisterView.xaml:注册界面,允许新用户创建账户。
  • UserManagementView.xaml:用户管理界面,管理员可以查看、添加或删除用户。
  • MonitoringView.xaml:上位机监控界面,实时显示暖箱的温度和湿度数据。
1.2 ViewModels(视图模型)

ViewModels 文件夹包含与视图相对应的视图模型类。视图模型负责处理用户输入、业务逻辑和数据绑定,遵循 MVVM(Model-View-ViewModel)设计模式。

  • LoginViewModel.cs:处理登录逻辑,包括验证用户凭据和导航到其他视图。
  • RegisterViewModel.cs:处理用户注册逻辑,包括输入验证和账户创建。
  • UserManagementViewModel.cs:管理用户列表,处理添加和删除用户的命令。
  • MonitoringViewModel.cs:负责获取和更新监控数据,处理数据的刷新和展示。
1.3 Models(模型)

Models 文件夹包含数据模型类,定义系统中使用的数据结构。

  • User.cs:表示用户的基本信息,包括用户名和密码。
  • MonitoringData.cs:表示监控数据的结构,包括时间戳、温度和湿度等属性。
1.4 App.xaml

App.xaml 是应用程序的入口点,定义了应用程序的资源和启动逻辑。它通常包含全局样式、主题和其他共享资源。

1.5 其他建议

在实际开发中,可能还需要添加以下文件夹和文件以增强项目的功能和可维护性:

  • Services:用于处理与数据库或外部 API 的交互。
  • Utilities:包含常用的工具类和扩展方法。
  • Resources:存放应用程序的资源文件,如图标、样式和语言文件。

  合理的项目结构不仅能提高代码的可读性和可维护性,还能帮助团队成员更快地理解和参与项目开发。通过将视图、视图模型和模型分开,我们可以更好地遵循 MVVM 模式,使得代码逻辑清晰,便于后期的扩展和修改。

2. 登录界面

  登录界面是用户访问暖箱监控系统的第一步,负责验证用户身份并提供安全的访问控制。以下是登录界面的详细阐述,包括设计思路、功能实现和代码示例。

2.1 设计思路

登录界面的设计应简洁明了,用户能够快速输入凭据并进行登录。主要功能包括:

  • 用户名和密码输入框
  • 登录按钮
  • 注册链接,方便新用户创建账户
  • 错误提示信息,帮助用户识别输入错误
2.2 界面布局

LoginView.xaml

<Window x:Class="WarmBoxMonitoringSystem.Views.LoginView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="登录" Height="300" Width="400">
    <Grid>
        <StackPanel VerticalAlignment="Center" HorizontalAlignment="Center" Width="300">
            <TextBox Name="Username" PlaceholderText="用户名" Margin="0,0,0,10" />
            <PasswordBox Name="Password" PlaceholderText="密码" Margin="0,0,0,10" />
            <Button Content="登录" Command="{Binding LoginCommand}" Margin="0,0,0,10" />
            <TextBlock Text="没有账户?注册" Foreground="Blue" Cursor="Hand" MouseDown="{Binding NavigateToRegisterCommand}" />
            <TextBlock Name="ErrorMessage" Foreground="Red" Visibility="Collapsed" />
        </StackPanel>
    </Grid>
</Window>
2.3 功能实现

LoginViewModel.cs

public class LoginViewModel : INotifyPropertyChanged
{
    private string _username;
    private string _password;
    private string _errorMessage;

    public string Username
    {
        get => _username;
        set
        {
            _username = value;
            OnPropertyChanged();
        }
    }

    public string Password
    {
        get => _password;
        set
        {
            _password = value;
            OnPropertyChanged();
        }
    }

    public string ErrorMessage
    {
        get => _errorMessage;
        set
        {
            _errorMessage = value;
            OnPropertyChanged();
        }
    }

    public ICommand LoginCommand { get; }
    public ICommand NavigateToRegisterCommand { get; }

    public LoginViewModel()
    {
        LoginCommand = new RelayCommand(Login);
        NavigateToRegisterCommand = new RelayCommand(NavigateToRegister);
    }

    private void Login()
    {
        // 模拟用户验证逻辑
        if (string.IsNullOrEmpty(Username) || string.IsNullOrEmpty(Password))
        {
            ErrorMessage = "用户名和密码不能为空。";
            return;
        }

        // 假设有一个用户验证服务
        bool isValidUser = UserService.ValidateUser(Username, Password);
        if (isValidUser)
        {
            // 登录成功,导航到主界面
            NavigateToMainView();
        }
        else
        {
            ErrorMessage = "用户名或密码错误。";
        }
    }

    private void NavigateToRegister()
    {
        // 导航到注册界面
    }

    private void NavigateToMainView()
    {
        // 导航到主监控界面
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
2.4 交互逻辑
  • 输入验证:在用户点击登录按钮时,首先检查用户名和密码是否为空。如果为空,显示错误信息。
  • 用户验证:调用用户验证服务(如数据库查询)来确认用户凭据的有效性。
  • 导航功能:如果登录成功,导航到主监控界面;如果失败,更新错误信息以提示用户。
2.5 错误处理

在登录过程中,错误处理非常重要。可以通过以下方式增强用户体验:

  • 即时反馈:在用户输入错误时,及时更新错误信息。
  • 清晰的提示:确保错误信息简洁明了,帮助用户理解问题所在。

  登录界面是用户与暖箱监控系统交互的第一步,设计时应注重用户体验和安全性。通过合理的布局、清晰的功能实现和有效的错误处理,可以确保用户顺利登录并开始使用系统。

3. 注册界面

  注册界面是用户创建新账户的入口,负责收集用户的基本信息并进行验证。一个良好的注册界面不仅能提高用户体验,还能确保系统的安全性。以下是注册界面的详细阐述,包括设计思路、功能实现和代码示例。

3.1 设计思路

注册界面的设计应简洁明了,用户能够快速输入所需信息。主要功能包括:

  • 用户名和密码输入框
  • 确认密码输入框
  • 注册按钮
  • 返回登录链接,方便已有账户的用户登录
  • 错误提示信息,帮助用户识别输入错误
3.2 界面布局

RegisterView.xaml

<Window x:Class="WarmBoxMonitoringSystem.Views.RegisterView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="注册" Height="350" Width="400">
    <Grid>
        <StackPanel VerticalAlignment="Center" HorizontalAlignment="Center" Width="300">
            <TextBox Name="Username" PlaceholderText="用户名" Margin="0,0,0,10" />
            <PasswordBox Name="Password" PlaceholderText="密码" Margin="0,0,0,10" />
            <PasswordBox Name="ConfirmPassword" PlaceholderText="确认密码" Margin="0,0,0,10" />
            <Button Content="注册" Command="{Binding RegisterCommand}" Margin="0,0,0,10" />
            <TextBlock Text="已有账户?登录" Foreground="Blue" Cursor="Hand" MouseDown="{Binding NavigateToLoginCommand}" />
            <TextBlock Name="ErrorMessage" Foreground="Red" Visibility="Collapsed" />
        </StackPanel>
    </Grid>
</Window>
3.3 功能实现

RegisterViewModel.cs

public class RegisterViewModel : INotifyPropertyChanged
{
    private string _username;
    private string _password;
    private string _confirmPassword;
    private string _errorMessage;

    public string Username
    {
        get => _username;
        set
        {
            _username = value;
            OnPropertyChanged();
        }
    }

    public string Password
    {
        get => _password;
        set
        {
            _password = value;
            OnPropertyChanged();
        }
    }

    public string ConfirmPassword
    {
        get => _confirmPassword;
        set
        {
            _confirmPassword = value;
            OnPropertyChanged();
        }
    }

    public string ErrorMessage
    {
        get => _errorMessage;
        set
        {
            _errorMessage = value;
            OnPropertyChanged();
        }
    }

    public ICommand RegisterCommand { get; }
    public ICommand NavigateToLoginCommand { get; }

    public RegisterViewModel()
    {
        RegisterCommand = new RelayCommand(Register);
        NavigateToLoginCommand = new RelayCommand(NavigateToLogin);
    }

    private void Register()
    {
        // 输入验证
        if (string.IsNullOrEmpty(Username) || string.IsNullOrEmpty(Password) || string.IsNullOrEmpty(ConfirmPassword))
        {
            ErrorMessage = "所有字段都是必填的。";
            return;
        }

        if (Password != ConfirmPassword)
        {
            ErrorMessage = "密码和确认密码不匹配。";
            return;
        }

        // 假设有一个用户注册服务
        bool isRegistered = UserService.RegisterUser(Username, Password);
        if (isRegistered)
        {
            // 注册成功,导航到登录界面
            NavigateToLogin();
        }
        else
        {
            ErrorMessage = "注册失败,用户名可能已被使用。";
        }
    }

    private void NavigateToLogin()
    {
        // 导航到登录界面
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
3.4 交互逻辑
  • 输入验证:在用户点击注册按钮时,首先检查所有输入字段是否为空。如果有字段为空,显示错误信息。
  • 密码匹配:确保用户输入的密码和确认密码一致。如果不一致,更新错误信息。
  • 用户注册:调用用户注册服务(如数据库插入)来创建新账户。
  • 导航功能:如果注册成功,导航到登录界面;如果失败,更新错误信息以提示用户。
3.5 错误处理

在注册过程中,错误处理同样重要。可以通过以下方式增强用户体验:

  • 即时反馈:在用户输入错误时,及时更新错误信息。
  • 清晰的提示:确保错误信息简洁明了,帮助用户理解问题所在。

  注册界面是用户创建新账户的重要环节,设计时应注重用户体验和安全性。通过合理的布局、清晰的功能实现和有效的错误处理,可以确保用户顺利注册并开始使用系统。

4. 用户管理界面

  用户管理界面是系统管理员用来管理用户账户的重要模块。它允许管理员查看、添加、编辑和删除用户信息。一个良好的用户管理界面不仅能提高管理效率,还能确保系统的安全性。以下是用户管理界面的详细阐述,包括设计思路、功能实现和代码示例。

4.1 设计思路

用户管理界面的设计应简洁直观,管理员能够快速找到所需功能。主要功能包括:

  • 用户列表展示,显示所有用户的基本信息
  • 添加用户功能,允许管理员创建新用户
  • 删除用户功能,允许管理员删除不再需要的用户
  • 编辑用户功能,允许管理员修改用户信息
  • 搜索功能,方便管理员快速查找特定用户
4.2 界面布局

UserManagementView.xaml

<Window x:Class="WarmBoxMonitoringSystem.Views.UserManagementView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="用户管理" Height="400" Width="600">
    <Grid>
        <StackPanel>
            <TextBox Name="SearchBox" PlaceholderText="搜索用户" Margin="10" 
                     Text="{Binding SearchTerm, UpdateSourceTrigger=PropertyChanged}" />
            <Button Content="搜索" Command="{Binding SearchCommand}" Margin="10" />
            <DataGrid Name="UserDataGrid" ItemsSource="{Binding Users}" AutoGenerateColumns="False" Margin="10">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="用户名" Binding="{Binding Username}" />
                    <DataGridTextColumn Header="创建时间" Binding="{Binding CreatedAt}" />
                    <DataGridTemplateColumn Header="操作">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal">
                                    <Button Content="编辑" Command="{Binding DataContext.EditUserCommand, RelativeSource={RelativeSource AncestorType=Window}}" CommandParameter="{Binding}" />
                                    <Button Content="删除" Command="{Binding DataContext.DeleteUserCommand, RelativeSource={RelativeSource AncestorType=Window}}" CommandParameter="{Binding}" />
                                </StackPanel>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
            </DataGrid>
            <Button Content="添加用户" Command="{Binding AddUserCommand}" Margin="10" />
        </StackPanel>
    </Grid>
</Window>
4.3 视图模型实现

UserManagementViewModel.cs

using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Windows.Input;

public class UserManagementViewModel : INotifyPropertyChanged
{
    private ObservableCollection<User> _users;
    private string _searchTerm;

    public ObservableCollection<User> Users
    {
        get => _users;
        set
        {
            _users = value;
            OnPropertyChanged();
        }
    }

    public string SearchTerm
    {
        get => _searchTerm;
        set
        {
            _searchTerm = value;
            OnPropertyChanged();
        }
    }

    public ICommand AddUserCommand { get; }
    public ICommand EditUserCommand { get; }
    public ICommand DeleteUserCommand { get; }
    public ICommand SearchCommand { get; }

    public UserManagementViewModel()
    {
        Users = new ObservableCollection<User>(UserService.GetAllUsers());
        AddUserCommand = new RelayCommand(AddUser);
        EditUserCommand = new RelayCommand<User>(EditUser);
        DeleteUserCommand = new RelayCommand<User>(DeleteUser);
        SearchCommand = new RelayCommand(SearchUsers);
    }

    private void AddUser()
    {
        // 导航到添加用户界面
        // 例如:NavigationService.Navigate(new AddUserView());
    }

    private void EditUser(User user)
    {
        // 导航到编辑用户界面
        // 例如:NavigationService.Navigate(new EditUserView(user));
    }

    private void DeleteUser(User user)
    {
        if (user != null)
        {
            UserService.DeleteUser(user.Username);
            Users.Remove(user);
        }
    }

    private void SearchUsers()
    {
        var filteredUsers = UserService.GetAllUsers()
            .Where(u => u.Username.Contains(SearchTerm, StringComparison.OrdinalIgnoreCase))
            .ToList();

        Users.Clear();
        foreach (var user in filteredUsers)
        {
            Users.Add(user);
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
4.4 用户模型

User.cs

public class User
{
    public string Username { get; set; }  // 用户名
    public string Password { get; set; }  // 密码(应加密存储)
    public DateTime CreatedAt { get; set; }  // 创建时间

    public User(string username, string password)
    {
        Username = username;
        Password = password;  // 在实际应用中,密码应进行加密处理
        CreatedAt = DateTime.Now;
    }
}

4.5 用户服务

UserService.cs

using System.Collections.Generic;

public static class UserService
{
    private static List<User> _users = new List<User>();

    static UserService()
    {
        // 初始化一些用户数据
        _users.Add(new User { Username = "admin", CreatedAt = DateTime.Now });
        _users.Add(new User { Username = "user1", CreatedAt = DateTime.Now });
    }

    public static List<User> GetAllUsers()
    {
        return _users;
    }

    public static void DeleteUser(string username)
    {
        var user = _users.FirstOrDefault(u => u.Username == username);
        if (user != null)
        {
            _users.Remove(user);
        }
    }
}
4.6 添加用户界面

AddUserView.xaml

<Window x:Class="WarmBoxMonitoringSystem.Views.AddUserView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="添加用户" Height="300" Width="400">
    <Grid>
        <StackPanel VerticalAlignment="Center" HorizontalAlignment="Center" Width="300">
            <TextBox Name="Username" PlaceholderText="用户名" Margin="0,0,0,10" />
            <PasswordBox Name="Password" PlaceholderText="密码" Margin="0,0,0,10" />
            <Button Content="添加" Command="{Binding AddUserCommand}" Margin="0,0,0,10" />
        </StackPanel>
    </Grid>
</Window>

AddUserViewModel.cs

public class AddUserViewModel : INotifyPropertyChanged
{
    private string _username;
    private string _password;

    public string Username
    {
        get => _username;
        set
        {
            _username = value;
            OnPropertyChanged();
        }
    }

    public string Password
    {
        get => _password;
        set
        {
            _password = value;
            OnPropertyChanged();
        }
    }

    public ICommand AddUserCommand { get; }

    public AddUserViewModel()
    {
        AddUserCommand = new RelayCommand(AddUser);
    }

    private void AddUser()
    {
        // 添加用户逻辑
        UserService.AddUser(new User { Username = Username, CreatedAt = DateTime.Now });
        // 返回用户管理界面
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
4.7 编辑用户界面

EditUserView.xaml

<Window x:Class="WarmBoxMonitoringSystem.Views.EditUserView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="编辑用户" Height="300" Width="400">
    <Grid>
        <StackPanel VerticalAlignment="Center" HorizontalAlignment="Center" Width="300">
            <TextBox Name="Username" PlaceholderText="用户名" Margin="0,0,0,10" IsReadOnly="True" />
            <PasswordBox Name="Password" PlaceholderText="新密码" Margin="0,0,0,10" />
            <Button Content="保存" Command="{Binding SaveCommand}" Margin="0,0,0,10" />
        </StackPanel>
    </Grid>
</Window>

EditUserViewModel.cs

public class EditUserViewModel : INotifyPropertyChanged
{
    private User _user;

    public User User
    {
        get => _user;
        set
        {
            _user = value;
            OnPropertyChanged();
        }
    }

    public ICommand SaveCommand { get; }

    public EditUserViewModel(User user)
    {
        User = user;
        SaveCommand = new RelayCommand(SaveUser);
    }

    private void SaveUser()
    {
        // 更新用户逻辑
        // 例如:UserService.UpdateUser(User);
        // 返回用户管理界面
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
4.8 交互逻辑
  • 用户列表展示:使用 DataGrid 控件展示所有用户的信息,包括用户名和创建时间。每行提供编辑和删除按钮。
  • 添加用户:点击“添加用户”按钮时,导航到添加用户界面。
  • 编辑用户:点击“编辑”按钮时,导航到编辑用户界面,并传递选中的用户信息。
  • 删除用户:点击“删除”按钮时,调用删除逻辑,并从用户列表中移除该用户。
  • 搜索功能:在搜索框中输入用户名时,实时过滤用户列表,显示匹配的用户。
4.9 错误处理

在用户管理过程中,错误处理同样重要。可以通过以下方式增强用户体验:

  • 确认删除:在删除用户时,可以弹出确认对话框,确保管理员的操作是有意的。
  • 操作反馈:在添加、编辑或删除用户后,提供操作成功或失败的反馈信息。

  用户管理界面是系统管理员管理用户账户的重要工具,设计时应注重用户体验和操作的直观性。通过合理的布局、清晰的功能实现和有效的错误处理,可以确保管理员高效地管理用户。

5. 上位机监控界面

  上位机监控界面是暖箱监控系统的核心部分,负责实时显示暖箱的环境数据(如温度、湿度等),并提供控制功能。该界面应具备直观的数据显示、实时更新和用户交互功能。以下是上位机监控界面的详细阐述,包括设计思路、功能实现和代码示例。

5.1 设计思路

上位机监控界面的设计应简洁明了,用户能够快速获取所需信息。主要功能包括:

  • 实时数据显示,包括温度、湿度等参数
  • 数据图表展示,便于用户观察趋势
  • 控制按钮,允许用户手动调整暖箱设置
  • 刷新功能,确保数据的实时性
5.2 界面布局

MonitoringView.xaml

<Window x:Class="WarmBoxMonitoringSystem.Views.MonitoringView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="上位机监控" Height="500" Width="800">
    <Grid>
        <StackPanel Margin="10">
            <TextBlock FontSize="20" Text="暖箱监控系统" HorizontalAlignment="Center" />
            <StackPanel Orientation="Horizontal" Margin="0,10">
                <TextBlock Text="当前温度: " FontWeight="Bold" />
                <TextBlock Text="{Binding CurrentTemperature}" FontSize="16" />
                <TextBlock Text=" °C" FontSize="16" />
            </StackPanel>
            <StackPanel Orientation="Horizontal" Margin="0,10">
                <TextBlock Text="当前湿度: " FontWeight="Bold" />
                <TextBlock Text="{Binding CurrentHumidity}" FontSize="16" />
                <TextBlock Text=" %" FontSize="16" />
            </StackPanel>
            <Button Content="刷新" Command="{Binding RefreshCommand}" Margin="0,10" />
            <Button Content="开启加热" Command="{Binding StartHeatingCommand}" Margin="0,10" />
            <Button Content="关闭加热" Command="{Binding StopHeatingCommand}" Margin="0,10" />
            <TextBlock Text="历史数据" FontWeight="Bold" Margin="0,20" />
            <DataGrid ItemsSource="{Binding HistoricalData}" AutoGenerateColumns="False" Margin="0,10">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="时间" Binding="{Binding Timestamp}" />
                    <DataGridTextColumn Header="温度" Binding="{Binding Temperature}" />
                    <DataGridTextColumn Header="湿度" Binding="{Binding Humidity}" />
                </DataGrid.Columns>
            </DataGrid>
        </StackPanel>
    </Grid>
</Window>
5.3 功能实现

MonitoringViewModel.cs

using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows.Input;

public class MonitoringViewModel : INotifyPropertyChanged
{
    private double _currentTemperature;
    private double _currentHumidity;
    private ObservableCollection<MonitoringData> _historicalData;

    public double CurrentTemperature
    {
        get => _currentTemperature;
        set
        {
            _currentTemperature = value;
            OnPropertyChanged();
        }
    }

    public double CurrentHumidity
    {
        get => _currentHumidity;
        set
        {
            _currentHumidity = value;
            OnPropertyChanged();
        }
    }

    public ObservableCollection<MonitoringData> HistoricalData
    {
        get => _historicalData;
        set
        {
            _historicalData = value;
            OnPropertyChanged();
        }
    }

    public ICommand RefreshCommand { get; }
    public ICommand StartHeatingCommand { get; }
    public ICommand StopHeatingCommand { get; }

    public MonitoringViewModel()
    {
        HistoricalData = new ObservableCollection<MonitoringData>();
        RefreshCommand = new RelayCommand(RefreshData);
        StartHeatingCommand = new RelayCommand(StartHeating);
        StopHeatingCommand = new RelayCommand(StopHeating);
        LoadInitialData();
    }

    private void LoadInitialData()
    {
        // 模拟初始数据加载
        CurrentTemperature = 25.0;
        CurrentHumidity = 60.0;
        HistoricalData.Add(new MonitoringData { Timestamp = DateTime.Now, Temperature = CurrentTemperature, Humidity = CurrentHumidity });
    }

    private void RefreshData()
    {
        // 模拟数据刷新
        CurrentTemperature += 0.5; // 假设温度每次刷新增加
        CurrentHumidity -= 1; // 假设湿度每次刷新减少
        HistoricalData.Add(new MonitoringData { Timestamp = DateTime.Now, Temperature = CurrentTemperature, Humidity = CurrentHumidity });
    }

    private void StartHeating()
    {
        // 启动加热逻辑
    }

    private void StopHeating()
    {
        // 停止加热逻辑
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
5.4 数据模型

MonitoringData.cs

public class MonitoringData
{
    public DateTime Timestamp { get; set; }  // 数据记录时间
    public double Temperature { get; set; }  // 温度值
    public double Humidity { get; set; }  // 湿度值

    public MonitoringData(DateTime timestamp, double temperature, double humidity)
    {
        Timestamp = timestamp;
        Temperature = temperature;
        Humidity = humidity;
    }
}

5.5 交互逻辑
  • 实时数据显示:界面上显示当前温度和湿度,使用数据绑定将其与视图模型中的属性关联。
  • 刷新功能:点击“刷新”按钮时,调用 RefreshData 方法,模拟更新温度和湿度,并将新数据添加到历史数据列表中。
  • 控制功能:提供“开启加热”和“关闭加热”按钮,分别调用相应的命令来控制暖箱的加热功能。
  • 历史数据展示:使用 DataGrid 控件展示历史监测数据,包括时间、温度和湿度。
5.6 错误处理

在监控过程中,错误处理同样重要。可以通过以下方式增强用户体验:

  • 数据有效性检查:在更新数据时,确保温度和湿度值在合理范围内。
  • 操作反馈:在启动或停止加热时,提供操作成功或失败的反馈信息。

  上位机监控界面是暖箱监控系统的核心部分,设计时应注重用户体验和数据的实时性。通过合理的布局、清晰的功能实现和有效的错误处理,可以确保用户高效地监控和控制暖箱环境。

总结

  在构建一个基于C#和WPF的暖箱监控系统的过程中,我们详细探讨了系统的各个组成部分,包括项目结构、用户管理界面、注册界面、登录界面、上位机监控界面以及数据模型。通过合理的设计和实现,我们确保了系统的可维护性、可扩展性和用户友好性。每个模块都经过精心设计,以满足用户的需求并提供直观的操作体验。数据模型的设计则为系统提供了坚实的基础,确保数据的完整性和安全性。

投票

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2222354.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

鸿蒙前端-1. 层叠效果

代码Stack&#xff08;{alignContent&#xff1a;Alignment.Center}&#xff09;{ Item1&#xff08;&#xff09; Item2&#xff08;&#xff09; Item3&#xff08;&#xff09;} 默认是居中对齐&#xff0c;后面的Item的优先级比前面的要高。 特点&#xff1a;代码简洁&…

stm32实现esp8266连接到TCP服务器(二)

1.2 连接到TCP Server 1.2.1 使用网络助手&#xff0c;设立TCP服务器 ​ 编辑 1.2.2 连接服务器 ATCIPSTART"TCP","192.168.1.18",8080 //指令&#xff0c;注意双引号逗号都要半角(英文)输入 CONNECT //结果&#xff1a;成功 OK //结果&#xff1a;成功 …

08 实战:色彩空间展示(本程序以视频为主)

程序效果如下: 我在这里讲解RGB和YCbCr的原理: 一、RGB颜色空间 1.1 基本概念 RGB颜色空间是一种最基础和常用的颜色表示方式,它基于人眼感知色彩的三原色原理。RGB分别代表: R(Red):红色G(Green):绿色B(Blue):蓝色通过这三种基本颜色的不同组合,可以产生人眼…

c#编写的各类应用程序、类库的引用(黑白盒)

001 课程简介&#xff0c;C# 语言简介&#xff0c;开发环境准备 (yuque.com)https://www.yuque.com/yuejiangliu/dotnet/timothy-csharp-001 一个Solution里包含多个Project 一、见识 C# 编写的各类应用程序 二、类库的引用&#xff08;黑/白盒引用&#xff09; 1、黑盒引用&a…

杨辉三角算法

给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2: 输入: numRows 1 输出: [[1]]提示: 1 <…

2024ideaUI切换和svn与git的切换,svn的安装和配置,idea集成svn ,2024-10-18日

2024-10-18日 2024的UI实在很不舒服&#xff0c;隐藏了很多按键&#xff1b; 第一步&#xff1a; 视图 -》 外观 -》 工具栏选出来&#xff1b; 结果出来&#xff1a; 运行的按键和设置的按钮 第二步 点击设置的按钮&#xff0c;选择最后一个&#xff0c;重启就行 结果 舒服&…

LabVIEW提高开发效率技巧----用户权限控制

在LabVIEW开发中&#xff0c;用户权限控制是一个重要的设计模块&#xff0c;尤其在多用户系统中&#xff0c;它可以确保数据安全并控制不同用户的操作权限。为了实现用户权限控制&#xff0c;可以通过角色与权限管理模块来进行设计和实施。以下将从多个角度详细说明如何在LabVI…

Quarto ppt模板制作与Rstudio git连接

本篇记录下当前ppt演示中比较流行的quarto document使用情况以及Rstudio与git相连接的一些实操。 1 Quarto ppt模板制作 1.1 Quarto简介&#xff08;来自Kimi&#xff09; Quarto 是一个由 RStudio 的母公司 Posit 团队开发的开源科学和技术出版系统&#xff0c;它建立在 Pan…

Vue3 Composition Admin——基于 Vue 3 的现代化后台管理模板

Vue3 Composition Admin,这是一个基于 Vue 3 的现代化后台管理模板,旨在为开发者提供一个高效、灵活的开发基础。借助 Vue 3 的 Composition API,我们构建了一个可扩展的架构,使得代码更加清晰易读,同时提升了开发效率。 本项目集成了丰富的 UI 组件、动态路由管理和权限…

Android OpenGL光照效果

在计算机图形学领域&#xff0c;光照仿真是一个重要的研究领域&#xff0c;它对游戏画面的提升、电影和电视节目中的电脑生成图像&#xff08;CGI&#xff09;等方面产生了显著影响。通过使用不同的光照算法&#xff0c;我们可以改变场景的外观&#xff0c;例如模拟从白天到夜晚…

安装好的 Nginx 增加 nginx-module-vts 模块

目录 1. nginx-module-vts 准备 2.查看已安装的的 nginx 编译参数 3. 重新编译 nginx 添加 nginx-module-vts 模块 4. 验证 1. nginx-module-vts 准备 # 解压 unzip nginx-module-vts-master.zip # 将解压包移动到/usr/local/目录 mv nginx-module-vts-master /usr/local/ …

杭州威雅学校一席谈:企业家精神的传承

威雅一席谈 ABBEYTALK 《威雅一席谈》是杭州威雅学校为促进家校沟通推出的社区交流平台。我们将定期邀请家长代表分享自身经验与观点&#xff0c;通过真诚且深度的交谈探寻教育新契机。 本期一席谈&#xff0c;我们邀请了杭州威雅优秀学生家长Robin王先生。终身学习、工匠精神是…

Linux系统——dns域名解析

Linux系统——dns域名解析 一、dns域名解析介绍1、DNS核心概念1.1 区域 zone1.2 记录 record 二、DNS服务的配置1、正向解析的配置2、测试dns正常工作3、配置反向解析4、dns复制 三、DNS查询类型四、hosts文件的使用 一、dns域名解析介绍 dns&#xff0c;应用层协议 作用&…

arp代答观察

文章目录 代答和代理简述实验前提先不开启proxy代答的配置开启代答总结 代答和代理简述 ARP&#xff08;地址解析协议&#xff09;是在局域网中用于将IP地址映射到MAC地址的协议。在理解 ARP 代答和 ARP 代理之前&#xff0c;让我们先澄清一下 ARP 的基本工作原理。 ARP 代答&…

标题PLSQL 里面怎么在文件窗口下 ,创建文件夹,并做好常用sql语句的分类

标题PLSQL 里面怎么在文件窗口下 &#xff0c;创建文件夹&#xff0c;并做好常用sql语句的分类&#xff1f; 效果如图&#xff1a; 标题打开plsql,找到文件窗口 找到&#xff0c;窗口下的这个类似文件夹带扳手的这个图标&#xff0c;打开&#xff0c; 打开后&#xff0c;定位…

十一、pico+Unity交互开发教程——手指触控交互(Poke Interaction)

一、XR Poke Interactor 交互包括发起交互的对象&#xff08;Interactor&#xff09;和可被交互的对象&#xff08;Interactable&#xff09;。XR Interaction Toolkit提供了XR Poke Interactor脚本用于实现Poke功能。在LeftHand Controller和RightHand Controller物体下创建名…

LeetCode做题笔记第202题:快乐数

题目描述 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 1.对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。 2.然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。 3.如果这个过程 结…

「C/C++」C++ STL容器库 之 std::set 唯一键的集合容器

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

小鹏汽车股价分析:看涨信号已出现,技术指标显示还有40%的上涨空间

猛兽财经核心观点&#xff1a; &#xff08;1&#xff09;小鹏汽车的股价过去几天有所回落。 &#xff08;2&#xff09;随着需求的上升&#xff0c;该公司的业务发展的还算不错。 &#xff08;3&#xff09;猛兽财经对小鹏汽车股价的技术分析&#xff1a;多头已经将目标指向15…

【通俗理解】Neurosymbolic AI——融合神经网络与符号推理的智慧之力

【通俗理解】Neurosymbolic AI——融合神经网络与符号推理的智慧之力 关键词提炼 #Neurosymbolic AI #神经网络 #符号推理 #感知能力 #逻辑能力 #认知水平 #智慧与力量 第一节&#xff1a;Neurosymbolic AI的类比与核心概念 Neurosymbolic AI就像是给神经网络这位“大力士”…