MyCompItem.xaml.vb 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  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 CompType.DataPack
  110. TargetVersion = If(PageDownloadDataPack.Loader.Input.GameVersion, "")
  111. Case CompType.Shader
  112. TargetVersion = If(PageDownloadShader.Loader.Input.GameVersion, "")
  113. Case Else 'CompType.ResourcePack
  114. TargetVersion = If(PageDownloadResourcePack.Loader.Input.GameVersion, "")
  115. End Select
  116. End If
  117. If CType(sender.Tag, CompProject).Type <> CompType.Mod Then TargetLoader = CompModLoaderType.Any
  118. FrmMain.PageChange(New FormMain.PageStackData With {.Page = FormMain.PageType.CompDetail,
  119. .Additional = {sender.Tag, New List(Of String), TargetVersion, TargetLoader}})
  120. End Sub
  121. '鼠标点击判定
  122. Private IsMouseDown As Boolean = False
  123. Private Sub Button_MouseDown(sender As Object, e As MouseButtonEventArgs) Handles Me.PreviewMouseLeftButtonDown
  124. If IsMouseOver AndAlso CanInteraction Then IsMouseDown = True
  125. End Sub
  126. Private Sub Button_MouseLeave(sender As Object, e As Object) Handles Me.MouseLeave, Me.PreviewMouseLeftButtonUp
  127. IsMouseDown = False
  128. End Sub
  129. #End Region
  130. #Region "后加载指向背景"
  131. Private _RectBack As Border = Nothing
  132. Public ReadOnly Property RectBack As Border
  133. Get
  134. If _RectBack Is Nothing Then
  135. Dim Rect As New Border With {
  136. .Name = "RectBack",
  137. .CornerRadius = New CornerRadius(3),
  138. .RenderTransform = New ScaleTransform(0.8, 0.8),
  139. .RenderTransformOrigin = New Point(0.5, 0.5),
  140. .BorderThickness = New Thickness(GetWPFSize(1)),
  141. .SnapsToDevicePixels = True,
  142. .IsHitTestVisible = False,
  143. .Opacity = 0
  144. }
  145. Rect.SetResourceReference(Border.BackgroundProperty, "ColorBrush7")
  146. Rect.SetResourceReference(Border.BorderBrushProperty, "ColorBrush6")
  147. SetColumnSpan(Rect, 999)
  148. SetRowSpan(Rect, 999)
  149. Children.Insert(0, Rect)
  150. _RectBack = Rect
  151. '<!--<Border x:Name = "RectBack" CornerRadius="3" RenderTransformOrigin="0.5,0.5" SnapsToDevicePixels="True"
  152. 'IsHitTestVisible = "False" Opacity="0" BorderThickness="1"
  153. 'Grid.ColumnSpan = "4" Background="{DynamicResource ColorBrush7}" BorderBrush="{DynamicResource ColorBrush6}"/>-->
  154. End If
  155. Return _RectBack
  156. End Get
  157. End Property
  158. #End Region
  159. Private StateLast As String
  160. ''' <summary>
  161. ''' 是否允许交互。目前仅用于 PageDownloadCompDetail 的顶部栏展示:若关闭碰撞检测,则无法展开 Tooltip。
  162. ''' </summary>
  163. Public Property CanInteraction As Boolean = True
  164. Public Sub RefreshColor(sender As Object, e As EventArgs) Handles Me.MouseEnter, Me.MouseLeave, Me.MouseLeftButtonDown, Me.MouseLeftButtonUp
  165. If Not CanInteraction Then Exit Sub
  166. '判断当前颜色
  167. Dim StateNew As String, Time As Integer
  168. If IsMouseOver Then
  169. If IsMouseDown Then
  170. StateNew = "MouseDown"
  171. Time = 120
  172. Else
  173. StateNew = "MouseOver"
  174. Time = 120
  175. End If
  176. Else
  177. StateNew = "Idle"
  178. Time = 180
  179. End If
  180. If StateLast = StateNew Then Exit Sub
  181. StateLast = StateNew
  182. '触发颜色动画
  183. If IsLoaded AndAlso AniControlEnabled = 0 Then '防止默认属性变更触发动画
  184. '有动画
  185. Dim Ani As New List(Of AniData)
  186. If IsMouseOver Then
  187. Ani.AddRange({
  188. AaColor(RectBack, Border.BackgroundProperty, If(IsMouseDown, "ColorBrush6", "ColorBrushBg1"), Time),
  189. AaOpacity(RectBack, 1 - RectBack.Opacity, Time,, New AniEaseOutFluent)
  190. })
  191. If IsMouseDown Then
  192. Ani.Add(AaScaleTransform(RectBack, 0.996 - CType(RectBack.RenderTransform, ScaleTransform).ScaleX, Time * 1.2,, New AniEaseOutFluent))
  193. Else
  194. Ani.Add(AaScaleTransform(RectBack, 1 - CType(RectBack.RenderTransform, ScaleTransform).ScaleX, Time * 1.2,, New AniEaseOutFluent))
  195. End If
  196. Else
  197. Ani.AddRange({
  198. AaOpacity(RectBack, -RectBack.Opacity, Time),
  199. AaColor(RectBack, Border.BackgroundProperty, If(IsMouseDown, "ColorBrush6", "ColorBrush7"), Time),
  200. AaScaleTransform(RectBack, 0.996 - CType(RectBack.RenderTransform, ScaleTransform).ScaleX, Time,, New AniEaseOutFluent),
  201. AaScaleTransform(RectBack, -0.196, 1,,, True)
  202. })
  203. End If
  204. AniStart(Ani, "CompItem Color " & Uuid)
  205. Else
  206. '无动画
  207. AniStop("CompItem Color " & Uuid)
  208. If _RectBack IsNot Nothing Then RectBack.Opacity = 0
  209. End If
  210. End Sub
  211. End Class