传递 Class 类型作为参数

Passing Class type as parameter

我正在为 WPF 使用 Telerik 控件 UI,它们有一个 StyleManager.ApplicationTheme。每个“主题”都是一个 class 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,它将根据 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 classes.

我搜索过类似的,但结果不是我想要达到的结果(即我无法控制 Telerik classes)。

建议?

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

我最终使用了 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