mirror of
https://github.com/zs-yg/kortapp-z.git
synced 2025-12-07 00:20:43 +08:00
Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d454ac0fdc | ||
|
|
d5c83d854c | ||
|
|
1c2bc713be | ||
|
|
1539c665f0 | ||
|
|
074e55fbbc | ||
|
|
334fa56070 | ||
|
|
0268e13b56 | ||
|
|
cba6c9eeca | ||
|
|
70a776125a | ||
|
|
f7250dae08 |
@@ -51,7 +51,7 @@ namespace AppStore
|
||||
|
||||
// 初始化并添加应用信息
|
||||
infoLabel = new Label();
|
||||
infoLabel.Text = "kortapp-z\n版本: 1.1.1\n作者: zs-yg\n一个简单、开源的应用商店\nkortapp-z是完全免费\n基于.NET8和C/C++的软件";
|
||||
infoLabel.Text = "kortapp-z\n版本: 1.1.3\n作者: zs-yg\n一个简单、开源的应用商店\nkortapp-z是完全免费\n基于.NET8和C/C++的软件";
|
||||
infoLabel.Font = new Font("Microsoft YaHei", 12);
|
||||
infoLabel.AutoSize = false;
|
||||
infoLabel.Width = 300;
|
||||
|
||||
57
AppCard.cs
57
AppCard.cs
@@ -13,7 +13,9 @@ namespace AppStore
|
||||
{
|
||||
private PictureBox iconBox;
|
||||
private Label nameLabel;
|
||||
private Panel namePanel;
|
||||
private Button downloadBtn;
|
||||
private Color borderColor = SystemColors.ControlDark;
|
||||
private static readonly ConcurrentDictionary<string, System.Drawing.Drawing2D.GraphicsPath> PathCache =
|
||||
new ConcurrentDictionary<string, System.Drawing.Drawing2D.GraphicsPath>();
|
||||
|
||||
@@ -27,6 +29,7 @@ namespace AppStore
|
||||
// 确保关键对象不为null
|
||||
iconBox = new PictureBox() { SizeMode = PictureBoxSizeMode.StretchImage };
|
||||
nameLabel = new Label() { Text = string.Empty };
|
||||
namePanel = new Panel();
|
||||
downloadBtn = new Button() { Text = "下载" };
|
||||
|
||||
// 确保DownloadManager已初始化
|
||||
@@ -57,14 +60,29 @@ namespace AppStore
|
||||
iconBox.SizeMode = PictureBoxSizeMode.StretchImage;
|
||||
this.Controls.Add(iconBox);
|
||||
|
||||
// 应用名称
|
||||
// 应用名称 - 使用Panel包裹Label实现边框颜色
|
||||
// namePanel已在构造函数中初始化
|
||||
namePanel.Size = new Size(Width - 20, 40);
|
||||
namePanel.Location = new Point(10, 100);
|
||||
namePanel.Paint += (sender, e) => {
|
||||
ControlPaint.DrawBorder(e.Graphics, namePanel.ClientRectangle,
|
||||
borderColor, ButtonBorderStyle.Solid);
|
||||
};
|
||||
|
||||
nameLabel = new Label();
|
||||
nameLabel.AutoSize = false;
|
||||
nameLabel.Size = new Size(Width - 20, 40);
|
||||
nameLabel.Location = new Point(10, 100);
|
||||
nameLabel.Dock = DockStyle.Fill;
|
||||
nameLabel.Font = new Font("Microsoft YaHei", 10, FontStyle.Bold);
|
||||
nameLabel.TextAlign = ContentAlignment.MiddleCenter;
|
||||
this.Controls.Add(nameLabel);
|
||||
|
||||
namePanel.Controls.Add(nameLabel);
|
||||
|
||||
// 初始主题设置
|
||||
UpdateLabelTheme();
|
||||
|
||||
// 订阅主题变化事件
|
||||
ThemeManager.ThemeChanged += (theme) => UpdateLabelTheme();
|
||||
|
||||
this.Controls.Add(namePanel);
|
||||
|
||||
// 下载按钮
|
||||
downloadBtn = new Button();
|
||||
@@ -92,6 +110,25 @@ namespace AppStore
|
||||
downloadBtn.Visible = ShowDownloadButton;
|
||||
}
|
||||
|
||||
private void UpdateLabelTheme()
|
||||
{
|
||||
if (ThemeManager.CurrentTheme == ThemeManager.ThemeMode.Dark)
|
||||
{
|
||||
nameLabel.BackColor = Color.Black;
|
||||
nameLabel.ForeColor = Color.White;
|
||||
namePanel.BackColor = Color.Black;
|
||||
borderColor = Color.White;
|
||||
}
|
||||
else
|
||||
{
|
||||
nameLabel.BackColor = Color.White;
|
||||
nameLabel.ForeColor = Color.Black;
|
||||
namePanel.BackColor = Color.White;
|
||||
borderColor = SystemColors.ControlDark;
|
||||
}
|
||||
namePanel.Invalidate(); // 触发重绘
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 初始化卡片边框路径
|
||||
/// 使用C++程序计算高性能边框路径并缓存结果
|
||||
@@ -310,8 +347,14 @@ namespace AppStore
|
||||
|
||||
public void UpdateDisplay()
|
||||
{
|
||||
nameLabel.Text = AppName;
|
||||
iconBox.Image = AppIcon;
|
||||
if (nameLabel != null)
|
||||
{
|
||||
nameLabel.Text = AppName;
|
||||
}
|
||||
if (iconBox != null && AppIcon != null)
|
||||
{
|
||||
iconBox.Image = AppIcon;
|
||||
}
|
||||
}
|
||||
|
||||
private void DownloadBtn_Click(object sender, EventArgs e)
|
||||
|
||||
57
AppSearch.cs
Normal file
57
AppSearch.cs
Normal file
@@ -0,0 +1,57 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace AppStore
|
||||
{
|
||||
public static class AppSearch
|
||||
{
|
||||
/// <summary>
|
||||
/// 搜索应用卡片
|
||||
/// </summary>
|
||||
/// <param name="flowPanel">包含应用卡片的FlowLayoutPanel</param>
|
||||
/// <param name="searchText">搜索文本</param>
|
||||
public static void SearchApps(FlowLayoutPanel flowPanel, string searchText)
|
||||
{
|
||||
if (flowPanel == null || string.IsNullOrWhiteSpace(searchText))
|
||||
{
|
||||
ShowAllApps(flowPanel);
|
||||
return;
|
||||
}
|
||||
|
||||
foreach (Control control in flowPanel.Controls)
|
||||
{
|
||||
if (control is AppCard appCard)
|
||||
{
|
||||
bool isMatch = IsMatchSearch(appCard.AppName, searchText);
|
||||
control.Visible = isMatch;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 显示所有应用卡片
|
||||
/// </summary>
|
||||
public static void ShowAllApps(FlowLayoutPanel? flowPanel)
|
||||
{
|
||||
if (flowPanel == null) return;
|
||||
|
||||
foreach (Control control in flowPanel.Controls)
|
||||
{
|
||||
control.Visible = true;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 检查应用名称是否匹配搜索文本
|
||||
/// </summary>
|
||||
private static bool IsMatchSearch(string appName, string searchText)
|
||||
{
|
||||
if (string.IsNullOrEmpty(appName)) return false;
|
||||
|
||||
// 不区分大小写比较
|
||||
return appName.Contains(searchText, StringComparison.OrdinalIgnoreCase);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -33,4 +33,8 @@
|
||||
</None>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="ZXing.Net" Version="0.16.9" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@@ -3,6 +3,7 @@ using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text.Json;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
@@ -85,36 +86,39 @@ namespace AppStore
|
||||
|
||||
private void DownloadFile(DownloadItem downloadItem, string fileName, string url)
|
||||
{
|
||||
string downloadsDir = string.Empty;
|
||||
try
|
||||
{
|
||||
// 设置下载目录为用户文件夹中的Downloads
|
||||
// 获取系统下载文件夹路径
|
||||
// 获取系统下载文件夹路径
|
||||
string downloadsDir;
|
||||
IntPtr pathPtr = IntPtr.Zero;
|
||||
// 获取并验证下载路径
|
||||
downloadsDir = GetDownloadPath();
|
||||
|
||||
try
|
||||
{
|
||||
// 使用SHGetKnownFolderPath API获取下载文件夹
|
||||
var downloadsFolderGuid = new Guid("374DE290-123F-4565-9164-39C4925E467B");
|
||||
if (SHGetKnownFolderPath(downloadsFolderGuid, 0, IntPtr.Zero, out pathPtr) != 0)
|
||||
// 检查路径是否有效
|
||||
if (string.IsNullOrWhiteSpace(downloadsDir))
|
||||
{
|
||||
throw new Exception("无法获取下载文件夹路径");
|
||||
throw new Exception("下载路径为空");
|
||||
}
|
||||
|
||||
downloadsDir = Marshal.PtrToStringUni(pathPtr);
|
||||
// 尝试创建目录(如果不存在)
|
||||
Directory.CreateDirectory(downloadsDir);
|
||||
|
||||
// 验证目录是否可写
|
||||
string testFile = Path.Combine(downloadsDir, "write_test.tmp");
|
||||
File.WriteAllText(testFile, "test");
|
||||
File.Delete(testFile);
|
||||
}
|
||||
catch
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new Exception("无法确定下载文件夹位置,请手动指定下载路径");
|
||||
// 回退到默认下载路径
|
||||
string defaultPath = Path.Combine(
|
||||
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),
|
||||
"Downloads");
|
||||
|
||||
Logger.LogError($"下载路径{downloadsDir}不可用,将使用默认路径: {defaultPath}", ex);
|
||||
downloadsDir = defaultPath;
|
||||
Directory.CreateDirectory(downloadsDir);
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (pathPtr != IntPtr.Zero)
|
||||
{
|
||||
Marshal.FreeCoTaskMem(pathPtr);
|
||||
}
|
||||
}
|
||||
Directory.CreateDirectory(downloadsDir);
|
||||
|
||||
|
||||
|
||||
@@ -309,12 +313,20 @@ namespace AppStore
|
||||
currentProcess.BeginErrorReadLine();
|
||||
progressTimer.Start();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
downloadItem.Status = $"下载错误: {ex.Message}";
|
||||
DownloadCompleted?.Invoke(downloadItem);
|
||||
catch (Exception ex)
|
||||
{
|
||||
string errorDetails = $"下载错误: {ex.Message}\n";
|
||||
errorDetails += $"目标路径: {downloadsDir}\n";
|
||||
errorDetails += $"URL: {url}";
|
||||
|
||||
}
|
||||
downloadItem.Status = $"下载失败: {ex.Message}";
|
||||
Logger.LogError(errorDetails, ex);
|
||||
|
||||
MessageBox.Show($"下载失败:\n{errorDetails}", "错误",
|
||||
MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
|
||||
DownloadCompleted?.Invoke(downloadItem);
|
||||
}
|
||||
}
|
||||
|
||||
public void CancelDownload(DownloadItem item)
|
||||
@@ -322,7 +334,7 @@ namespace AppStore
|
||||
try
|
||||
{
|
||||
var process = currentProcess;
|
||||
if (process == null || process.HasExited || process.StartInfo == null)
|
||||
if (process?.StartInfo == null || process.HasExited)
|
||||
{
|
||||
item.Status = "已取消";
|
||||
DownloadProgressChanged?.Invoke(item);
|
||||
@@ -342,5 +354,138 @@ namespace AppStore
|
||||
DownloadProgressChanged?.Invoke(item);
|
||||
}
|
||||
}
|
||||
|
||||
private string GetDownloadPath()
|
||||
{
|
||||
// 1. 优先读取用户设置的下载路径
|
||||
try
|
||||
{
|
||||
string jsonPath = Path.Combine(
|
||||
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
|
||||
"zsyg", "kortapp-z", ".date", "dl_path", "download_path.json");
|
||||
|
||||
Logger.Log($"尝试读取下载路径配置文件: {jsonPath}");
|
||||
|
||||
if (File.Exists(jsonPath))
|
||||
{
|
||||
string jsonString = File.ReadAllText(jsonPath);
|
||||
Logger.Log($"配置文件内容: {jsonString}");
|
||||
|
||||
var jsonData = JsonSerializer.Deserialize<JsonElement>(jsonString);
|
||||
string customPath = jsonData.GetProperty("DownloadPath").GetString()?.Trim();
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(customPath))
|
||||
{
|
||||
Logger.Log($"读取到自定义路径: {customPath}");
|
||||
|
||||
// 处理路径格式
|
||||
customPath = customPath.Replace(@"\\", @"\");
|
||||
try
|
||||
{
|
||||
// 处理路径中的环境变量和特殊字符
|
||||
customPath = Environment.ExpandEnvironmentVariables(customPath);
|
||||
customPath = Path.GetFullPath(customPath);
|
||||
Logger.Log($"标准化后的路径: {customPath}");
|
||||
|
||||
// 确保路径以目录分隔符结尾
|
||||
if (!customPath.EndsWith(Path.DirectorySeparatorChar.ToString()))
|
||||
{
|
||||
customPath += Path.DirectorySeparatorChar;
|
||||
}
|
||||
|
||||
// 验证驱动器是否存在
|
||||
string drive = Path.GetPathRoot(customPath);
|
||||
if (!Directory.Exists(drive))
|
||||
{
|
||||
Logger.LogError($"驱动器不存在: {drive}");
|
||||
throw new Exception($"驱动器 {drive} 不存在");
|
||||
}
|
||||
|
||||
// 验证路径
|
||||
if (!Directory.Exists(customPath))
|
||||
{
|
||||
Logger.Log($"创建目录: {customPath}");
|
||||
Directory.CreateDirectory(customPath);
|
||||
}
|
||||
|
||||
// 更严格的路径可写性测试
|
||||
string testFile = Path.Combine(customPath, $"write_test_{Guid.NewGuid()}.tmp");
|
||||
Logger.Log($"测试路径可写性: {testFile}");
|
||||
try
|
||||
{
|
||||
File.WriteAllText(testFile, DateTime.Now.ToString());
|
||||
string content = File.ReadAllText(testFile);
|
||||
File.Delete(testFile);
|
||||
Logger.Log($"路径验证成功: {customPath}");
|
||||
return customPath.TrimEnd(Path.DirectorySeparatorChar);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.LogError($"路径不可写: {customPath}", ex);
|
||||
throw new Exception($"路径不可写: {customPath}");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.LogError($"路径处理失败: {customPath}", ex);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger.Log("未找到下载路径配置文件");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.LogError("读取自定义下载路径失败", ex);
|
||||
}
|
||||
|
||||
// 2. 回退到系统默认下载路径
|
||||
IntPtr pathPtr = IntPtr.Zero;
|
||||
try
|
||||
{
|
||||
var downloadsFolderGuid = new Guid("374DE290-123F-4565-9164-39C4925E467B");
|
||||
if (SHGetKnownFolderPath(downloadsFolderGuid, 0, IntPtr.Zero, out pathPtr) == 0)
|
||||
{
|
||||
string defaultPath = Marshal.PtrToStringUni(pathPtr);
|
||||
if (!string.IsNullOrEmpty(defaultPath))
|
||||
{
|
||||
Directory.CreateDirectory(defaultPath);
|
||||
return defaultPath;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.LogError("获取系统下载路径失败", ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (pathPtr != IntPtr.Zero)
|
||||
{
|
||||
Marshal.FreeCoTaskMem(pathPtr);
|
||||
}
|
||||
}
|
||||
|
||||
// 3. 最终回退到相对路径 ~/Downloads
|
||||
string relativePath = "~/Downloads";
|
||||
string fallbackPath = relativePath.Replace("~",
|
||||
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile));
|
||||
fallbackPath = Path.GetFullPath(fallbackPath);
|
||||
|
||||
try {
|
||||
Directory.CreateDirectory(fallbackPath);
|
||||
// 测试路径可写性
|
||||
string testFile = Path.Combine(fallbackPath, "write_test.tmp");
|
||||
File.WriteAllText(testFile, "test");
|
||||
File.Delete(testFile);
|
||||
return fallbackPath;
|
||||
}
|
||||
catch {
|
||||
throw new Exception($"无法使用默认下载路径: {fallbackPath}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 704 KiB |
@@ -715,7 +715,7 @@ namespace AppStore
|
||||
|
||||
flowPanel.Controls.Add(CreateAppCard(
|
||||
"XDM",
|
||||
"https://github.com/subhra74/xdm/releases/download/7.2.11/xdm-setup.msi",
|
||||
"https://ghproxy.net/https://github.com/subhra74/xdm/releases/download/7.2.11/xdm-setup.msi",
|
||||
"img/png/XDM.png"));
|
||||
|
||||
flowPanel.Controls.Add(CreateAppCard(
|
||||
@@ -780,7 +780,7 @@ namespace AppStore
|
||||
|
||||
flowPanel.Controls.Add(CreateAppCard(
|
||||
"Msys2",
|
||||
"https://github.com/msys2/msys2-installer/releases/download/2025-02-21/msys2-x86_64-20250221.exe",
|
||||
"https://ghproxy.net/https://github.com/msys2/msys2-installer/releases/download/2025-02-21/msys2-x86_64-20250221.exe",
|
||||
"img/png/MSYS2.png"));
|
||||
|
||||
flowPanel.Controls.Add(CreateAppCard(
|
||||
@@ -880,7 +880,7 @@ namespace AppStore
|
||||
|
||||
flowPanel.Controls.Add(CreateAppCard(
|
||||
"frp",
|
||||
"https://github.com/fatedier/frp/releases/download/v0.62.1/frp_0.62.1_windows_amd64.zip",
|
||||
"https://ghproxy.net/https://github.com/fatedier/frp/releases/download/v0.62.1/frp_0.62.1_windows_amd64.zip",
|
||||
""));
|
||||
|
||||
flowPanel.Controls.Add(CreateAppCard(
|
||||
|
||||
14
README.md
14
README.md
@@ -5,14 +5,12 @@
|
||||
## 项目开源行为
|
||||
|
||||
1. 项目代码开源,允许任何人使用、修改、分发、商用,但必须注明原作者。
|
||||
2. 项目文档开源,允许任何人使用、修改、分发、商用,但必须注明原作者。
|
||||
3. 项目图标、截图等资源开源,允许任何人使用、修改、分发、商用,但必须注明原作者。
|
||||
4. 项目的任何衍生品(包括但不限于网站、APP、插件等)必须遵循以上开源协议。
|
||||
5. 项目不接受任何形式的广告,不得在任何地方投放广告。
|
||||
6. 项目不接受任何形式的捐赠。
|
||||
7. 项目不接受任何形式的赞助。
|
||||
8. 项目可以进行PR,欢迎任何形式的PR,不提交issue也可以
|
||||
9. 本项目可以PR一些你自己的项目,如果star数量不到1k,都会被删除
|
||||
2. 项目图标、截图等资源开源,允许任何人使用、修改、分发、商用,但必须注明原作者。
|
||||
3. 项目的任何衍生品(包括但不限于网站、APP、插件等)必须遵循以上开源协议。
|
||||
4. 项目不接受任何形式的广告,不得在任何地方投放广告。
|
||||
5. 项目不接受任何形式的捐赠、赞助
|
||||
6. 项目可以进行PR,欢迎任何形式的PR,不提交issue也可以
|
||||
7. 本项目可以PR一些你自己的项目,如果star数量不到1k,都会被删除
|
||||
|
||||
## 项目简介
|
||||
|
||||
|
||||
135
SettingsForm.cs
135
SettingsForm.cs
@@ -3,6 +3,7 @@ using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Windows.Forms;
|
||||
using System.Drawing;
|
||||
using System.Text.Json;
|
||||
|
||||
namespace AppStore
|
||||
{
|
||||
@@ -49,7 +50,43 @@ namespace AppStore
|
||||
btnCleanLogs.Click += (s, e) => CleanLogs();
|
||||
this.Controls.Add(btnCleanLogs);
|
||||
|
||||
// 下载路径设置
|
||||
Label lblDownloadPath = new Label();
|
||||
lblDownloadPath.Text = "下载路径:";
|
||||
lblDownloadPath.AutoSize = true;
|
||||
lblDownloadPath.Location = new Point((this.Width - 300) / 2, 170);
|
||||
lblDownloadPath.Font = new Font("Microsoft YaHei", 10);
|
||||
lblDownloadPath.Anchor = AnchorStyles.Top;
|
||||
this.Controls.Add(lblDownloadPath);
|
||||
|
||||
TextBox txtDownloadPath = new TextBox();
|
||||
txtDownloadPath.Size = new Size(300, 30);
|
||||
txtDownloadPath.Location = new Point((this.Width - 300) / 2, 200);
|
||||
txtDownloadPath.Font = new Font("Microsoft YaHei", 10);
|
||||
txtDownloadPath.Anchor = AnchorStyles.Top;
|
||||
txtDownloadPath.ReadOnly = true;
|
||||
this.Controls.Add(txtDownloadPath);
|
||||
|
||||
Button btnBrowse = new Button();
|
||||
btnBrowse.Text = "浏览...";
|
||||
btnBrowse.Size = new Size(80, 30);
|
||||
btnBrowse.Location = new Point(txtDownloadPath.Right + 10, 200);
|
||||
btnBrowse.Font = new Font("Microsoft YaHei", 10);
|
||||
btnBrowse.Anchor = AnchorStyles.Top;
|
||||
btnBrowse.Click += (s, e) => BrowseDownloadPath(txtDownloadPath);
|
||||
this.Controls.Add(btnBrowse);
|
||||
|
||||
Button btnSavePath = new Button();
|
||||
btnSavePath.Text = "保存路径";
|
||||
btnSavePath.Size = new Size(100, 30);
|
||||
btnSavePath.Location = new Point((this.Width - 100) / 2, 240);
|
||||
btnSavePath.Font = new Font("Microsoft YaHei", 10);
|
||||
btnSavePath.Anchor = AnchorStyles.Top;
|
||||
btnSavePath.Click += (s, e) => SaveDownloadPath(txtDownloadPath.Text);
|
||||
this.Controls.Add(btnSavePath);
|
||||
|
||||
ThemeManager.ThemeChanged += OnThemeChanged;
|
||||
LoadDownloadPath(txtDownloadPath);
|
||||
}
|
||||
|
||||
private void SwitchTheme(ThemeManager.ThemeMode theme)
|
||||
@@ -84,5 +121,103 @@ namespace AppStore
|
||||
MessageBox.Show($"清理日志时出错: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
}
|
||||
}
|
||||
|
||||
private void BrowseDownloadPath(TextBox txtBox)
|
||||
{
|
||||
using (FolderBrowserDialog dialog = new FolderBrowserDialog())
|
||||
{
|
||||
dialog.Description = "选择下载路径";
|
||||
if (dialog.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
txtBox.Text = dialog.SelectedPath;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void SaveDownloadPath(string path)
|
||||
{
|
||||
try
|
||||
{
|
||||
// 验证路径
|
||||
if (string.IsNullOrWhiteSpace(path))
|
||||
{
|
||||
MessageBox.Show("下载路径不能为空", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
return;
|
||||
}
|
||||
|
||||
// 尝试创建目录(如果不存在)
|
||||
try
|
||||
{
|
||||
Directory.CreateDirectory(path);
|
||||
|
||||
// 验证目录是否可写
|
||||
string testFile = Path.Combine(path, "write_test.tmp");
|
||||
File.WriteAllText(testFile, "test");
|
||||
File.Delete(testFile);
|
||||
}
|
||||
catch
|
||||
{
|
||||
MessageBox.Show($"无法访问路径: {path}\n请确保路径存在且有写入权限", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
return;
|
||||
}
|
||||
|
||||
// 保存路径
|
||||
string dlPathDir = Path.Combine(
|
||||
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
|
||||
"zsyg", "kortapp-z", ".date", "dl_path");
|
||||
|
||||
if (!Directory.Exists(dlPathDir))
|
||||
{
|
||||
Directory.CreateDirectory(dlPathDir);
|
||||
}
|
||||
|
||||
string jsonPath = Path.Combine(dlPathDir, "download_path.json");
|
||||
var jsonData = new { DownloadPath = path };
|
||||
string jsonString = JsonSerializer.Serialize(jsonData);
|
||||
|
||||
File.WriteAllText(jsonPath, jsonString);
|
||||
|
||||
MessageBox.Show($"下载路径已保存到:\n{path}", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.LogError("保存下载路径时出错", ex);
|
||||
MessageBox.Show($"保存下载路径时出错: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
}
|
||||
}
|
||||
|
||||
private void LoadDownloadPath(TextBox txtBox)
|
||||
{
|
||||
// 默认下载路径为用户文件夹下的Downloads
|
||||
string defaultPath = Path.Combine(
|
||||
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),
|
||||
"Downloads");
|
||||
|
||||
try
|
||||
{
|
||||
string jsonPath = Path.Combine(
|
||||
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
|
||||
"zsyg", "kortapp-z", ".date", "dl_path", "download_path.json");
|
||||
|
||||
if (File.Exists(jsonPath))
|
||||
{
|
||||
string jsonString = File.ReadAllText(jsonPath);
|
||||
var jsonData = JsonSerializer.Deserialize<JsonElement>(jsonString);
|
||||
string customPath = jsonData.GetProperty("DownloadPath").GetString();
|
||||
|
||||
// 如果自定义路径有效则显示,否则显示默认路径
|
||||
txtBox.Text = !string.IsNullOrWhiteSpace(customPath) ? customPath : defaultPath;
|
||||
}
|
||||
else
|
||||
{
|
||||
txtBox.Text = defaultPath;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.LogError("加载下载路径时出错", ex);
|
||||
txtBox.Text = defaultPath;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,6 +42,8 @@ namespace AppStore
|
||||
try
|
||||
{
|
||||
var dir = Path.GetDirectoryName(ThemeConfigPath);
|
||||
if (dir == null) return;
|
||||
|
||||
if (!Directory.Exists(dir))
|
||||
{
|
||||
Directory.CreateDirectory(dir);
|
||||
|
||||
46
ToolCard.cs
46
ToolCard.cs
@@ -8,6 +8,8 @@ namespace AppStore
|
||||
{
|
||||
private PictureBox iconBox = new PictureBox();
|
||||
private Label nameLabel = new Label();
|
||||
private Panel namePanel = new Panel();
|
||||
private Color borderColor = SystemColors.ControlDark;
|
||||
|
||||
public string ToolName { get; set; } = string.Empty;
|
||||
public Image ToolIcon { get; set; } = SystemIcons.Shield.ToBitmap();
|
||||
@@ -37,14 +39,28 @@ namespace AppStore
|
||||
iconBox.SizeMode = PictureBoxSizeMode.StretchImage;
|
||||
this.Controls.Add(iconBox);
|
||||
|
||||
// 工具名称
|
||||
// 工具名称 - 使用Panel包裹Label实现边框颜色
|
||||
namePanel = new Panel();
|
||||
namePanel.Size = new Size(Width - 20, 30);
|
||||
namePanel.Location = new Point(10, 100);
|
||||
namePanel.Paint += (sender, e) => {
|
||||
ControlPaint.DrawBorder(e.Graphics, namePanel.ClientRectangle,
|
||||
borderColor, ButtonBorderStyle.Solid);
|
||||
};
|
||||
|
||||
nameLabel = new Label();
|
||||
nameLabel.AutoSize = false;
|
||||
nameLabel.Size = new Size(Width - 20, 30);
|
||||
nameLabel.Location = new Point(10, 100);
|
||||
nameLabel.Dock = DockStyle.Fill;
|
||||
nameLabel.Font = new Font("Microsoft YaHei", 10, FontStyle.Bold);
|
||||
nameLabel.TextAlign = ContentAlignment.MiddleCenter;
|
||||
this.Controls.Add(nameLabel);
|
||||
namePanel.Controls.Add(nameLabel);
|
||||
|
||||
// 初始主题设置
|
||||
UpdateLabelTheme();
|
||||
|
||||
// 订阅主题变化事件
|
||||
ThemeManager.ThemeChanged += (theme) => UpdateLabelTheme();
|
||||
|
||||
this.Controls.Add(namePanel);
|
||||
|
||||
// 打开按钮
|
||||
var openButton = new Button();
|
||||
@@ -68,10 +84,30 @@ namespace AppStore
|
||||
openButton.FlatAppearance.MouseDownBackColor = Color.FromArgb(0, 80, 160);
|
||||
}
|
||||
|
||||
private void UpdateLabelTheme()
|
||||
{
|
||||
if (ThemeManager.CurrentTheme == ThemeManager.ThemeMode.Dark)
|
||||
{
|
||||
nameLabel.BackColor = Color.Black;
|
||||
nameLabel.ForeColor = Color.White;
|
||||
namePanel.BackColor = Color.Black;
|
||||
borderColor = Color.White;
|
||||
}
|
||||
else
|
||||
{
|
||||
nameLabel.BackColor = Color.White;
|
||||
nameLabel.ForeColor = Color.Black;
|
||||
namePanel.BackColor = Color.White;
|
||||
borderColor = SystemColors.ControlDark;
|
||||
}
|
||||
namePanel.Invalidate(); // 触发重绘
|
||||
}
|
||||
|
||||
public void UpdateDisplay()
|
||||
{
|
||||
nameLabel.Text = ToolName;
|
||||
iconBox.Image = ToolIcon;
|
||||
UpdateLabelTheme();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
BIN
img/resource/png/password_generator.png
Normal file
BIN
img/resource/png/password_generator.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 410 KiB |
@@ -2,7 +2,7 @@
|
||||
; 有关创建 Inno Setup 脚本文件的详细信息,请参阅帮助文档!
|
||||
|
||||
#define MyAppName "kortapp-z"
|
||||
#define MyAppVersion "1.1.1"
|
||||
#define MyAppVersion "1.1.3"
|
||||
#define MyAppPublisher "zsyg"
|
||||
#define MyAppURL "https://github.com/zs-yg/kortapp-z"
|
||||
#define MyAppExeName "kortapp.exe"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
; 有关创建 Inno Setup 脚本文件的详细信息,请参阅帮助文档!
|
||||
|
||||
#define MyAppName "kortapp-z"
|
||||
#define MyAppVersion "1.1.1"
|
||||
#define MyAppVersion "1.1.3"
|
||||
#define MyAppPublisher "zsyg"
|
||||
#define MyAppURL "https://github.com/zs-yg/kortapp-z"
|
||||
#define MyAppExeName "kortapp.exe"
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
ren bin\Release\net8.0-windows\win-x86\publish\AppStore.exe kortapp.exe
|
||||
ren bin\Release\net8.0-windows\win-x64\publish\AppStore.exe kortapp.exe
|
||||
ren bin\Release\net8.0-windows\win-x86\publish\AppStore.exe kortapp-z.exe
|
||||
ren bin\Release\net8.0-windows\win-x64\publish\AppStore.exe kortapp-z.exe
|
||||
@@ -50,7 +50,10 @@ namespace KortAppZ.Tools.Viewer
|
||||
}
|
||||
|
||||
currentImage = ImageFileHandler.LoadImage(filePath);
|
||||
pictureBox.Image = currentImage;
|
||||
if (pictureBox != null)
|
||||
{
|
||||
pictureBox.Image = currentImage;
|
||||
}
|
||||
this.Text = $"图片查看 - {Path.GetFileName(filePath)}";
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
||||
Reference in New Issue
Block a user