将Class类型作为参数传递

时间:2020-10-30 01:31:21

标签: wpf vb.net class parameters telerik

我正在将Telerik控件UI用于WPF,并且它们具有StyleManager.ApplicationTheme。每个“主题”都是一个类Telerik.Windows.Controls.CrystalTheme,每个主题都有一个“调色板” Telerik.Windows.Controls.CrystalPalettepublic 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类)。

建议?

2 个答案:

答案 0 :(得分:1)

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

答案 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