MyCompItem.xaml.vb 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. Public Class MyCompItem
  2. #Region "基础属性"
  3. Public Uuid As Integer = GetUuid()
  4. 'Logo
  5. Public Property Logo As String
  6. Get
  7. Return PathLogo.Source
  8. End Get
  9. Set(value As String)
  10. PathLogo.Source = value
  11. End Set
  12. End Property
  13. '标题
  14. Public Property Title As String
  15. Get
  16. Return LabTitle.Text
  17. End Get
  18. Set(value As String)
  19. If LabTitle.Text = value Then Exit Property
  20. LabTitle.Text = value
  21. End Set
  22. End Property
  23. '副标题
  24. Public Property SubTitle As String
  25. Get
  26. Return If(LabTitleRaw?.Text, "")
  27. End Get
  28. Set(value As String)
  29. If LabTitleRaw.Text = value Then Exit Property
  30. LabTitleRaw.Text = value
  31. LabTitleRaw.Visibility = If(value = "", Visibility.Collapsed, Visibility.Visible)
  32. End Set
  33. End Property
  34. '描述
  35. Public Property Description As String
  36. Get
  37. Return LabInfo.Text
  38. End Get
  39. Set(value As String)
  40. If LabInfo.Text = value Then Exit Property
  41. LabInfo.Text = value
  42. End Set
  43. End Property
  44. '指向时扩展描述
  45. Private Sub LabInfo_MouseEnter(sender As Object, e As MouseEventArgs) Handles LabInfo.MouseEnter
  46. If IsTextTrimmed(LabInfo) Then
  47. ToolTipInfo.Content = LabInfo.Text
  48. ToolTipInfo.Width = LabInfo.ActualWidth + 25
  49. LabInfo.ToolTip = ToolTipInfo
  50. Else
  51. LabInfo.ToolTip = Nothing
  52. End If
  53. End Sub
  54. Private Function IsTextTrimmed(textBlock As TextBlock) As Boolean
  55. Dim typeface As New Typeface(textBlock.FontFamily, textBlock.FontStyle, textBlock.FontWeight, textBlock.FontStretch)
  56. Dim formattedText As New FormattedText(textBlock.Text, Thread.CurrentThread.CurrentCulture, textBlock.FlowDirection, typeface, textBlock.FontSize, textBlock.Foreground, DPI)
  57. Return formattedText.Width > textBlock.ActualWidth
  58. End Function
  59. 'Tag
  60. Public WriteOnly Property Tags As List(Of String)
  61. Set(value As List(Of String))
  62. PanTags.Children.Clear()
  63. PanTags.Visibility = If(value.Any(), Visibility.Visible, Visibility.Collapsed)
  64. For Each TagText In value
  65. Dim NewTag = GetObjectFromXML(
  66. "<Border xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
  67. Background=""#11000000"" Padding=""3,1"" CornerRadius=""3"" Margin=""0,0,3,0""
  68. SnapsToDevicePixels=""True"" UseLayoutRounding=""False"">
  69. <TextBlock Text=""" & TagText & """ Foreground=""#868686"" FontSize=""11"" />
  70. </Border>")
  71. PanTags.Children.Add(NewTag)
  72. Next
  73. End Set
  74. End Property
  75. #End Region
  76. #Region "点击"
  77. '触发点击事件
  78. Public Event Click(sender As Object, e As MouseButtonEventArgs)
  79. Private Sub Button_MouseUp(sender As Object, e As MouseButtonEventArgs) Handles Me.PreviewMouseLeftButtonUp
  80. If IsMouseDown Then
  81. RaiseEvent Click(sender, e)
  82. If e.Handled Then Exit Sub
  83. Log("[Control] 按下资源工程列表项:" & LabTitle.Text)
  84. End If
  85. End Sub
  86. Private Sub ProjectClick(sender As MyCompItem, e As EventArgs) Handles Me.Click
  87. '记录当前展开的卡片标题(#2712)
  88. Dim Titles As New List(Of String)
  89. If FrmMain.PageCurrent.Page = FormMain.PageType.CompDetail Then
  90. For Each Card As MyCard In FrmDownloadCompDetail.PanResults.Children
  91. If Card.Title <> "" AndAlso Not Card.IsSwaped Then Titles.Add(Card.Title)
  92. Next
  93. Log("[Comp] 记录当前已展开的卡片:" & String.Join("、", Titles))
  94. FrmMain.PageCurrent.Additional(1) = Titles
  95. End If
  96. '打开详情页
  97. Dim TargetVersion As String
  98. Dim TargetLoader As CompModLoaderType
  99. If FrmMain.PageCurrent.Page = FormMain.PageType.CompDetail Then
  100. TargetVersion = FrmMain.PageCurrent.Additional(2)
  101. TargetLoader = FrmMain.PageCurrent.Additional(3)
  102. Else
  103. Select Case CType(sender.Tag, CompProject).Type
  104. Case CompType.Mod
  105. TargetVersion = If(PageDownloadMod.Loader.Input.GameVersion, "")
  106. TargetLoader = PageDownloadMod.Loader.Input.ModLoader
  107. Case CompType.ModPack
  108. TargetVersion = If(PageDownloadPack.Loader.Input.GameVersion, "")
  109. Case Else 'CompType.ResourcePack
  110. 'FUTURE: Res
  111. TargetVersion = "" 'If(PageDownloadResource.Loader.Input.GameVersion, "")
  112. End Select
  113. End If
  114. If CType(sender.Tag, CompProject).Type <> CompType.Mod Then TargetLoader = CompModLoaderType.Any
  115. FrmMain.PageChange(New FormMain.PageStackData With {.Page = FormMain.PageType.CompDetail,
  116. .Additional = {sender.Tag, New List(Of String), TargetVersion, TargetLoader}})
  117. End Sub
  118. '鼠标点击判定
  119. Private IsMouseDown As Boolean = False
  120. Private Sub Button_MouseDown(sender As Object, e As MouseButtonEventArgs) Handles Me.PreviewMouseLeftButtonDown
  121. If IsMouseOver AndAlso CanInteraction Then IsMouseDown = True
  122. End Sub
  123. Private Sub Button_MouseLeave(sender As Object, e As Object) Handles Me.MouseLeave, Me.PreviewMouseLeftButtonUp
  124. IsMouseDown = False
  125. End Sub
  126. #End Region
  127. #Region "后加载指向背景"
  128. Private _RectBack As Border = Nothing
  129. Public ReadOnly Property RectBack As Border
  130. Get
  131. If _RectBack Is Nothing Then
  132. Dim Rect As New Border With {
  133. .Name = "RectBack",
  134. .CornerRadius = New CornerRadius(3),
  135. .RenderTransform = New ScaleTransform(0.8, 0.8),
  136. .RenderTransformOrigin = New Point(0.5, 0.5),
  137. .BorderThickness = New Thickness(GetWPFSize(1)),
  138. .SnapsToDevicePixels = True,
  139. .IsHitTestVisible = False,
  140. .Opacity = 0
  141. }
  142. Rect.SetResourceReference(Border.BackgroundProperty, "ColorBrush7")
  143. Rect.SetResourceReference(Border.BorderBrushProperty, "ColorBrush6")
  144. SetColumnSpan(Rect, 999)
  145. SetRowSpan(Rect, 999)
  146. Children.Insert(0, Rect)
  147. _RectBack = Rect
  148. '<!--<Border x:Name = "RectBack" CornerRadius="3" RenderTransformOrigin="0.5,0.5" SnapsToDevicePixels="True"
  149. 'IsHitTestVisible = "False" Opacity="0" BorderThickness="1"
  150. 'Grid.ColumnSpan = "4" Background="{DynamicResource ColorBrush7}" BorderBrush="{DynamicResource ColorBrush6}"/>-->
  151. End If
  152. Return _RectBack
  153. End Get
  154. End Property
  155. #End Region
  156. Private StateLast As String
  157. ''' <summary>
  158. ''' 是否允许交互。目前仅用于 PageDownloadCompDetail 的顶部栏展示:若关闭碰撞检测,则无法展开 Tooltip。
  159. ''' </summary>
  160. Public CanInteraction As Boolean = True
  161. Public Sub RefreshColor(sender As Object, e As EventArgs) Handles Me.MouseEnter, Me.MouseLeave, Me.MouseLeftButtonDown, Me.MouseLeftButtonUp
  162. If Not CanInteraction Then Exit Sub
  163. '判断当前颜色
  164. Dim StateNew As String, Time As Integer
  165. If IsMouseOver Then
  166. If IsMouseDown Then
  167. StateNew = "MouseDown"
  168. Time = 120
  169. Else
  170. StateNew = "MouseOver"
  171. Time = 120
  172. End If
  173. Else
  174. StateNew = "Idle"
  175. Time = 180
  176. End If
  177. If StateLast = StateNew Then Exit Sub
  178. StateLast = StateNew
  179. '触发颜色动画
  180. If IsLoaded AndAlso AniControlEnabled = 0 Then '防止默认属性变更触发动画
  181. '有动画
  182. Dim Ani As New List(Of AniData)
  183. If IsMouseOver Then
  184. Ani.AddRange({
  185. AaColor(RectBack, Border.BackgroundProperty, If(IsMouseDown, "ColorBrush6", "ColorBrushBg1"), Time),
  186. AaOpacity(RectBack, 1 - RectBack.Opacity, Time,, New AniEaseOutFluent)
  187. })
  188. If IsMouseDown Then
  189. Ani.Add(AaScaleTransform(RectBack, 0.996 - CType(RectBack.RenderTransform, ScaleTransform).ScaleX, Time * 1.2,, New AniEaseOutFluent))
  190. Else
  191. Ani.Add(AaScaleTransform(RectBack, 1 - CType(RectBack.RenderTransform, ScaleTransform).ScaleX, Time * 1.2,, New AniEaseOutFluent))
  192. End If
  193. Else
  194. Ani.AddRange({
  195. AaOpacity(RectBack, -RectBack.Opacity, Time),
  196. AaColor(RectBack, Border.BackgroundProperty, If(IsMouseDown, "ColorBrush6", "ColorBrush7"), Time),
  197. AaScaleTransform(RectBack, 0.996 - CType(RectBack.RenderTransform, ScaleTransform).ScaleX, Time,, New AniEaseOutFluent),
  198. AaScaleTransform(RectBack, -0.196, 1,,, True)
  199. })
  200. End If
  201. AniStart(Ani, "CompItem Color " & Uuid)
  202. Else
  203. '无动画
  204. AniStop("CompItem Color " & Uuid)
  205. If _RectBack IsNot Nothing Then RectBack.Opacity = 0
  206. End If
  207. End Sub
  208. End Class