Public Class formDownloadRight '初始化滚动条 Private Sub panShow_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles panShow.Loaded If scroll.SetControl(panShow, True) Then AddHandler panBack.MouseWheel, AddressOf scroll.RunMouseWheel RefreshPage() End Sub Private ControlDict As New Dictionary(Of String, Object) ''' ''' 添加一个文件组到 UI。 ''' ''' Public Sub AddGroup(Group As WebGroup) frmMain.Dispatcher.Invoke(Sub() panShow.UpdateLayout() Dim NewGrid As New Grid With {.Width = 203, .Margin = New Thickness(0, 5, 0, 9)} ControlDict.Add("MainGrid" & Group.UUID, NewGrid) Dim NewPath As New Shapes.Path With {.Data = New GeometryConverter().ConvertFromString("F1 M 38,19C 47.3888,19 55,21.0147 55,23.5038L 55,25.5C 55,27.9853 47.3888,30 38,30C 28.6112,30 21,27.9853 21,25.5L 21,23.5C 21,21.0147 28.6112,19 38,19 Z M 55,52.5C 55,54.9853 47.3888,57 38,57C 28.6112,57 21,54.9853 21,52.5L 21,46.5C 21,48.9853 28.6112,51 38,51C 47.384,51 54.9921,48.9874 55,46.5039L 55,52.5 Z M 55,43.5C 55,45.9853 47.3888,48 38,48C 28.6112,48 21,45.9853 21,43.5L 21,37.5C 21,39.9853 28.6112,42 38,42C 47.384,42 54.9921,39.9874 55,37.5038L 55,43.5 Z M 55,34.5C 55,36.9853 47.3888,39 38,39C 28.6112,39 21,36.9853 21,34.5L 21,28.5C 21,30.9853 28.6112,33 38,33C 47.384,33 54.9921,30.9874 55,28.5038L 55,34.5 Z"), .Height = 19, .Stretch = Stretch.Fill, .Width = 17, .HorizontalAlignment = HorizontalAlignment.Left, .VerticalAlignment = VerticalAlignment.Top, .UseLayoutRounding = False, .Margin = New Thickness(9, 9, 0, 0)} NewPath.SetResourceReference(Shape.FillProperty, "Color4") NewGrid.Children.Add(NewPath) Dim NewTitle As New Label With {.Content = Group.Name, .FontSize = 16, .VerticalContentAlignment = VerticalAlignment.Center, .Margin = New Thickness(35, 0, 0, 0), .Height = 36, .VerticalAlignment = VerticalAlignment.Top, .Padding = New Thickness(0), .UseLayoutRounding = False, .MaxWidth = 160, .HorizontalAlignment = HorizontalAlignment.Left} NewTitle.SetResourceReference(ForegroundProperty, "Color4") AddHandler NewTitle.MouseEnter, Sub() NewTitle.ToolTip = If(NewTitle.ActualWidth > 159, Group.Name, Nothing) End Sub NewGrid.Children.Add(NewTitle) Dim NewProgress1 As New TextBlock With {.Height = 2, .VerticalAlignment = VerticalAlignment.Top, .Margin = New Thickness(5, 37, 0, 0), .HorizontalAlignment = HorizontalAlignment.Left, .Width = 193, .UseLayoutRounding = True} NewProgress1.SetResourceReference(TextBlock.BackgroundProperty, "Color2") NewGrid.Children.Add(NewProgress1) Dim NewProgress2 As New TextBlock With {.Height = 2, .VerticalAlignment = VerticalAlignment.Top, .Margin = New Thickness(5, 37, 0, 0), .HorizontalAlignment = HorizontalAlignment.Left, .Width = 0, .UseLayoutRounding = True, .MaxWidth = 193} NewProgress2.SetResourceReference(TextBlock.BackgroundProperty, "Color4") NewGrid.Children.Add(NewProgress2) ControlDict.Add("Progress" & Group.UUID, NewProgress2) Dim NewHost As New StackPanel With {.HorizontalAlignment = HorizontalAlignment.Left, .Margin = New Thickness(5, 45, 0, 0), .VerticalAlignment = VerticalAlignment.Top, .Width = 193} ControlDict.Add("Host" & Group.UUID, NewHost) NewGrid.Children.Add(NewHost) panShow.Children.Add(NewGrid) AddFileList(Group.Files, NewHost) RefreshGroup(Group) RefreshPage() End Sub) End Sub ''' ''' 刷新一个 WebGroup 在 UI 中的显示。 ''' ''' Public Sub RefreshGroup(Group As WebGroup) frmMain.Dispatcher.Invoke(Sub() '刷新进度条 AniStart({ AaWidth(ControlDict("Progress" & Group.UUID), 193 * Group.Percent - ControlDict("Progress" & Group.UUID).Width, 250, , New AniEaseJumpEnd(0.6)) }, "Progress" & Group.UUID) End Sub) End Sub ''' ''' 添加一堆文件到 UI 中的 StackPanel。 ''' Private Sub AddFileList(Files As ArrayList, Host As StackPanel) For Each File As WebFile In Files Dim f As WebFile = File Dim NewFileGrid As New Grid With {.Height = 22, .UseLayoutRounding = True, .Background = New MyColor(1, 255, 255, 255), .Width = 193, .HorizontalAlignment = HorizontalAlignment.Left} NewFileGrid.ColumnDefinitions.Add(New ColumnDefinition With {.Width = (New GridLengthConverter).ConvertFromString("1*")}) NewFileGrid.ColumnDefinitions.Add(New ColumnDefinition With {.Width = GridLength.Auto}) AddHandler NewFileGrid.MouseEnter, Sub() NewFileGrid.ToolTip = "下载地址:" & f.WebAddress & If(f.WebAddress.Contains("minecraft.net/") Or f.WebAddress.Contains("mojang.com/"), vbCrLf & "下载来源:Mojang 官方", "") & If(f.WebAddress.Contains("optifine.net/"), vbCrLf & "下载来源:OptiFine 官方", "") & If(f.WebAddress.Contains("minecraftforge.net/"), vbCrLf & "下载来源:Forge 官方", "") & If(f.WebAddress.Contains("bangbang93.com/"), vbCrLf & "下载来源:BMCLAPI by bangbang93", "") & If(f.WebAddress.Contains(TX_SREVER_1) Or f.WebAddress.Contains(TX_SREVER_2) Or f.WebAddress.Contains("bkt.clouddn.com/"), vbCrLf & "下载来源:PCL 服务器", "") & If(f.State = WebDownloadStats.Download And Not f.GetServerFileSize = WebRequireSize.DontNeed, vbCrLf & "文件大小:" & f.GetSize.ToString & " / " & f.TotalSize.ToString & vbCrLf & "下载速度:" & f.Speed.ToString & "/s", "") End Sub ControlDict.Add("FileGrid" & File.UUID, NewFileGrid) Dim FileImage As New Image With {.Height = 14, .HorizontalAlignment = HorizontalAlignment.Left, .Margin = New Thickness(4, 4, 0, 0), .VerticalAlignment = VerticalAlignment.Top, .Width = 14, .UseLayoutRounding = True, .Tag = "", .Opacity = 0.8} NewFileGrid.Children.Add(FileImage) ControlDict.Add("Image" & File.UUID, FileImage) Dim LeftLabel As New Label With {.Margin = New Thickness(23, 0, 0, 0), .Padding = New Thickness(0, 0, 4, 0), .VerticalContentAlignment = VerticalAlignment.Center, .Foreground = New MyColor(255, 75, 75, 75), .FontSize = 12} NewFileGrid.Children.Add(LeftLabel) ControlDict.Add("FileName" & File.UUID, LeftLabel) Dim RightLabel As New Label With {.Name = "Label" & File.UUID, .FontSize = 12, .Foreground = New MyColor(255, 75, 75, 75), .HorizontalAlignment = HorizontalAlignment.Right, .Padding = New Thickness(0), .VerticalContentAlignment = VerticalAlignment.Center, .Margin = New Thickness(0, 0, 3, 0), .Opacity = 0.6} NewFileGrid.Children.Add(RightLabel) ControlDict.Add("Label" & File.UUID, RightLabel) Grid.SetColumn(RightLabel, 1) Host.Children.Add(NewFileGrid) RefreshFile(File) Next End Sub ''' ''' 刷新一个 WebFile 在 UI 中的显示。 ''' Public Sub RefreshFile(File As WebFile) frmMain.Dispatcher.Invoke(Sub() Try '查找控件 Dim FileGrid As Grid = ControlDict("FileGrid" & File.UUID) Dim FileImage As Image = ControlDict("Image" & File.UUID) Dim FileName As Label = ControlDict("FileName" & File.UUID) Dim FileLabel As Label = ControlDict("Label" & File.UUID) '刷新 Grid 的指向信息 If FileGrid.IsMouseOver Then FileGrid.ToolTip = "下载地址:" & File.WebAddress & If(File.WebAddress.Contains("minecraft.net/") Or File.WebAddress.Contains("mojang.com/"), vbCrLf & "下载来源:Mojang 官方", "") & If(File.WebAddress.Contains("optifine.net/"), vbCrLf & "下载来源:OptiFine 官方", "") & If(File.WebAddress.Contains("minecraftforge.net/"), vbCrLf & "下载来源:Forge 官方", "") & If(File.WebAddress.Contains("bangbang93.com/"), vbCrLf & "下载来源:BMCLAPI by bangbang93", "") & If(File.WebAddress.Contains(TX_SREVER_1) Or File.WebAddress.Contains(TX_SREVER_2) Or File.WebAddress.Contains("bkt.clouddn.com/"), vbCrLf & "下载来源:PCL 服务器", "") & If(File.State = WebDownloadStats.Download And Not File.GetServerFileSize = WebRequireSize.DontNeed, vbCrLf & "文件大小:" & File.GetSize.ToString & " / " & File.TotalSize.ToString & vbCrLf & "下载速度:" & File.Speed.ToString & "/s", "") End If '刷新图标 Dim PictureSource As String = "" Select Case File.State Case WebDownloadStats.Success PictureSource = PATH_IMAGE & "Stats-Finish.png" Case WebDownloadStats.Download, WebDownloadStats.GetSize PictureSource = PATH_IMAGE & "Stats-Running.png" Case WebDownloadStats.Fail PictureSource = PATH_IMAGE & "Stats-Fail.png" Case WebDownloadStats.Wait, WebDownloadStats.FirstLoad PictureSource = PATH_IMAGE & "Stats-Wait.png" Case Else PictureSource = PATH_IMAGE & "Stats-Retry.png" End Select If Not FileImage.Tag = PictureSource Then FileImage.Tag = PictureSource FileImage.Source = New BitmapImage(New Uri(PictureSource, UriKind.Absolute)) End If '刷新右边的文本 Dim ShouldText As String Select Case File.State Case WebDownloadStats.Download ShouldText = If(File.TotalSize > 0, File.Percent * 100 & "%", "") Case WebDownloadStats.Fail ShouldText = "下载失败" Case WebDownloadStats.Wait, WebDownloadStats.FirstLoad ShouldText = "" Case WebDownloadStats.GetSize ShouldText = "准备中" Case WebDownloadStats.Success ShouldText = "下载成功" Case Else ShouldText = "等待重试" End Select If Not ShouldText = FileLabel.Content Then FileLabel.Content = ShouldText '移除下载成功的文件 If ShouldText = "下载成功" Then RemoveFile(File) End If End If '刷新文件名 If Not FileName.Content = File.LocalName Then FileName.Content = File.LocalName Catch End Try End Sub) End Sub ''' ''' 从 UI 中删除一个文件组。 ''' Public Sub RemoveGroup(Group As WebGroup) frmMain.Dispatcher.Invoke(Sub() Dim Target As Grid = ControlDict("MainGrid" & Group.UUID) AniStart({ AaOpacity(Target, -1, 250), AaHeight(Target, -Target.ActualHeight, 250, , New AniEaseEnd), AaCode({"Remove", panShow.Children, Target}, , True) }, "Remove" & GetUUID()) Target.Height = Target.ActualHeight RefreshPage() End Sub) End Sub ''' ''' 从 UI 中删除一个文件。 ''' Public Sub RemoveFile(File As WebFile) frmMain.Dispatcher.Invoke(Sub() Try If Not WebGroups.Keys.Contains(File.GroupName) Then Exit Sub Dim FileGrid As Grid = ControlDict("FileGrid" & File.UUID) Dim Stack As StackPanel = ControlDict("Host" & WebGroups(File.GroupName).UUID) If Stack.Children.Count > 30 Then AniStart({ AaCode({"Remove", Stack.Children, FileGrid}, 700) }, "File" & File.UUID, False) Else AniStart({ AaX(FileGrid, -191, 200, 600, New AniEaseJumpStart(0.25)), AaOpacity(FileGrid, -FileGrid.Opacity, 150, 700), AaHeight(FileGrid, -22, 100, 750), AaCode({"Remove", Stack.Children, FileGrid}, 850) }, "File" & File.UUID, False) End If Catch End Try End Sub) End Sub Private LastPageVisible As Boolean = True ''' ''' 刷新下载进度页可见性。 ''' Private Sub RefreshPage() If WebGroups.Count = 0 Then '没有下载任务 If scroll.IsHitTestVisible = True Or (LastPageVisible Xor frmDownloadLeft.panMain.Visibility = Visibility.Visible) Then LastPageVisible = frmDownloadLeft.panMain.Visibility = Visibility.Visible scroll.IsHitTestVisible = False If frmDownloadLeft.panMain.Visibility = Visibility.Collapsed Then '下载页被隐藏 panMain.Width = 230 panMain.Opacity = 1 AniStart({ AaOpacity(panBack, -panBack.Opacity, 200), AaOpacity(scroll, -scroll.Opacity, 200), AaOpacity(labNull, 0.9 - labNull.Opacity, 200), AaY(labNull, 146 - labNull.Margin.Top, 200, , New AniEaseEnd) }, "DownloadNothing") Else '下载页未被隐藏 AniStart({ AaWidth(panMain, -panMain.Width, 200, , New AniEaseEnd), AaOpacity(panMain, -panMain.Opacity, 150), AaWidth(frmDownloadLeft.panMain, 227 + 504 - frmDownloadLeft.panMain.Width, 250, , New AniEaseEnd) }, "DownloadNothing") End If End If Else '有下载任务 If scroll.IsHitTestVisible = False Or (LastPageVisible Xor frmDownloadLeft.panMain.Visibility = Visibility.Visible) Then LastPageVisible = frmDownloadLeft.panMain.Visibility = Visibility.Visible scroll.IsHitTestVisible = True If frmDownloadLeft.panMain.Visibility = Visibility.Collapsed Then '下载页被隐藏 panMain.Width = 230 panMain.Opacity = 1 AniStart({ AaOpacity(panBack, 1 - panBack.Opacity, 200), AaOpacity(labNull, -labNull.Opacity, 200), AaY(labNull, 152 - labNull.Margin.Top, 200, , New AniEaseStart) }, "DownloadNothing") Else '下载页未被隐藏 AniStart({ AaWidth(panMain, 230 - panMain.Width, 200, , New AniEaseEnd), AaOpacity(panMain, 1 - panMain.Opacity, 150, 50), AaWidth(frmDownloadLeft.panMain, 504 - frmDownloadLeft.panMain.Width, 250, , New AniEaseEnd) }, "DownloadNothing") End If End If End If End Sub End Class