PageOtherHelp.xaml.vb 8.2 KB

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