MyResourceItem.xaml.vb 9.1 KB

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