SettingService.vb 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. Public Class SettingService
  2. #Region "属性"
  3. ''' <summary>
  4. ''' 指定该控件所对应的设置项。
  5. ''' </summary>
  6. Public Shared Function GetKey(obj As DependencyObject) As String
  7. If obj Is Nothing Then Return Nothing
  8. Return obj.GetValue(KeyProperty)
  9. End Function
  10. Public Shared Sub SetKey(obj As DependencyObject, value As String)
  11. obj.SetValue(KeyProperty, value)
  12. End Sub
  13. Public Shared ReadOnly KeyProperty As DependencyProperty =
  14. DependencyProperty.RegisterAttached("Key", GetType(String), GetType(SettingService), New PropertyMetadata(Nothing))
  15. ''' <summary>
  16. ''' 指定该控件所对应的设置值。
  17. ''' </summary>
  18. Public Shared Function GetValue(obj As DependencyObject) As String
  19. If obj Is Nothing Then Return Nothing
  20. Return obj.GetValue(ValueProperty)
  21. End Function
  22. Public Shared Sub SetValue(obj As DependencyObject, value As String)
  23. obj.SetValue(ValueProperty, value)
  24. End Sub
  25. Public Shared ReadOnly ValueProperty As DependencyProperty =
  26. DependencyProperty.RegisterAttached("Value", GetType(String), GetType(SettingService), New PropertyMetadata(Nothing))
  27. #End Region
  28. ''' <summary>
  29. ''' 重置该控件以及它所有的子控件的设置值。
  30. ''' </summary>
  31. Public Shared Sub ResetSettings(Target As DependencyObject)
  32. LogicalTreeHelper.GetChildren(Target).OfType(Of DependencyObject)().ForAll(Sub(c) ResetSettings(c)) '处理子控件
  33. Dim Key = GetKey(Target)
  34. If Key Is Nothing Then Return
  35. Settings.Reset(Key, Instance:=PageInstanceLeft.Instance)
  36. End Sub
  37. ''' <summary>
  38. ''' 更新该控件以及它所有的子控件当前显示的设置值。
  39. ''' </summary>
  40. Public Shared Sub RefreshSettings(Target As DependencyObject)
  41. LogicalTreeHelper.GetChildren(Target).OfType(Of DependencyObject)().ForAll(Sub(c) RefreshSettings(c)) '处理子控件
  42. Dim Key = GetKey(Target)
  43. If Key Is Nothing Then Return
  44. Dim NewValue = Settings.Get(Key, Instance:=PageInstanceLeft.Instance)
  45. If TypeOf Target Is ISettingControl Then DirectCast(Target, ISettingControl).RefreshSetting(NewValue)
  46. End Sub
  47. ''' <summary>
  48. ''' 当控件对应的设置改变时,将内容保存到设置中。
  49. ''' </summary>
  50. Public Shared Sub SaveSetting(sender As Object)
  51. If AniControlEnabled <> 0 Then Return
  52. If TypeOf sender IsNot ISettingControl Then Return
  53. Dim Key = GetKey(sender)
  54. If Key Is Nothing Then Return
  55. Dim NewValue As String = DirectCast(sender, ISettingControl).GetCurrentSetting()
  56. If NewValue Is Nothing Then Return
  57. Settings.Set(Key, NewValue, Instance:=PageInstanceLeft.Instance)
  58. End Sub
  59. End Class
  60. Public Interface ISettingControl
  61. ''' <summary>
  62. ''' 更新该控件当前所显示的设置值。
  63. ''' </summary>
  64. Sub RefreshSetting(NewValue As String)
  65. ''' <summary>
  66. ''' 获取该控件当前设定的设置值。
  67. ''' 若不应当关联该设置值,则返回 Nothing。
  68. ''' </summary>
  69. Function GetCurrentSetting() As String
  70. End Interface