From c7de1fdbe81d13b660f1ccfeb2cd7f786a62fbc4 Mon Sep 17 00:00:00 2001
From: bunny <1319900154@qq.com>
Date: Sun, 22 Jun 2025 23:08:52 +0800
Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E5=88=9D=E5=A7=8B=E5=8C=96?=
=?UTF-8?q?=E5=9F=BA=E7=A1=80=E9=A1=B5=E9=9D=A2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Cors-1-Start/Cors-1-Start.csproj.user} | 0
.../EFCore-3-AccessToken.csproj | 19 +++
.../EFCore-3-AccessToken/Program.cs | 49 +++++++
.../Properties/launchSettings.json | 31 +++++
.../appsettings.Development.json | 0
.../EFCore-3-AccessToken}/appsettings.json | 0
.../ASP-1-WebApi/ASP-1-WebApi.csproj | 15 ---
.../ASP-1-WebApi/ASP-1-WebApi.http | 6 -
CSharp/WPFTutorial/ASP-1-WebApi/Program.cs | 44 -------
.../ASP-Demo-TODO/ASP-Demo-TODO.csproj | 12 ++
.../Controllers/WeatherForecastController.cs | 39 ++++++
CSharp/WPFTutorial/ASP-Demo-TODO/Program.cs | 19 +++
.../Properties/launchSettings.json | 34 ++---
CSharp/WPFTutorial/ASP-Demo-TODO/Startup.cs | 48 +++++++
.../ASP-Demo-TODO/WeatherForecast.cs | 15 +++
.../appsettings.Development.json | 9 ++
.../ASP-Demo-TODO/appsettings.json | 10 ++
CSharp/WPFTutorial/Demo-TODO/App.xaml | 16 +++
CSharp/WPFTutorial/Demo-TODO/App.xaml.cs | 21 +++
CSharp/WPFTutorial/Demo-TODO/AssemblyInfo.cs | 10 ++
CSharp/WPFTutorial/Demo-TODO/Demo-TODO.csproj | 28 ++++
.../Demo-TODO.csproj.DotSettings.user | 3 +
.../WPFTutorial/Demo-TODO/Images/Avatar.jpg | Bin 0 -> 6923 bytes
CSharp/WPFTutorial/Demo-TODO/MainWindow.xaml | 120 ++++++++++++++++++
.../WPFTutorial/Demo-TODO/MainWindow.xaml.cs | 40 ++++++
.../WPFTutorial.sln.DotSettings.user | 3 +-
26 files changed, 503 insertions(+), 88 deletions(-)
rename CSharp/{WPFTutorial/ASP-1-WebApi/ASP-1-WebApi.csproj.user => SQLTutorial/Cors-1-Start/Cors-1-Start.csproj.user} (100%)
create mode 100644 CSharp/SQLTutorial/EFCore-3-AccessToken/EFCore-3-AccessToken.csproj
create mode 100644 CSharp/SQLTutorial/EFCore-3-AccessToken/Program.cs
create mode 100644 CSharp/SQLTutorial/EFCore-3-AccessToken/Properties/launchSettings.json
rename CSharp/{WPFTutorial/ASP-1-WebApi => SQLTutorial/EFCore-3-AccessToken}/appsettings.Development.json (100%)
rename CSharp/{WPFTutorial/ASP-1-WebApi => SQLTutorial/EFCore-3-AccessToken}/appsettings.json (100%)
delete mode 100644 CSharp/WPFTutorial/ASP-1-WebApi/ASP-1-WebApi.csproj
delete mode 100644 CSharp/WPFTutorial/ASP-1-WebApi/ASP-1-WebApi.http
delete mode 100644 CSharp/WPFTutorial/ASP-1-WebApi/Program.cs
create mode 100644 CSharp/WPFTutorial/ASP-Demo-TODO/ASP-Demo-TODO.csproj
create mode 100644 CSharp/WPFTutorial/ASP-Demo-TODO/Controllers/WeatherForecastController.cs
create mode 100644 CSharp/WPFTutorial/ASP-Demo-TODO/Program.cs
rename CSharp/WPFTutorial/{ASP-1-WebApi => ASP-Demo-TODO}/Properties/launchSettings.json (56%)
create mode 100644 CSharp/WPFTutorial/ASP-Demo-TODO/Startup.cs
create mode 100644 CSharp/WPFTutorial/ASP-Demo-TODO/WeatherForecast.cs
create mode 100644 CSharp/WPFTutorial/ASP-Demo-TODO/appsettings.Development.json
create mode 100644 CSharp/WPFTutorial/ASP-Demo-TODO/appsettings.json
create mode 100644 CSharp/WPFTutorial/Demo-TODO/App.xaml
create mode 100644 CSharp/WPFTutorial/Demo-TODO/App.xaml.cs
create mode 100644 CSharp/WPFTutorial/Demo-TODO/AssemblyInfo.cs
create mode 100644 CSharp/WPFTutorial/Demo-TODO/Demo-TODO.csproj
create mode 100644 CSharp/WPFTutorial/Demo-TODO/Demo-TODO.csproj.DotSettings.user
create mode 100644 CSharp/WPFTutorial/Demo-TODO/Images/Avatar.jpg
create mode 100644 CSharp/WPFTutorial/Demo-TODO/MainWindow.xaml
create mode 100644 CSharp/WPFTutorial/Demo-TODO/MainWindow.xaml.cs
diff --git a/CSharp/WPFTutorial/ASP-1-WebApi/ASP-1-WebApi.csproj.user b/CSharp/SQLTutorial/Cors-1-Start/Cors-1-Start.csproj.user
similarity index 100%
rename from CSharp/WPFTutorial/ASP-1-WebApi/ASP-1-WebApi.csproj.user
rename to CSharp/SQLTutorial/Cors-1-Start/Cors-1-Start.csproj.user
diff --git a/CSharp/SQLTutorial/EFCore-3-AccessToken/EFCore-3-AccessToken.csproj b/CSharp/SQLTutorial/EFCore-3-AccessToken/EFCore-3-AccessToken.csproj
new file mode 100644
index 0000000..2811018
--- /dev/null
+++ b/CSharp/SQLTutorial/EFCore-3-AccessToken/EFCore-3-AccessToken.csproj
@@ -0,0 +1,19 @@
+
+
+
+ net6.0
+ enable
+ enable
+ EFCore_3_AccessToken
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/CSharp/SQLTutorial/EFCore-3-AccessToken/Program.cs b/CSharp/SQLTutorial/EFCore-3-AccessToken/Program.cs
new file mode 100644
index 0000000..6f41110
--- /dev/null
+++ b/CSharp/SQLTutorial/EFCore-3-AccessToken/Program.cs
@@ -0,0 +1,49 @@
+using System.Text;
+using Microsoft.AspNetCore.Authentication.JwtBearer;
+using Microsoft.IdentityModel.Tokens;
+
+var builder = WebApplication.CreateBuilder(args);
+
+builder.Services.AddAuthentication(options =>
+{
+ options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
+ options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
+}).AddJwtBearer(options =>
+{
+ options.RequireHttpsMetadata = false;
+ options.SaveToken = true;
+ options.TokenValidationParameters = new TokenValidationParameters
+ {
+ ValidateIssuerSigningKey = true,
+ IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("123456789134567813")),
+ ValidIssuer = "Bunny",
+ ValidateAudience = true,
+ ValidAudience = "StudentApi",
+ ValidateLifetime = true
+ };
+});
+
+// Add services to the container.
+builder.Services.AddControllers();
+// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
+builder.Services.AddEndpointsApiExplorer();
+builder.Services.AddSwaggerGen();
+
+var app = builder.Build();
+
+// Configure the HTTP request pipeline.
+if (app.Environment.IsDevelopment())
+{
+ app.UseSwagger();
+ app.UseSwaggerUI();
+}
+
+app.UseHttpsRedirection();
+// 身份验证
+app.UseAuthentication();
+// 授权
+app.UseAuthorization();
+
+app.MapControllers();
+
+app.Run();
\ No newline at end of file
diff --git a/CSharp/SQLTutorial/EFCore-3-AccessToken/Properties/launchSettings.json b/CSharp/SQLTutorial/EFCore-3-AccessToken/Properties/launchSettings.json
new file mode 100644
index 0000000..265be8d
--- /dev/null
+++ b/CSharp/SQLTutorial/EFCore-3-AccessToken/Properties/launchSettings.json
@@ -0,0 +1,31 @@
+锘縶
+ "$schema": "https://json.schemastore.org/launchsettings.json",
+ "iisSettings": {
+ "windowsAuthentication": false,
+ "anonymousAuthentication": true,
+ "iisExpress": {
+ "applicationUrl": "http://localhost:23235",
+ "sslPort": 44370
+ }
+ },
+ "profiles": {
+ "EFCore_3_AccessToken": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": true,
+ "launchUrl": "swagger",
+ "applicationUrl": "https://localhost:7264;http://localhost:5093",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ "IIS Express": {
+ "commandName": "IISExpress",
+ "launchBrowser": true,
+ "launchUrl": "swagger",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ }
+ }
+}
diff --git a/CSharp/WPFTutorial/ASP-1-WebApi/appsettings.Development.json b/CSharp/SQLTutorial/EFCore-3-AccessToken/appsettings.Development.json
similarity index 100%
rename from CSharp/WPFTutorial/ASP-1-WebApi/appsettings.Development.json
rename to CSharp/SQLTutorial/EFCore-3-AccessToken/appsettings.Development.json
diff --git a/CSharp/WPFTutorial/ASP-1-WebApi/appsettings.json b/CSharp/SQLTutorial/EFCore-3-AccessToken/appsettings.json
similarity index 100%
rename from CSharp/WPFTutorial/ASP-1-WebApi/appsettings.json
rename to CSharp/SQLTutorial/EFCore-3-AccessToken/appsettings.json
diff --git a/CSharp/WPFTutorial/ASP-1-WebApi/ASP-1-WebApi.csproj b/CSharp/WPFTutorial/ASP-1-WebApi/ASP-1-WebApi.csproj
deleted file mode 100644
index 413c47b..0000000
--- a/CSharp/WPFTutorial/ASP-1-WebApi/ASP-1-WebApi.csproj
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
- net8.0
- enable
- enable
- ASP_1_WebApi
-
-
-
-
-
-
-
-
diff --git a/CSharp/WPFTutorial/ASP-1-WebApi/ASP-1-WebApi.http b/CSharp/WPFTutorial/ASP-1-WebApi/ASP-1-WebApi.http
deleted file mode 100644
index bbc1227..0000000
--- a/CSharp/WPFTutorial/ASP-1-WebApi/ASP-1-WebApi.http
+++ /dev/null
@@ -1,6 +0,0 @@
-@ASP_1_WebApi_HostAddress = http://localhost:5076
-
-GET {{ASP_1_WebApi_HostAddress}}/weatherforecast/
-Accept: application/json
-
-###
diff --git a/CSharp/WPFTutorial/ASP-1-WebApi/Program.cs b/CSharp/WPFTutorial/ASP-1-WebApi/Program.cs
deleted file mode 100644
index 161f695..0000000
--- a/CSharp/WPFTutorial/ASP-1-WebApi/Program.cs
+++ /dev/null
@@ -1,44 +0,0 @@
-var builder = WebApplication.CreateBuilder(args);
-
-// Add services to the container.
-// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
-builder.Services.AddEndpointsApiExplorer();
-builder.Services.AddSwaggerGen();
-
-var app = builder.Build();
-
-// Configure the HTTP request pipeline.
-if (app.Environment.IsDevelopment())
-{
- app.UseSwagger();
- app.UseSwaggerUI();
-}
-
-app.UseHttpsRedirection();
-
-var summaries = new[]
-{
- "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
-};
-
-app.MapGet("/weatherforecast", () =>
- {
- var forecast = Enumerable.Range(1, 5).Select(index =>
- new WeatherForecast
- (
- DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
- Random.Shared.Next(-20, 55),
- summaries[Random.Shared.Next(summaries.Length)]
- ))
- .ToArray();
- return forecast;
- })
- .WithName("GetWeatherForecast")
- .WithOpenApi();
-
-app.Run();
-
-record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary)
-{
- public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
-}
\ No newline at end of file
diff --git a/CSharp/WPFTutorial/ASP-Demo-TODO/ASP-Demo-TODO.csproj b/CSharp/WPFTutorial/ASP-Demo-TODO/ASP-Demo-TODO.csproj
new file mode 100644
index 0000000..9a3dbf0
--- /dev/null
+++ b/CSharp/WPFTutorial/ASP-Demo-TODO/ASP-Demo-TODO.csproj
@@ -0,0 +1,12 @@
+
+
+
+ net5.0
+ ASP_Demo_TODO
+
+
+
+
+
+
+
diff --git a/CSharp/WPFTutorial/ASP-Demo-TODO/Controllers/WeatherForecastController.cs b/CSharp/WPFTutorial/ASP-Demo-TODO/Controllers/WeatherForecastController.cs
new file mode 100644
index 0000000..2610aab
--- /dev/null
+++ b/CSharp/WPFTutorial/ASP-Demo-TODO/Controllers/WeatherForecastController.cs
@@ -0,0 +1,39 @@
+锘縰sing Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Logging;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace ASP_Demo_TODO.Controllers
+{
+ [ApiController]
+ [Route("[controller]")]
+ public class WeatherForecastController : ControllerBase
+ {
+ private static readonly string[] Summaries = new[]
+ {
+ "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
+ };
+
+ private readonly ILogger _logger;
+
+ public WeatherForecastController(ILogger logger)
+ {
+ _logger = logger;
+ }
+
+ [HttpGet]
+ public IEnumerable Get()
+ {
+ var rng = new Random();
+ return Enumerable.Range(1, 5).Select(index => new WeatherForecast
+ {
+ Date = DateTime.Now.AddDays(index),
+ TemperatureC = rng.Next(-20, 55),
+ Summary = Summaries[rng.Next(Summaries.Length)]
+ })
+ .ToArray();
+ }
+ }
+}
diff --git a/CSharp/WPFTutorial/ASP-Demo-TODO/Program.cs b/CSharp/WPFTutorial/ASP-Demo-TODO/Program.cs
new file mode 100644
index 0000000..37ce889
--- /dev/null
+++ b/CSharp/WPFTutorial/ASP-Demo-TODO/Program.cs
@@ -0,0 +1,19 @@
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.Extensions.Hosting;
+
+namespace ASP_Demo_TODO
+{
+ public class Program
+ {
+ public static void Main(string[] args)
+ {
+ CreateHostBuilder(args).Build().Run();
+ }
+
+ public static IHostBuilder CreateHostBuilder(string[] args)
+ {
+ return Host.CreateDefaultBuilder(args)
+ .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup(); });
+ }
+ }
+}
\ No newline at end of file
diff --git a/CSharp/WPFTutorial/ASP-1-WebApi/Properties/launchSettings.json b/CSharp/WPFTutorial/ASP-Demo-TODO/Properties/launchSettings.json
similarity index 56%
rename from CSharp/WPFTutorial/ASP-1-WebApi/Properties/launchSettings.json
rename to CSharp/WPFTutorial/ASP-Demo-TODO/Properties/launchSettings.json
index 551466e..2362304 100644
--- a/CSharp/WPFTutorial/ASP-1-WebApi/Properties/launchSettings.json
+++ b/CSharp/WPFTutorial/ASP-Demo-TODO/Properties/launchSettings.json
@@ -4,31 +4,11 @@
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
- "applicationUrl": "http://localhost:53934",
- "sslPort": 44328
+ "applicationUrl": "http://localhost:9705",
+ "sslPort": 44384
}
},
"profiles": {
- "http": {
- "commandName": "Project",
- "dotnetRunMessages": true,
- "launchBrowser": true,
- "launchUrl": "swagger",
- "applicationUrl": "http://localhost:5076",
- "environmentVariables": {
- "ASPNETCORE_ENVIRONMENT": "Development"
- }
- },
- "https": {
- "commandName": "Project",
- "dotnetRunMessages": true,
- "launchBrowser": true,
- "launchUrl": "swagger",
- "applicationUrl": "https://localhost:7295;http://localhost:5076",
- "environmentVariables": {
- "ASPNETCORE_ENVIRONMENT": "Development"
- }
- },
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
@@ -36,6 +16,16 @@
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
+ },
+ "ASP_Demo_TODO": {
+ "commandName": "Project",
+ "dotnetRunMessages": "true",
+ "launchBrowser": true,
+ "launchUrl": "swagger",
+ "applicationUrl": "https://localhost:5001;http://localhost:5000",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
}
}
}
diff --git a/CSharp/WPFTutorial/ASP-Demo-TODO/Startup.cs b/CSharp/WPFTutorial/ASP-Demo-TODO/Startup.cs
new file mode 100644
index 0000000..501847a
--- /dev/null
+++ b/CSharp/WPFTutorial/ASP-Demo-TODO/Startup.cs
@@ -0,0 +1,48 @@
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using Microsoft.OpenApi.Models;
+
+namespace ASP_Demo_TODO
+{
+ public class Startup
+ {
+ public Startup(IConfiguration configuration)
+ {
+ Configuration = configuration;
+ }
+
+ public IConfiguration Configuration { get; }
+
+ // This method gets called by the runtime. Use this method to add services to the container.
+ public void ConfigureServices(IServiceCollection services)
+ {
+ services.AddControllers();
+ services.AddSwaggerGen(c =>
+ {
+ c.SwaggerDoc("v1", new OpenApiInfo { Title = "ASP_Demo_TODO", Version = "v1" });
+ });
+ }
+
+ // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
+ public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
+ {
+ if (env.IsDevelopment())
+ {
+ app.UseDeveloperExceptionPage();
+ app.UseSwagger();
+ app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "ASP_Demo_TODO v1"));
+ }
+
+ app.UseHttpsRedirection();
+
+ app.UseRouting();
+
+ app.UseAuthorization();
+
+ app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
+ }
+ }
+}
\ No newline at end of file
diff --git a/CSharp/WPFTutorial/ASP-Demo-TODO/WeatherForecast.cs b/CSharp/WPFTutorial/ASP-Demo-TODO/WeatherForecast.cs
new file mode 100644
index 0000000..67e808c
--- /dev/null
+++ b/CSharp/WPFTutorial/ASP-Demo-TODO/WeatherForecast.cs
@@ -0,0 +1,15 @@
+using System;
+
+namespace ASP_Demo_TODO
+{
+ public class WeatherForecast
+ {
+ public DateTime Date { get; set; }
+
+ public int TemperatureC { get; set; }
+
+ public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
+
+ public string Summary { get; set; }
+ }
+}
diff --git a/CSharp/WPFTutorial/ASP-Demo-TODO/appsettings.Development.json b/CSharp/WPFTutorial/ASP-Demo-TODO/appsettings.Development.json
new file mode 100644
index 0000000..8983e0f
--- /dev/null
+++ b/CSharp/WPFTutorial/ASP-Demo-TODO/appsettings.Development.json
@@ -0,0 +1,9 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft": "Warning",
+ "Microsoft.Hosting.Lifetime": "Information"
+ }
+ }
+}
diff --git a/CSharp/WPFTutorial/ASP-Demo-TODO/appsettings.json b/CSharp/WPFTutorial/ASP-Demo-TODO/appsettings.json
new file mode 100644
index 0000000..d9d9a9b
--- /dev/null
+++ b/CSharp/WPFTutorial/ASP-Demo-TODO/appsettings.json
@@ -0,0 +1,10 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft": "Warning",
+ "Microsoft.Hosting.Lifetime": "Information"
+ }
+ },
+ "AllowedHosts": "*"
+}
diff --git a/CSharp/WPFTutorial/Demo-TODO/App.xaml b/CSharp/WPFTutorial/Demo-TODO/App.xaml
new file mode 100644
index 0000000..3ee803c
--- /dev/null
+++ b/CSharp/WPFTutorial/Demo-TODO/App.xaml
@@ -0,0 +1,16 @@
+锘
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/CSharp/WPFTutorial/Demo-TODO/App.xaml.cs b/CSharp/WPFTutorial/Demo-TODO/App.xaml.cs
new file mode 100644
index 0000000..9b64eec
--- /dev/null
+++ b/CSharp/WPFTutorial/Demo-TODO/App.xaml.cs
@@ -0,0 +1,21 @@
+锘縰sing System.Windows;
+using Prism.DryIoc;
+using Prism.Ioc;
+
+namespace Demo_TODO
+{
+ ///
+ /// Interaction logic for App.xaml
+ ///
+ public partial class App : PrismApplication
+ {
+ protected override void RegisterTypes(IContainerRegistry containerRegistry)
+ {
+ }
+
+ protected override Window CreateShell()
+ {
+ return Container.Resolve();
+ }
+ }
+}
\ No newline at end of file
diff --git a/CSharp/WPFTutorial/Demo-TODO/AssemblyInfo.cs b/CSharp/WPFTutorial/Demo-TODO/AssemblyInfo.cs
new file mode 100644
index 0000000..4a05c7d
--- /dev/null
+++ b/CSharp/WPFTutorial/Demo-TODO/AssemblyInfo.cs
@@ -0,0 +1,10 @@
+using System.Windows;
+
+[assembly: ThemeInfo(
+ ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
+ //(used if a resource is not found in the page,
+ // or application resource dictionaries)
+ ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
+ //(used if a resource is not found in the page,
+ // app, or any theme specific resource dictionaries)
+)]
\ No newline at end of file
diff --git a/CSharp/WPFTutorial/Demo-TODO/Demo-TODO.csproj b/CSharp/WPFTutorial/Demo-TODO/Demo-TODO.csproj
new file mode 100644
index 0000000..dfebb65
--- /dev/null
+++ b/CSharp/WPFTutorial/Demo-TODO/Demo-TODO.csproj
@@ -0,0 +1,28 @@
+锘
+
+
+ WinExe
+ net5.0-windows
+ Demo_TODO
+ enable
+ true
+
+
+
+
+
+
+
+
+
+ ..\..\..\..\..\..\..\software\Plugins\nuget\materialdesignthemes\5.2.2-ci998\lib\net8.0\MaterialDesignThemes.Wpf.dll
+
+
+
+
+
+ Always
+
+
+
+
diff --git a/CSharp/WPFTutorial/Demo-TODO/Demo-TODO.csproj.DotSettings.user b/CSharp/WPFTutorial/Demo-TODO/Demo-TODO.csproj.DotSettings.user
new file mode 100644
index 0000000..2d29cdf
--- /dev/null
+++ b/CSharp/WPFTutorial/Demo-TODO/Demo-TODO.csproj.DotSettings.user
@@ -0,0 +1,3 @@
+锘
+
+ ..\..\..\..\..\..\..\software\Plugins\nuget\materialdesignthemes\4.1.0\lib\netcoreapp3.1\MaterialDesignThemes.Wpf.dll\Themes\MaterialDesign3.Defaults.xaml
\ No newline at end of file
diff --git a/CSharp/WPFTutorial/Demo-TODO/Images/Avatar.jpg b/CSharp/WPFTutorial/Demo-TODO/Images/Avatar.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..a899a73a744962c4948eab3e2cede3fb3ccf68e8
GIT binary patch
literal 6923
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