PageOtherHelp.xaml.vb 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. Public Class PageOtherHelp
  2. #Region "初始化"
  3. '滚动条
  4. Private Sub PageOther_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
  5. PanBack.ScrollToHome()
  6. End Sub
  7. '初始化加载器信息
  8. Private Sub PageOther_Inited(sender As Object, e As EventArgs) Handles Me.Initialized
  9. PageLoaderInit(Load, PanLoad, PanBack, Nothing, HelpLoader, AddressOf HelpListLoad)
  10. End Sub
  11. #End Region
  12. ''' <summary>
  13. ''' 将帮助列表对象实例化为主页 UI。
  14. ''' </summary>
  15. Private Sub HelpListLoad(Loader As LoaderTask(Of Integer, List(Of HelpEntry)))
  16. Try
  17. '初始化
  18. PanList.Children.Clear()
  19. PanBack.ScrollToHome()
  20. Dim HelpItems = Loader.Output
  21. '获取全部分类
  22. Dim Types As New List(Of String)
  23. For Each Item As HelpEntry In HelpItems
  24. If Val(VersionBranchCode) = 50 AndAlso Not Item.ShowInPublic Then Continue For
  25. If Val(VersionBranchCode) <> 50 AndAlso Not Item.ShowInSnapshot Then Continue For
  26. For Each Type In Item.Types
  27. If Not Types.Contains(Type) Then Types.Add(Type)
  28. Next
  29. Next
  30. '将指南页面置顶
  31. If Types.Contains("指南") Then
  32. Types.Remove("指南")
  33. Types.Insert(0, "指南")
  34. End If
  35. '转化为 UI
  36. For Each Type As String In Types
  37. '确认所属该分类的项目
  38. Dim TypeItems As New List(Of HelpEntry)
  39. For Each Item In HelpItems
  40. If Val(VersionBranchCode) = 50 AndAlso Not Item.ShowInPublic Then Continue For
  41. If Val(VersionBranchCode) <> 50 AndAlso Not Item.ShowInSnapshot Then Continue For
  42. If Item.Types.Contains(Type) Then TypeItems.Add(Item)
  43. Next
  44. '增加卡片
  45. Dim NewCard As New MyCard With {.Title = Type, .Margin = New Thickness(0, 0, 0, 15), .SwapType = 11}
  46. Dim NewStack As New StackPanel With {.Margin = New Thickness(20, MyCard.SwapedHeight, 18, 0), .VerticalAlignment = VerticalAlignment.Top, .RenderTransform = New TranslateTransform(0, 0), .Tag = TypeItems}
  47. NewCard.Children.Add(NewStack)
  48. NewCard.SwapControl = NewStack
  49. If Type = "指南" Then
  50. MyCard.StackInstall(NewStack, 11, "指南")
  51. Else
  52. NewCard.IsSwaped = True
  53. End If
  54. PanList.Children.Add(NewCard)
  55. Next
  56. Catch ex As Exception
  57. Log(ex, "加载帮助列表 UI 失败", LogLevel.Feedback)
  58. End Try
  59. End Sub
  60. ''' <summary>
  61. ''' 帮助项目的点击事件。
  62. ''' </summary>
  63. Public Shared Sub OnItemClick(Entry As HelpEntry)
  64. Try
  65. If Entry.IsEvent Then
  66. ModEvent.TryStartEvent(Entry.EventType, Entry.EventData)
  67. Else
  68. EnterHelpPage(Entry)
  69. End If
  70. Catch ex As Exception
  71. Log(ex, "处理帮助项目点击时发生意外错误", LogLevel.Feedback)
  72. End Try
  73. End Sub
  74. Public Shared Sub EnterHelpPage(Location As String)
  75. RunInThread(Sub()
  76. If Not HelpLoader.State = LoadState.Finished Then HelpLoader.WaitForExit(GetUuid)
  77. Dim Entry As New HelpEntry(Location)
  78. RunInUi(Sub()
  79. Dim FrmHelpDetail As New PageOtherHelpDetail
  80. If FrmHelpDetail.Init(Entry) Then
  81. FrmMain.PageChange(New FormMain.PageStackData With {.Page = FormMain.PageType.HelpDetail, .Additional = {Entry, FrmHelpDetail}})
  82. Else
  83. Log("[Help] 已取消进入帮助项目,这一般是由于 xaml 初始化失败,且用户在弹窗中手动放弃", LogLevel.Debug)
  84. End If
  85. End Sub)
  86. End Sub)
  87. End Sub
  88. Public Shared Sub EnterHelpPage(Entry As HelpEntry)
  89. RunInThread(Sub()
  90. If Not HelpLoader.State = LoadState.Finished Then HelpLoader.WaitForExit(GetUuid)
  91. RunInUi(Sub()
  92. Dim FrmHelpDetail As New PageOtherHelpDetail
  93. If FrmHelpDetail.Init(Entry) Then
  94. FrmMain.PageChange(New FormMain.PageStackData With {.Page = FormMain.PageType.HelpDetail, .Additional = {Entry, FrmHelpDetail}})
  95. Else
  96. Log("[Help] 已取消进入帮助项目,这一般是由于 xaml 初始化失败,且用户在弹窗中手动放弃", LogLevel.Debug)
  97. End If
  98. End Sub)
  99. End Sub)
  100. End Sub
  101. Public Shared Function GetHelpPage(Location As String) As PageOtherHelpDetail
  102. If Not HelpLoader.State = LoadState.Finished Then HelpLoader.WaitForExit(GetUuid)
  103. Dim FrmHelpDetail As New PageOtherHelpDetail
  104. If FrmHelpDetail.Init(New HelpEntry(Location)) Then
  105. Return FrmHelpDetail
  106. Else
  107. Throw New Exception("已取消进入帮助项目,这一般是由于 xaml 初始化失败,且用户在弹窗中手动放弃")
  108. End If
  109. End Function
  110. ''' <summary>
  111. ''' 搜索帮助。
  112. ''' </summary>
  113. Public Sub SearchRun() Handles SearchBox.TextChanged
  114. If String.IsNullOrWhiteSpace(SearchBox.Text) Then
  115. '隐藏
  116. AniStart({
  117. AaOpacity(PanSearch, -PanSearch.Opacity, 100),
  118. AaCode(Sub()
  119. PanSearch.Height = 0
  120. PanSearch.Visibility = Visibility.Collapsed
  121. PanList.Visibility = Visibility.Visible
  122. End Sub,, True),
  123. AaOpacity(PanList, 1 - PanList.Opacity, 150, 30)
  124. }, "FrmOtherHelp Search Switch")
  125. Else
  126. '构造请求
  127. Dim QueryList As New List(Of SearchEntry(Of HelpEntry))
  128. For Each Entry As HelpEntry In HelpLoader.Output
  129. If Not Entry.ShowInSearch OrElse (Val(VersionBranchCode) = 50 AndAlso Not Entry.ShowInPublic) Then Continue For
  130. If Not Entry.ShowInSearch OrElse (Val(VersionBranchCode) <> 50 AndAlso Not Entry.ShowInSnapshot) Then Continue For
  131. QueryList.Add(New SearchEntry(Of HelpEntry) With {
  132. .Item = Entry,
  133. .SearchSource = New List(Of KeyValuePair(Of String, Double)) From {
  134. New KeyValuePair(Of String, Double)(Entry.Title, 1),
  135. New KeyValuePair(Of String, Double)(Entry.Desc, 0.5),
  136. New KeyValuePair(Of String, Double)(Entry.Search, 1.5)
  137. }
  138. })
  139. 'New KeyValuePair(Of String, Double)(If(Entry.IsEvent, If(Entry.EventData, ""), Entry.XamlContent), 0.2)
  140. Next
  141. '进行搜索,构造列表
  142. Dim SearchResult = Search(QueryList, SearchBox.Text, MaxBlurCount:=5, MinBlurSimilarity:=0.08)
  143. PanSearchList.Children.Clear()
  144. If SearchResult.Count = 0 Then
  145. PanSearch.Title = "无搜索结果"
  146. PanSearchList.Visibility = Visibility.Collapsed
  147. Else
  148. PanSearch.Title = "搜索结果"
  149. For Each Result In SearchResult
  150. Dim Item = Result.Item.ToListItem
  151. If ModeDebug Then Item.Info = If(Result.AbsoluteRight, "完全匹配,", "") & "相似度:" & Math.Round(Result.Similarity, 3) & "," & Item.Info
  152. PanSearchList.Children.Add(Item)
  153. Next
  154. PanSearchList.Visibility = Visibility.Visible
  155. End If
  156. '显示
  157. AniStart({
  158. AaOpacity(PanList, -PanList.Opacity, 100),
  159. AaCode(Sub()
  160. PanList.Visibility = Visibility.Collapsed
  161. PanSearch.Visibility = Visibility.Visible
  162. PanSearch.TriggerForceResize()
  163. End Sub,, True),
  164. AaOpacity(PanSearch, 1 - PanSearch.Opacity, 150, 30)
  165. }, "FrmOtherHelp Search Switch")
  166. End If
  167. End Sub
  168. End Class