我正在将Telerik控件UI用于WPF,并且它们具有StyleManager.ApplicationTheme
。每个“主题”都是一个类Telerik.Windows.Controls.CrystalTheme
,每个主题都有一个“调色板” 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
,它将根据FontSizes
来设置ThemePalette
……示例:
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
该代码无法正常工作,我正试图在不使用Reflection的情况下如何使这项工作记忆犹新。我对Telerik类没有任何控制。
我搜索了类似的内容,但结果并不是我想要达到的目的(即,我无法控制Telerik类)。
建议?
答案 0 :(得分:1)
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
答案 1 :(得分:0)
我最终使用了Reflection,因为Reflection太慢了,所以这是最后的选择。幸运的是,调用实例通常是在启动时以及用户更改主题时一次。
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