2025-11-08
C#
00

背景介绍

在现代软件开发中,高效处理大数据量是一个常见且具有挑战性的任务。SQLite作为一个轻量级、无服务器的关系型数据库,在C#中提供了强大的数据处理能力。本文将深入探讨如何使用SQLite优化大数据量的存储和检索。

准备工作

首先,我们需要引入必要的NuGet包:

C#
// 使用System.Data.SQLite进行SQLite数据库操作 using System.Data.SQLite;

image.png

2025-11-08
C#
00

SqlSugar是一个非常强大且轻量级的ORM(对象关系映射)框架,支持多种数据库,包括SQLite。本文将详细介绍如何在C#中使用SqlSugar操作SQLite数据库。

准备工作

安装NuGet包

首先,需要安装以下NuGet包:

  • SqlSugarCore
  • System.Data.SQLite.Core

可以通过NuGet包管理器或Package Manager Console安装:

Bash
Install-Package SqlSugarCore Install-Package System.Data.SQLite.Core

基本配置

数据库连接配置

C#
using SqlSugar; public class DatabaseConfig { public static SqlSugarClient GetClient() { SqlSugarClient db = new SqlSugarClient(new ConnectionConfig() { ConnectionString = "Data Source=mydatabase.sqlite", // SQLite数据库路径 DbType = DbType.Sqlite, // 指定数据库类型为SQLite IsAutoCloseConnection = true, // 自动释放连接 InitKeyType = InitKeyType.Attribute // 主键配置方式 }); // 开启SQL执行日志 db.Aop.OnLogExecuting = (sql, pars) => { Console.WriteLine(sql); // 打印SQL语句 }; return db; } }
2025-11-08
C#
00

并发控制的重要性

在多线程环境中访问SQLite数据库时,并发控制至关重要。不当的并发访问可能导致数据不一致、竞态条件和潜在的数据损坏。本文将详细探讨C#中SQLite的并发控制策略。

准备环境

安装 SQLite

首先,你需要在你的 C# 项目中安装 SQLite 的 NuGet 包:

PowerShell
`Install-Package System.Data.SQLite`

image.png

2025-11-08
C#
00

你是否遇到过这样的尴尬场景:客户看着你开发的软件,文件上传时那个丑陋的默认进度条,皱着眉头说"这个进度条能不能好看点?"或者用户反馈"为什么进度条卡住不动了,是不是程序死了?"

根据用户体验调研数据显示,78%的用户会因为界面不美观而对软件产生负面印象,而进度条作为用户等待时的唯一交互元素,其重要性不言而喻。

今天这篇文章将彻底解决你的ProgressBar痛点问题,从基础应用到炫酷样式定制,让你的C#开发技能再上一个台阶!

🔍 问题分析:ProgressBar的常见痛点

在WPF开发中,ProgressBar看似简单,但实际应用中却存在诸多问题:

  • 视觉单调:默认样式过于朴素,无法满足现代UI设计需求
  • 用户体验差:缺乏动画效果,用户无法感知进度变化
  • 功能局限:无法显示具体进度数值或状态信息
  • 性能问题:频繁更新可能导致UI线程阻塞

💡 解决方案全攻略

🎨 方案一:基础ProgressBar的正确使用

首先,让我们掌握ProgressBar的基础用法和最佳实践:

XML
<Window x:Class="AppProgressBar.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:AppProgressBar" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <Grid Margin="20"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <!-- 基础进度条 --> <StackPanel Grid.Row="0" Margin="0,10"> <TextBlock Text="文件下载进度" FontWeight="Bold" Margin="0,0,0,5"/> <ProgressBar x:Name="BasicProgressBar" Height="25" Minimum="0" Maximum="100" Value="{Binding Progress}"/> <TextBlock Text="{Binding ProgressText}" HorizontalAlignment="Center" Margin="0,5"/> </StackPanel> <!-- 不确定进度条 --> <StackPanel Grid.Row="1" Margin="0,10"> <TextBlock Text="数据处理中..." FontWeight="Bold" Margin="0,0,0,5"/> <ProgressBar x:Name="IndeterminateProgressBar" Height="25" IsIndeterminate="True"/> </StackPanel> <!-- 控制按钮 --> <StackPanel Grid.Row="2" Orientation="Horizontal" HorizontalAlignment="Center" Margin="0,20"> <Button Content="开始下载" Click="StartDownload_Click" Margin="5" Padding="10,5"/> <Button Content="暂停" Click="PauseDownload_Click" Margin="5" Padding="10,5"/> </StackPanel> </Grid> </Window>
C#
using System.ComponentModel; using System.Text; 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; using System.Windows.Threading; namespace AppProgressBar { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window, INotifyPropertyChanged { private double _progress; private string _progressText = "等待开始..."; // 设置初始值 private DispatcherTimer _timer; private bool _isPaused; public MainWindow() { InitializeComponent(); DataContext = this; InitializeTimer(); } // 进度属性,支持数据绑定 public double Progress { get => _progress; set { if (_progress != value) // 只在值真正改变时触发通知 { _progress = value; OnPropertyChanged(nameof(Progress)); // 同时更新进度文本 ProgressText = $"{value:F1}% 已完成"; } } } public string ProgressText { get => _progressText; set { if (_progressText != value) // 只在值真正改变时触发通知 { _progressText = value; OnPropertyChanged(nameof(ProgressText)); } } } // 初始化定时器模拟进度更新 private void InitializeTimer() { _timer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(100) // 100ms更新一次,保证流畅性 }; _timer.Tick += Timer_Tick; } private void Timer_Tick(object sender, EventArgs e) { if (!_isPaused && Progress < 100) { Progress += 0.5; // 每次增加0.5% } else if (Progress >= 100) { _timer.Stop(); ProgressText = "下载完成!"; } } private void StartDownload_Click(object sender, RoutedEventArgs e) { if (Progress >= 100) // 如果已完成,重置进度 { Progress = 0; } _isPaused = false; _timer.Start(); IndeterminateProgressBar.IsIndeterminate = false; // 停止不确定动画 // 重置暂停按钮文本 var pauseButton = sender as Button; var parent = ((StackPanel)pauseButton.Parent); var pauseBtn = parent.Children.OfType<Button>().LastOrDefault(); if (pauseBtn != null) pauseBtn.Content = "暂停"; } private void PauseDownload_Click(object sender, RoutedEventArgs e) { _isPaused = !_isPaused; ((Button)sender).Content = _isPaused ? "继续" : "暂停"; } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } }

image.png

2025-11-08
C#
00

"公司要求项目升级到WPF,但是我完全摸不着头脑。连个简单的日期控件都不知道怎么用了!"这话让我想起了自己当年的转型经历。据统计,超过60%的.NET桌面开发者仍在使用WinForm,但随着现代化UI需求的增长,WPF转型已经成为必然趋势。

今天我们就从最常用的DatePicker控件入手,让你彻底掌握WPF开发的核心思路,告别转型焦虑!

🔍 痛点分析:为什么WinForm开发者转WPF这么难?

很多WinForm开发者在转型时都会遇到这些问题:

  • 思维方式转变:从代码驱动界面到XAML声明式开发
  • 数据绑定困惑:不理解双向绑定和MVVM模式
  • 样式定制迷茫:不知道如何自定义控件外观

其实,核心问题就是没有掌握WPF的设计哲学

💡 解决方案:5个实战技巧让你快速上手

🎯 技巧1:基础使用对比,建立认知桥梁

WinForm中的做法:

C#
// 传统WinForm方式 dateTimePicker1.Value = DateTime.Now; var selectedDate = dateTimePicker1.Value;

WPF中的新思路:

XML
<Window x:Class="AppDateTimePicker.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:AppDateTimePicker" mc:Ignorable="d" xmlns:sys="clr-namespace:System;assembly=mscorlib" Title="MainWindow" Height="450" Width="800"> <Window.Resources> <sys:DateTime x:Key="now"> </sys:DateTime> </Window.Resources> <StackPanel Margin="20"> <!-- 实时显示选中日期 --> <TextBlock Text="{Binding ElementName=myDatePicker, Path=SelectedDate, StringFormat='选中日期:{0:yyyy-MM-dd}'}" FontSize="16" Margin="0,0,0,10" /> <!-- DatePicker控件 --> <DatePicker x:Name="myDatePicker" SelectedDate="{x:Static sys:DateTime.Now}" Width="150" /> </StackPanel> </Window>

image.png