Public Class PageSpeedLeft Private Const WatcherInterval As Integer = 300 '初始化 Private IsLoad As Boolean = False Private Sub Page_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded '进入时就刷新一次显示 Watcher() '如果在页面切换动画的 “上一页消失” 部分已经完成了下载,就直接尝试返回 TryReturnToHome() If IsLoad Then Exit Sub IsLoad = True '监控定时器 Dim timer As New Threading.DispatcherTimer With {.Interval = New TimeSpan(0, 0, 0, 0, WatcherInterval)} AddHandler timer.Tick, AddressOf Watcher timer.Start() '非调试模式隐藏线程数 If Not ModeDebug Then RowDefinitions(12).Height = New GridLength(0) RowDefinitions(13).Height = New GridLength(0) RowDefinitions(14).Height = New GridLength(0) RowDefinitions(15).Height = New GridLength(0) End If End Sub '定时器任务 Private ReadOnly RightCards As New Dictionary(Of String, MyCard) Private Sub Watcher() If Not FrmMain.PageCurrent = FormMain.PageType.DownloadManager Then Exit Sub Try #Region "更新左边栏" If LoaderTaskbar.Count = 0 Then '无任务 LabProgress.Text = "100 %" LabSpeed.Text = "0 B/s" LabFile.Text = "0" LabThread.Text = "0 / " & NetTaskThreadLimit Else '有任务,输出基本信息 Dim RawPercent As Double = LoaderTaskbarProgress Dim PredictText As String = Math.Floor(RawPercent * 100) & "." & StrFill(Math.Floor((RawPercent * 100 - Math.Floor(RawPercent * 100)) * 100), "0", 2) & " %" LabProgress.Text = If(RawPercent > 0.999999, "100 %", PredictText) LabSpeed.Text = GetString(NetManager.Speed) & "/s" LabFile.Text = If(NetManager.FileRemain < 0, "0*", NetManager.FileRemain) LabThread.Text = NetTaskThreadCount & " / " & NetTaskThreadLimit End If #End Region Catch ex As Exception Log(ex, "下载管理左栏监视出错", LogLevel.Feedback) End Try If FrmSpeedRight Is Nothing OrElse FrmSpeedRight.PanMain Is Nothing Then Exit Sub Try SyncLock LoaderTaskbarLock For i = 0 To LoaderTaskbar.Count - 1 TaskRefresh(LoaderTaskbar(i)) Next End SyncLock Catch ex As Exception Log(ex, "下载管理右栏监视出错", LogLevel.Feedback) End Try End Sub Public Sub TaskRefresh(Loader As LoaderBase) If Loader Is Nothing OrElse Not Loader.Show Then Exit Sub Try '获取实际加载器列表 Dim LoaderList As List(Of LoaderBase) = CType(Loader, Object).GetLoaderList() If RightCards.ContainsKey(Loader.Name) Then '已有此卡片 Dim Card As Grid = RightCards(Loader.Name) Dim NewValue As Double = Loader.Progress + Loader.State If Val(Card.Tag) = NewValue Then Exit Sub Card.Tag = NewValue If Card.Children.Count <= 3 Then Log("[Watcher] 元素不足的卡片:" & Loader.Name, LogLevel.Debug) Exit Sub End If Card = Card.Children(3) Try Select Case Loader.State Case LoadState.Failed #Region "失败,更新卡片" Card.RowDefinitions.Clear() Card.Children.Clear() Card.Children.Add(GetObjectFromXML("")) Dim Tb As TextBlock = GetObjectFromXML("") Tb.Text = GetExceptionDetail(Loader.Error) AddHandler Tb.MouseDown, Sub(sender As TextBlock, e As EventArgs) ClipboardSet(sender.Text, False) Hint("已复制错误详情!", HintType.Finish) End Sub Card.Children.Add(Tb) ''删除取消按钮 'For Each Element As FrameworkElement In CType(Card.Parent, Panel).Children ' If Element.Name = "BtnCancel" Then AniDispose(CType(Element, MyIconButton), True) 'Next #End Region Case LoadState.Finished #Region "完成,销毁卡片并返回" AniDispose(CType(Card.Parent, MyCard), True, AddressOf TryReturnToHome) #End Region Case LoadState.Loading, LoadState.Waiting #Region "进度不同,更新卡片" Try If Card.Children.Count < LoaderList.Count * 2 Then Log("刷新下载管理卡片失败:卡片中仅有 " & Card.Children.Count & " 个子项", LogLevel.Debug) Exit Try End If Dim Row As Integer = 0 For Each SubTask In LoaderList Select Case SubTask.State Case LoadState.Waiting If CType(Card.Children(Row * 2), FrameworkElement).Tag <> "Waiting" Then Card.Children.RemoveAt(Row * 2) Card.Children.Insert(Row * 2, GetObjectFromXML("")) End If Case LoadState.Loading If CType(Card.Children(Row * 2), FrameworkElement).Tag <> "Loading" Then Card.Children.RemoveAt(Row * 2) Card.Children.Insert(Row * 2, GetObjectFromXML("")) Else CType(Card.Children(Row * 2), TextBlock).Text = Math.Floor(SubTask.Progress * 100) & "%" End If Case LoadState.Finished If CType(Card.Children(Row * 2), FrameworkElement).Tag <> "Finished" Then Card.Children.RemoveAt(Row * 2) Card.Children.Insert(Row * 2, GetObjectFromXML("")) End If End Select Row += 1 Next Catch ex As Exception Log(ex, "刷新下载管理卡片失败", LogLevel.Feedback) End Try #End Region End Select Catch ex As Exception Log(ex, "更新下载管理显示失败(" & Loader.State.ToString & ")", LogLevel.Feedback) End Try ElseIf Not (Loader.State = LoadState.Aborted OrElse Loader.State = LoadState.Finished) Then Try #Region "没有卡片且未中断或完成,添加新的卡片" Dim CardXAML As String = " " For Each SubTask In LoaderList CardXAML += "" Next CardXAML += "" Dim Row As Integer = 0 For Each SubTask In LoaderList Select Case SubTask.State Case LoadState.Waiting CardXAML += "" Case LoadState.Loading CardXAML += "" Case LoadState.Finished CardXAML += "" Case Else CardXAML += "" End Select CardXAML += "" Row += 1 Next CardXAML += " " '实例化控件 Dim Card As MyCard Try Card = GetObjectFromXML(CardXAML) Catch ex As Exception Log(ex, "新建下载管理卡片失败") Log("出错的卡片内容:" & vbCrLf & CardXAML) Throw End Try FrmSpeedRight.PanMain.Children.Insert(0, Card) RightCards.Add(Loader.Name, Card) '添加取消按钮 Dim Cancel As New MyIconButton With {.Name = "BtnCancel", .Logo = "F1 M2,0 L0,2 8,10 0,18 2,20 10,12 18,20 20,18 12,10 20,2 18,0 10,8 2,0Z", .Height = 20, .Margin = New Thickness(0, 10, 10, 0), .LogoScale = 1.1, .HorizontalAlignment = HorizontalAlignment.Right, .VerticalAlignment = VerticalAlignment.Top} Card.Children.Add(Cancel) AddHandler Cancel.Click, Sub(sender As MyIconButton, e As EventArgs) AniDispose(sender, False) AniDispose(Card, True, Sub() If FrmSpeedRight.PanMain.Children.Count = 0 AndAlso FrmMain.PageCurrent = FormMain.PageType.DownloadManager Then FrmMain.PageBack()) RightCards.Remove(Loader.Name) RunInThread(Sub() Loader.Abort()) End Sub '如果已经失败,再刷新一次,修改成失败的控件 If Loader.State = LoadState.Failed Then Card.Tag = Nothing '避免重复导致刷新无效 TaskRefresh(Loader) End If #End Region Catch ex As Exception Log(ex, "添加下载管理卡片失败", LogLevel.Feedback) End Try End If Catch ex As Exception Log(ex, "刷新下载管理显示失败", LogLevel.Feedback) End Try End Sub Public Sub TaskRemove(Loader As Object) If RightCards.ContainsKey(Loader.Name) Then RunInUiWait(Sub() '移除已有的卡片 Dim Card As Grid = RightCards(Loader.Name) FrmSpeedRight.PanMain.Children.Remove(Card) RightCards.Remove(Loader.Name) End Sub) End If End Sub ''' ''' 若没有任务,尝试返回主页。 ''' Private Sub TryReturnToHome() If FrmSpeedRight.PanMain.Children.Count = 0 AndAlso FrmMain.PageCurrent = FormMain.PageType.DownloadManager Then FrmMain.PageBack() End If End Sub End Class