PageVersionMod.xaml.vb 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487
  1. Public Class PageVersionMod
  2. #Region "初始化"
  3. Private IsLoad As Boolean = False
  4. Public Sub PageOther_Loaded() Handles Me.Loaded
  5. PanBack.ScrollToHome()
  6. RefreshList()
  7. '非重复加载部分
  8. If IsLoad Then Exit Sub
  9. IsLoad = True
  10. #If DEBUG Then
  11. BtnManageCheck.Visibility = Visibility.Visible
  12. #End If
  13. End Sub
  14. ''' <summary>
  15. ''' 刷新 Mod 列表。
  16. ''' </summary>
  17. Public Sub RefreshList(Optional ForceReload As Boolean = False)
  18. If McModLoader.State = LoadState.Loading Then Exit Sub
  19. If LoaderFolderRun(McModLoader, PageVersionLeft.Version.PathIndie & "mods\", If(ForceReload, LoaderFolderRunType.ForceRun, LoaderFolderRunType.RunOnUpdated)) Then
  20. Log("[System] 已刷新 Mod 列表")
  21. PanBack.ScrollToHome()
  22. SearchBox.Text = ""
  23. End If
  24. End Sub
  25. Private Sub LoaderInit() Handles Me.Initialized
  26. PageLoaderInit(Load, PanLoad, PanAllBack, Nothing, McModLoader, AddressOf Load_Finish, AutoRun:=False)
  27. End Sub
  28. Private Sub Load_Click(sender As Object, e As MouseButtonEventArgs) Handles Load.Click
  29. If McModLoader.State = LoadState.Failed Then
  30. LoaderFolderRun(McModLoader, PageVersionLeft.Version.PathIndie & "mods\", LoaderFolderRunType.ForceRun)
  31. End If
  32. End Sub
  33. #End Region
  34. #Region "UI 化"
  35. ''' <summary>
  36. ''' 将 Mod 列表加载为 UI。
  37. ''' </summary>
  38. Private Sub Load_Finish(Loader As LoaderTask(Of String, List(Of McMod)))
  39. Dim List As List(Of McMod) = Loader.Output
  40. Try
  41. PanList.Children.Clear()
  42. '判断应该显示哪一个页面
  43. If List.Count = 0 Then
  44. PanEmpty.Visibility = Visibility.Visible
  45. PanBack.Visibility = Visibility.Collapsed
  46. Exit Sub
  47. Else
  48. PanBack.Visibility = Visibility.Visible
  49. PanEmpty.Visibility = Visibility.Collapsed
  50. End If
  51. SearchBox.Text = ""
  52. '建立 StackPanel
  53. Dim NewStack As New StackPanel With {.Margin = New Thickness(20, MyCard.SwapedHeight, 18, If(List.Count > 0, 20, 0)), .VerticalAlignment = VerticalAlignment.Top, .RenderTransform = New TranslateTransform(0, 0)}
  54. For Each ModEntity As McMod In List
  55. NewStack.Children.Add(McModListItem(ModEntity))
  56. Next
  57. '建立 MyCard
  58. Dim NewCard As New MyCard With {.Title = McModGetTitle(List), .Margin = New Thickness(0, 0, 0, 15)}
  59. NewCard.Children.Add(NewStack)
  60. PanList.Children.Add(NewCard)
  61. '显示提示
  62. If List.Count > 0 AndAlso Not Setup.Get("HintModDisable") Then
  63. Setup.Set("HintModDisable", True)
  64. Hint("直接点击某个 Mod 项即可将它禁用!")
  65. End If
  66. Catch ex As Exception
  67. Log(ex, "加载 Mod 列表 UI 失败", LogLevel.Feedback)
  68. End Try
  69. End Sub
  70. ''' <summary>
  71. ''' 获取 Card 的标题。
  72. ''' </summary>
  73. Private Function McModGetTitle(List As List(Of McMod)) As String
  74. Dim Counter = {0, 0, 0}
  75. For Each ModEntity As McMod In List
  76. Counter(ModEntity.State) += 1
  77. Next
  78. If List.Count = 0 Then
  79. '全空
  80. Return "未找到任何 Mod"
  81. ElseIf Counter(McMod.McModState.Disabled) = 0 AndAlso Counter(McMod.McModState.Unavaliable) = 0 Then
  82. '只有启用的 Mod
  83. Return "Mod 列表(" & Counter(McMod.McModState.Fine) & ")"
  84. Else
  85. '混合种类
  86. Dim TypeList As New List(Of String)
  87. If Counter(McMod.McModState.Fine) > 0 Then TypeList.Add("启用 " & Counter(McMod.McModState.Fine))
  88. If Counter(McMod.McModState.Disabled) > 0 Then TypeList.Add("禁用 " & Counter(McMod.McModState.Disabled))
  89. If Counter(McMod.McModState.Unavaliable) > 0 Then TypeList.Add("错误 " & Counter(McMod.McModState.Unavaliable))
  90. Return "Mod 列表(" & Join(TypeList, ",") & ")"
  91. End If
  92. End Function
  93. Private Function McModListItem(Entry As McMod) As MyListItem
  94. '图标
  95. Dim Logo As String
  96. Select Case Entry.State
  97. Case McMod.McModState.Fine
  98. Logo = "pack://application:,,,/images/Blocks/RedstoneLampOn.png"
  99. Case McMod.McModState.Disabled
  100. Logo = "pack://application:,,,/images/Blocks/RedstoneLampOff.png"
  101. Case Else '出错
  102. Logo = "pack://application:,,,/images/Blocks/RedstoneBlock.png"
  103. End Select
  104. '文本
  105. Dim Title As String
  106. If Entry.State = McMod.McModState.Disabled Then
  107. Title = GetFileNameWithoutExtentionFromPath(Entry.Path.Substring(0, Entry.Path.Count - ".disabled".Count)) & "(已禁用)"
  108. Else
  109. Title = GetFileNameWithoutExtentionFromPath(Entry.Path)
  110. End If
  111. Dim Desc As String
  112. If Entry.Version Is Nothing OrElse Entry.Description IsNot Nothing Then
  113. Desc = Entry.Name & If(Entry.Version Is Nothing, "", " (" & Entry.Version & ")") & " : " & If(Entry.Description, Entry.Path)
  114. ElseIf Entry.IsFileAvailable Then
  115. Desc = Entry.Path
  116. Else
  117. Desc = "存在错误 : " & Entry.Path
  118. End If
  119. 'Desc = If(Entry.ModId, "无可用名称") & " (" & If(Entry.Version, "无可用版本") & ")"
  120. 'If Entry.Dependencies.Count > 0 Then
  121. ' Dim DepList As New List(Of String)
  122. ' For Each Dep In Entry.Dependencies
  123. ' DepList.Add(Dep.Key & If(Dep.Value Is Nothing, "", "@" & Dep.Value))
  124. ' Next
  125. ' Desc += " : " & Join(DepList, ", ")
  126. 'End If
  127. '实例化
  128. Dim NewItem As New MyListItem With {.Logo = Logo, .SnapsToDevicePixels = True, .Title = Title, .Info = Desc, .Height = 42, .Type = MyListItem.CheckType.Clickable, .Tag = Entry}
  129. NewItem.PaddingRight = If(Entry.IsFileAvailable, 73, 55)
  130. '事件
  131. NewItem.ContentHandler = AddressOf McModContent
  132. Return NewItem
  133. End Function
  134. Private Sub McModContent(sender As MyListItem, e As EventArgs)
  135. Dim ModEntity As McMod = sender.Tag
  136. '注册点击事件
  137. AddHandler sender.Click, AddressOf Item_Click
  138. '图标按钮
  139. Dim BtnDel As New MyIconButton With {.LogoScale = 1.1, .Logo = Logo.IconButtonDelete, .Tag = sender}
  140. BtnDel.ToolTip = "删除"
  141. ToolTipService.SetPlacement(BtnDel, Primitives.PlacementMode.Center)
  142. ToolTipService.SetVerticalOffset(BtnDel, 30)
  143. ToolTipService.SetHorizontalOffset(BtnDel, 2)
  144. AddHandler BtnDel.Click, AddressOf Delete_Click
  145. Dim BtnOpen As New MyIconButton With {.LogoScale = 1.15, .Logo = Logo.IconButtonOpen, .Tag = sender}
  146. BtnOpen.ToolTip = "打开文件位置"
  147. ToolTipService.SetPlacement(BtnOpen, Primitives.PlacementMode.Center)
  148. ToolTipService.SetVerticalOffset(BtnOpen, 30)
  149. ToolTipService.SetHorizontalOffset(BtnOpen, 2)
  150. AddHandler BtnOpen.Click, AddressOf Open_Click
  151. If ModEntity.IsFileAvailable Then
  152. Dim BtnCont As New MyIconButton With {.LogoScale = 1.05, .Logo = Logo.IconButtonInfo, .Tag = sender}
  153. BtnCont.ToolTip = "详情"
  154. ToolTipService.SetPlacement(BtnCont, Primitives.PlacementMode.Center)
  155. ToolTipService.SetVerticalOffset(BtnCont, 30)
  156. ToolTipService.SetHorizontalOffset(BtnCont, 2)
  157. AddHandler BtnCont.Click, AddressOf Info_Click
  158. AddHandler sender.MouseRightButtonDown, AddressOf Info_Click
  159. sender.Buttons = {BtnCont, BtnOpen, BtnDel}
  160. Else
  161. sender.Buttons = {BtnOpen, BtnDel}
  162. End If
  163. End Sub
  164. #End Region
  165. #Region "管理"
  166. ''' <summary>
  167. ''' 打开 Mods 文件夹。
  168. ''' </summary>
  169. Private Sub BtnManageOpen_Click(sender As Object, e As EventArgs) Handles BtnManageOpen.Click, BtnHintOpen.Click
  170. Try
  171. Directory.CreateDirectory(PageVersionLeft.Version.PathIndie & "mods\")
  172. OpenExplorer("""" & PageVersionLeft.Version.PathIndie & "mods\""")
  173. Catch ex As Exception
  174. Log(ex, "打开 Mods 文件夹失败", LogLevel.Msgbox)
  175. End Try
  176. End Sub
  177. #If DEBUG Then
  178. ''' <summary>
  179. ''' 检查 Mod。
  180. ''' </summary>
  181. Private Sub BtnManageCheck_Click(sender As Object, e As EventArgs) Handles BtnManageCheck.Click
  182. Try
  183. Dim Result = McModCheck(PageVersionLeft.Version, McModLoader.Output)
  184. If Result.Count > 0 Then
  185. MyMsgBox(Join(Result, vbCrLf & vbCrLf), "Mod 检查结果")
  186. Else
  187. Hint("Mod 检查完成,未发现任何问题!", HintType.Finish)
  188. End If
  189. Catch ex As Exception
  190. Log(ex, "进行 Mod 检查时出错", LogLevel.Feedback)
  191. End Try
  192. End Sub
  193. #End If
  194. ''' <summary>
  195. ''' 一键启用 / 禁用。
  196. ''' </summary>
  197. Private Sub BtnManageChange_Click(sender As MyButton, e As EventArgs) Handles BtnManageEnabled.Click, BtnManageDisabled.Click
  198. Dim IsSuccessful As Boolean = True
  199. Dim SuccessfulCount As Integer = 0
  200. Dim IsDisable As Boolean = sender.Text.Contains("禁用")
  201. For Each ModEntity In McModLoader.Output
  202. Dim NewPath As String = Nothing
  203. If ModEntity.State = McMod.McModState.Fine And IsDisable Then
  204. '禁用
  205. NewPath = ModEntity.Path & ".disabled"
  206. ElseIf ModEntity.State = McMod.McModState.Disabled AndAlso Not IsDisable Then
  207. '启用
  208. NewPath = ModEntity.Path.Substring(0, ModEntity.Path.Count - ".disabled".Count)
  209. Else
  210. SuccessfulCount += 1
  211. Continue For
  212. End If
  213. '重命名
  214. Try
  215. If File.Exists(NewPath) AndAlso Not File.Exists(ModEntity.Path) Then Continue For '因为未知原因 Mod 的状态已经切换完了
  216. File.Delete(NewPath)
  217. FileSystem.Rename(ModEntity.Path, NewPath)
  218. SuccessfulCount += 1
  219. Catch ex As FileNotFoundException
  220. Log(ex, "未找到需要重命名的 Mod(" & If(ex.FileName, "null") & ")", LogLevel.Feedback)
  221. RefreshList()
  222. Exit Sub
  223. Catch ex As Exception
  224. Log(ex, "全局状态改变中重命名 Mod 失败")
  225. IsSuccessful = False
  226. End Try
  227. Next
  228. If Not IsSuccessful Then Hint("由于文件被占用,部分 Mod 的状态切换失败,请尝试关闭正在运行的游戏后再试!", HintType.Critical)
  229. Log("[System] 已确认 " & SuccessfulCount & "/" & McModLoader.Output.Count & " 个 Mod 的状态与要求一致")
  230. RefreshList()
  231. End Sub
  232. #End Region
  233. #Region "单个 Mod 项"
  234. '点击:切换可用状态 / 显示错误原因
  235. Public Sub Item_Click(sender As MyListItem, e As EventArgs)
  236. Try
  237. Dim ModEntity As McMod = sender.Tag
  238. Dim NewPath As String = Nothing
  239. Select Case ModEntity.State
  240. Case McMod.McModState.Fine
  241. '前置检测警告
  242. If ModEntity.IsPresetMod Then
  243. If MyMsgBox("该 Mod 可能为其他 Mod 的前置,如果禁用可能导致其他 Mod 无法使用。" & vbCrLf & "你确定要继续禁用吗?", "警告", "禁用", "取消") = 2 Then Exit Sub
  244. End If
  245. NewPath = ModEntity.Path & ".disabled"
  246. Case McMod.McModState.Disabled
  247. NewPath = ModEntity.Path.Substring(0, ModEntity.Path.Count - ".disabled".Count)
  248. Case McMod.McModState.Unavaliable
  249. MyMsgBox("无法读取此 Mod 的信息。" & vbCrLf & vbCrLf & "详细的错误信息:" & GetExceptionDetail(ModEntity.FileUnavailableReason), "Mod 读取失败")
  250. Exit Sub
  251. End Select
  252. '重命名
  253. Dim NewModEntity As New McMod(NewPath)
  254. Try
  255. File.Delete(NewPath)
  256. FileSystem.Rename(ModEntity.Path, NewPath)
  257. Catch ex As FileNotFoundException
  258. Log(ex, "未找到理应存在的 Mod 文件(" & ModEntity.Path & ")")
  259. FileSystem.Rename(NewPath, ModEntity.Path)
  260. NewModEntity = New McMod(ModEntity.Path)
  261. End Try
  262. '更改 Loader 中的列表
  263. Dim IndexOfLoader As Integer = McModLoader.Output.IndexOf(ModEntity)
  264. McModLoader.Output.RemoveAt(IndexOfLoader)
  265. McModLoader.Output.Insert(IndexOfLoader, NewModEntity)
  266. '更改 UI 中的列表
  267. Dim Parent As StackPanel = sender.Parent
  268. Dim IndexOfUi As Integer = Parent.Children.IndexOf(sender)
  269. Parent.Children.RemoveAt(IndexOfUi)
  270. Parent.Children.Insert(IndexOfUi, McModListItem(NewModEntity))
  271. '仅在非搜索页面才执行,以确保搜索页内外显示一致
  272. If String.IsNullOrWhiteSpace(SearchBox.Text) Then
  273. '改变禁用数量的显示
  274. CType(Parent.Parent, MyCard).Title = McModGetTitle(McModLoader.Output)
  275. '更新加载器状态
  276. LoaderFolderRun(McModLoader, PageVersionLeft.Version.PathIndie & "mods\", LoaderFolderRunType.UpdateOnly)
  277. End If
  278. Catch ex As Exception
  279. Log(ex, "单个状态改变中重命名 Mod 失败")
  280. Hint("切换 Mod 状态失败,请尝试关闭正在运行的游戏后再试!")
  281. LoaderFolderRun(McModLoader, PageVersionLeft.Version.PathIndie & "mods\", LoaderFolderRunType.UpdateOnly)
  282. End Try
  283. End Sub
  284. '删除
  285. Public Sub Delete_Click(sender As MyIconButton, e As EventArgs)
  286. Try
  287. Dim IsShiftPressed As Boolean = My.Computer.Keyboard.ShiftKeyDown
  288. Dim ListItem As MyListItem = sender.Tag
  289. Dim ModEntity As McMod = ListItem.Tag
  290. '前置检测警告
  291. If ModEntity.IsPresetMod Then
  292. If MyMsgBox("该 Mod 可能为其他 Mod 的前置,如果删除可能导致其他 Mod 无法使用。" & vbCrLf & "你确定要继续删除吗?", "警告", "删除", "取消", IsWarn:=True) = 2 Then Exit Sub
  293. End If
  294. '删除
  295. If File.Exists(ModEntity.Path) Then
  296. If IsShiftPressed Then
  297. File.Delete(ModEntity.Path)
  298. Else
  299. My.Computer.FileSystem.DeleteFile(ModEntity.Path, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin)
  300. End If
  301. Else
  302. '在不明原因下删除的文件可能还在列表里,如果玩家又点了一次就会出错,总之加个判断也不碍事
  303. Log("[System] 需要删除的 Mod 文件不存在(" & ModEntity.Path & ")", LogLevel.Hint)
  304. Exit Sub
  305. End If
  306. '更改 Loader 中的列表
  307. McModLoader.Output.Remove(ModEntity)
  308. '更改 UI 中的列表
  309. Dim Parent As StackPanel = ListItem.Parent
  310. Parent.Children.Remove(ListItem)
  311. If Parent.Children.Count = 0 Then
  312. RefreshList(True)
  313. Else
  314. CType(Parent.Parent, MyCard).Title = McModGetTitle(McModLoader.Output)
  315. End If
  316. '显示提示
  317. If IsShiftPressed Then
  318. Hint("已删除 " & ModEntity.FileName & "!", HintType.Finish)
  319. Else
  320. Hint("已将 " & ModEntity.FileName & " 删除到回收站!", HintType.Finish)
  321. End If
  322. LoaderFolderRun(McModLoader, PageVersionLeft.Version.PathIndie & "mods\", LoaderFolderRunType.UpdateOnly)
  323. Catch ex As OperationCanceledException
  324. Log(ex, "删除 Mod 被主动取消")
  325. Catch ex As Exception
  326. Log(ex, "删除 Mod 失败", LogLevel.Feedback)
  327. End Try
  328. End Sub
  329. '详情
  330. Public Sub Info_Click(sender As Object, e As EventArgs)
  331. Try
  332. Dim ListItem As MyListItem
  333. ListItem = If(TypeOf sender Is MyIconButton, sender.Tag, sender)
  334. Dim ModEntity As McMod = ListItem.Tag
  335. '获取信息
  336. Dim ContentLines As New List(Of String)
  337. If ModEntity.Description IsNot Nothing Then ContentLines.Add(ModEntity.Description & vbCrLf)
  338. If ModEntity.Authors IsNot Nothing Then ContentLines.Add("作者:" & ModEntity.Authors)
  339. ContentLines.Add("文件:" & ModEntity.FileName & "(" & GetString(New FileInfo(ModEntity.Path).Length) & ")")
  340. If ModEntity.Version IsNot Nothing Then ContentLines.Add("版本:" & ModEntity.Version)
  341. If ModeDebug Then
  342. Dim DebugInfo As New List(Of String)
  343. If ModEntity.ModId IsNot Nothing Then
  344. DebugInfo.Add("Mod ID:" & ModEntity.ModId)
  345. End If
  346. If ModEntity.Dependencies.Count > 0 Then
  347. DebugInfo.Add("依赖于:")
  348. For Each Dep In ModEntity.Dependencies
  349. DebugInfo.Add(" - " & Dep.Key & If(Dep.Value Is Nothing, "", ",版本:" & Dep.Value))
  350. Next
  351. End If
  352. If DebugInfo.Count > 0 Then
  353. ContentLines.Add(vbCrLf & "—————— 调试信息 ——————")
  354. ContentLines.AddRange(DebugInfo)
  355. End If
  356. End If
  357. '获取用于搜索的 Mod 名称
  358. Dim ModOriginalName As String = ModEntity.Name.Replace(" ", "+")
  359. Dim ModSearchName As String = ModOriginalName.Substring(0, 1)
  360. For i = 1 To ModOriginalName.Count - 1
  361. Dim IsLastLower As Boolean = ModOriginalName(i - 1).ToString.ToLower.Equals(ModOriginalName(i - 1).ToString)
  362. Dim IsCurrentLower As Boolean = ModOriginalName(i).ToString.ToLower.Equals(ModOriginalName(i).ToString)
  363. If IsLastLower AndAlso Not IsCurrentLower Then
  364. '上一个字母为小写,这一个字母为大写
  365. ModSearchName += "+"
  366. End If
  367. ModSearchName += ModOriginalName(i)
  368. Next
  369. ModSearchName = ModSearchName.Replace("++", "+").Replace("pti+Fine", "ptiFine")
  370. '显示
  371. If ModEntity.Url Is Nothing Then
  372. If MyMsgBox(Join(ContentLines, vbCrLf), ModEntity.Name, "百科搜索", "返回") = 1 Then
  373. OpenWebsite("https://www.mcmod.cn/s?key=" & ModSearchName & "&site=all&filter=0")
  374. End If
  375. Else
  376. Select Case MyMsgBox(Join(ContentLines, vbCrLf), ModEntity.Name, "打开官网", "百科搜索", "返回")
  377. Case 1
  378. OpenWebsite(ModEntity.Url)
  379. Case 2
  380. OpenWebsite("https://www.mcmod.cn/s?key=" & ModSearchName & "&site=all&filter=0")
  381. End Select
  382. End If
  383. Catch ex As Exception
  384. Log(ex, "获取 Mod 详情失败", LogLevel.Feedback)
  385. End Try
  386. End Sub
  387. '打开文件所在的位置
  388. Public Sub Open_Click(sender As MyIconButton, e As EventArgs)
  389. Try
  390. Dim ListItem As MyListItem = sender.Tag
  391. Dim ModEntity As McMod = ListItem.Tag
  392. OpenExplorer("/select,""" & ModEntity.Path & """")
  393. Catch ex As Exception
  394. Log(ex, "打开 Mod 文件位置失败", LogLevel.Feedback)
  395. End Try
  396. End Sub
  397. #End Region
  398. Public Sub SearchRun() Handles SearchBox.TextChanged
  399. If String.IsNullOrWhiteSpace(SearchBox.Text) Then
  400. '隐藏
  401. LoaderFolderRun(McModLoader, PageVersionLeft.Version.PathIndie & "mods\", LoaderFolderRunType.RunOnUpdated)
  402. AniStart({
  403. AaOpacity(PanSearch, -PanSearch.Opacity, 100),
  404. AaCode(Sub()
  405. PanSearch.Height = 0
  406. PanSearch.Visibility = Visibility.Collapsed
  407. PanList.Visibility = Visibility.Visible
  408. PanManage.Visibility = Visibility.Visible
  409. End Sub,, True),
  410. AaOpacity(PanList, 1 - PanList.Opacity, 150, 30),
  411. AaOpacity(PanManage, 1 - PanManage.Opacity, 150, 30)
  412. }, "FrmVersionMod Search Switch", True)
  413. Else
  414. '构造请求
  415. Dim QueryList As New List(Of SearchEntry(Of McMod))
  416. For Each Entry As McMod In McModLoader.Output
  417. QueryList.Add(New SearchEntry(Of McMod) With {
  418. .Item = Entry,
  419. .SearchSource = New List(Of KeyValuePair(Of String, Double)) From {
  420. New KeyValuePair(Of String, Double)(Entry.Name, 1),
  421. New KeyValuePair(Of String, Double)(Entry.FileName, 1),
  422. New KeyValuePair(Of String, Double)(If(Entry.Description, ""), 0.5)
  423. }
  424. })
  425. Next
  426. '进行搜索,构造列表
  427. Dim SearchResult = Search(QueryList, SearchBox.Text, MaxBlurCount:=5, MinBlurSimilarity:=0.35)
  428. PanSearchList.Children.Clear()
  429. If SearchResult.Count = 0 Then
  430. PanSearch.Title = "无搜索结果"
  431. PanSearchList.Visibility = Visibility.Collapsed
  432. Else
  433. PanSearch.Title = "搜索结果"
  434. For Each Result In SearchResult
  435. Dim Item = McModListItem(Result.Item)
  436. If ModeDebug Then Item.Info = If(Result.AbsoluteRight, "完全匹配,", "") & "相似度:" & Math.Round(Result.Similarity, 3) & "," & Item.Info
  437. PanSearchList.Children.Add(Item)
  438. Next
  439. PanSearchList.Visibility = Visibility.Visible
  440. End If
  441. '显示
  442. AniStart({
  443. AaOpacity(PanList, -PanList.Opacity, 100),
  444. AaOpacity(PanManage, -PanManage.Opacity, 100),
  445. AaCode(Sub()
  446. PanList.Visibility = Visibility.Collapsed
  447. PanManage.Visibility = Visibility.Collapsed
  448. PanSearch.Visibility = Visibility.Visible
  449. PanSearch.TriggerForceResize()
  450. End Sub,, True),
  451. AaOpacity(PanSearch, 1 - PanSearch.Opacity, 200, 60)
  452. }, "FrmVersionMod Search Switch", True)
  453. End If
  454. End Sub
  455. End Class