MyCompItem.xaml.vb 9.5 KB

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