我使用的是WPF的Telerik控件UI,它们有一个StyleManager.ApplicationTheme
。每个";主题";是类CCD_ 2,并且每个主题具有"0";调色板";Telerik.Windows.Controls.CrystalPalette
(public NotInheritable Class
(。。。示例:
Telerik.Windows.Controls.CrystalPalette
Telerik.Windows.Controls.GreenPalette
Telerik.Windows.Controls.MaterialPalette
' ... etc. (about 19 of them)
' All valid assignments
CrystalPalette.Palette.FontSizeXS = 8
MaterialPalette.Palette.FontSizeL = 14
我正在尝试设置一个Sub
,它将基于ThemePalette
设置FontSizes
。。。示例:
Public Function DoSomething() As Boolean
' ...
ApplyThemeFontSizes(CrystalPalette)
' ...
End Function
Private Sub ApplyThemeFontSizes(Of T)()
Try
T.Palette.FontSizeXS = 8
T.Palette.FontSizeS = 10
T.Palette.FontSize = 12
T.Palette.FontSizeL = 14
T.Palette.FontSizeXL = 16
Catch ex As Exception
' TODO: Log error to file (possible the Theme doesn't have a "Palette")
End Try
End Sub
这段代码不起作用,我正在努力回忆如何在不使用反射的情况下实现这一点。我无法控制Telerik课程。
我已经搜索过类似的内容,但结果并不是我想要达到的(即我无法控制Telerik课程(。
建议?
ThemePalette
类型是所有具体调色板(如CrystalPalette
、Office2016Palette
等(的基本类型。此类型是抽象的,不提供任何颜色或字体大小的属性,因为它们是任何主题的特定属性,这意味着您无法创建在所有主题上设置FontSizeXS
属性的通用过程。此属性甚至不存在于许多主题中,如Office2016。
为应用程序中使用的每个主题选项板创建一个过程,并传入具体实例。
Private Sub ApplyThemeFontSizes(ByVal palette As CrystalPalette)
palette.FontSizeXS = 8
' ...set other theme specific properties.
End Sub
选项板是单线的,但可以使用Palette
属性获取它们的实例。
Public Function DoSomething() As Boolean
' ...
ApplyThemeFontSizes(CrystalPalette.Palette)
' ...
End Function
我最终使用了反射,这是最后的手段,因为反射太慢了。。。幸运的是,调用实例通常在启动时和用户更改主题时出现一次。
ApplyThemeFontSizes(Office2019Palette.Palette)
Private Sub ApplyThemeFontSizes(ByVal palette As ThemePalette)
Try
TrySetPaletteProperty(palette, "FontSizeXS", 10 + Me.FontOffset)
TrySetPaletteProperty(palette, "FontSizeS", 12 + Me.FontOffset)
TrySetPaletteProperty(palette, "FontSize", 14 + Me.FontOffset)
TrySetPaletteProperty(palette, "FontSizeL", 16 + Me.FontOffset)
TrySetPaletteProperty(palette, "FontSizeXL", 18 + Me.FontOffset)
Catch ex As Exception
' TODO: Log error to file
End Try
End Sub
Private Sub TrySetPaletteProperty(ByVal palette As ThemePalette, ByVal propertyName As String, ByVal newValue As Object)
Try
' Set FontSize property values
Dim propertyInfo = palette.[GetType]().GetProperty(propertyName)
If propertyInfo IsNot Nothing Then
propertyInfo.SetValue(palette, newValue)
End If
Catch ex As Exception
' TODO: Log error to file
End Try
End Sub