将Class类型作为参数传递



我使用的是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类型是所有具体调色板(如CrystalPaletteOffice2016Palette等(的基本类型。此类型是抽象的,不提供任何颜色或字体大小的属性,因为它们是任何主题的特定属性,这意味着您无法创建在所有主题上设置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

相关内容

最新更新