MyResourceItem.xaml.vb 9.7 KB

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