-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathDownloadItem.cs
More file actions
156 lines (138 loc) · 5.28 KB
/
Copy pathDownloadItem.cs
File metadata and controls
156 lines (138 loc) · 5.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
using System;
using System.Diagnostics;
using System.Drawing;
using System.Windows.Forms;
namespace AppStore
{
public class DownloadItem : UserControl
{
private Label nameLabel;
private ProgressBar progressBar;
private Label statusLabel;
private Button cancelBtn;
public string FileName { get; set; } = string.Empty;
public int Progress { get; set; }
public string Status { get; set; } = string.Empty;
public Process? DownloadProcess { get; set; }
public DownloadItem()
{
nameLabel = new Label();
progressBar = new ProgressBar();
statusLabel = new Label();
cancelBtn = new Button();
InitializeComponent();
// 监听主题变化
ThemeManager.ThemeChanged += (theme) => {
this.Invoke((MethodInvoker)delegate {
ApplyTheme();
});
};
}
private void ApplyTheme()
{
this.BackColor = ThemeManager.CurrentTheme == ThemeManager.ThemeMode.Light
? Color.White
: Color.Black;
this.ForeColor = ThemeManager.CurrentTheme == ThemeManager.ThemeMode.Light
? Color.Black
: Color.White;
cancelBtn.BackColor = ThemeManager.CurrentTheme == ThemeManager.ThemeMode.Light
? SystemColors.Control
: Color.FromArgb(70, 70, 70);
cancelBtn.ForeColor = ThemeManager.TextColor;
}
private void InitializeComponent()
{
this.Size = new Size(400, 60);
this.BackColor = ThemeManager.CurrentTheme == ThemeManager.ThemeMode.Light
? Color.White
: Color.Black;
this.BorderStyle = BorderStyle.None; // 禁用默认边框
this.ForeColor = ThemeManager.CurrentTheme == ThemeManager.ThemeMode.Light
? Color.Black
: Color.White;
this.Paint += DownloadItem_Paint; // 添加自定义绘制
// 文件名标签
nameLabel = new Label();
nameLabel.AutoSize = true;
nameLabel.Location = new Point(10, 10);
nameLabel.Font = new Font("Microsoft YaHei", 9, FontStyle.Bold);
this.Controls.Add(nameLabel);
// 进度条
progressBar = new ProgressBar();
progressBar.Size = new Size(200, 20);
progressBar.Location = new Point(10, 30);
this.Controls.Add(progressBar);
// 状态标签
statusLabel = new Label();
statusLabel.AutoSize = true;
statusLabel.Location = new Point(220, 30);
statusLabel.Font = new Font("Microsoft YaHei", 8);
this.Controls.Add(statusLabel);
// 取消按钮
cancelBtn = new Button();
cancelBtn.Text = "取消";
cancelBtn.Size = new Size(60, 25);
cancelBtn.Location = new Point(320, 30);
cancelBtn.BackColor = ThemeManager.CurrentTheme == ThemeManager.ThemeMode.Light
? SystemColors.Control
: Color.FromArgb(70, 70, 70);
cancelBtn.ForeColor = ThemeManager.TextColor;
cancelBtn.FlatStyle = FlatStyle.Flat;
cancelBtn.FlatAppearance.BorderSize = 0;
cancelBtn.Click += CancelBtn_Click;
this.Controls.Add(cancelBtn);
}
public void UpdateDisplay()
{
nameLabel.Text = FileName;
progressBar.Value = Progress;
statusLabel.Text = Status;
this.Invalidate(); // 触发重绘
}
private void DownloadItem_Paint(object sender, PaintEventArgs e)
{
// 自定义边框绘制
using (var pen = new Pen(ThemeManager.BorderColor, 1))
{
e.Graphics.DrawRectangle(pen,
new Rectangle(0, 0, this.Width - 1, this.Height - 1));
}
}
private void CancelBtn_Click(object sender, EventArgs e)
{
if (sender == null || e == null) return;
if (InvokeRequired)
{
Invoke(new EventHandler(CancelBtn_Click), sender, e);
return;
}
try
{
// 1. 先取消下载
DownloadManager.Instance.CancelDownload(this);
// 2. 更新状态为已取消
Status = "已取消";
UpdateDisplay();
// 3. 延迟100ms后移除控件,确保UI更新完成
var timer = new System.Windows.Forms.Timer { Interval = 100 };
timer.Tick += (s, args) =>
{
timer.Stop();
timer.Dispose();
if (this.Parent != null)
{
this.Parent.Controls.Remove(this);
this.Dispose();
}
};
timer.Start();
}
catch (Exception ex)
{
Status = $"取消失败: {ex.Message}";
UpdateDisplay();
}
}
}
}