Je travaille sur une bibliothèque de contrôle personnalisée pour les périphériques intelligents WM6 (.net cf 3.5). J'ai créé un contrôle personnalisé nommé GradientPanel, devinez ce qu'il fait. Une classe appelée GradientColor décrit comment l'arrière-plan doit être rendu. J'ai déjà créé un typeconverter personnalisé afin que la propriété GradientColor d'une instance GradientPanel puisse être développée dans la grille de propriétés Visual Studio. Ça fonctionne bien. J'ai également créé un éditeur personnalisé, dérivé de UITypeEditor. Je n'en veux pas trop, juste pour donner une idée visuelle de l'apparence du dégradé. Voici le code:Comment faire fonctionner un éditeur personnalisé CF
Imports System.Drawing
Imports System.Drawing.Drawing2D
Namespace Drawing.Design
Public Class GradientColorEditor
Inherits System.Drawing.Design.UITypeEditor
Public Overrides Function GetEditStyle(ByVal context As System.ComponentModel.ITypeDescriptorContext) As System.Drawing.Design.UITypeEditorEditStyle
Return System.Drawing.Design.UITypeEditorEditStyle.None
End Function
Public Overrides Function GetPaintValueSupported(ByVal context As System.ComponentModel.ITypeDescriptorContext) As Boolean
Return True
End Function
Public Overrides Sub PaintValue(ByVal e As System.Drawing.Design.PaintValueEventArgs)
e.Graphics.Clear(Color.White)
Dim value = e.Value
Dim valType As Type = value.GetType()
Dim startColorInfo As System.Reflection.PropertyInfo = valType.GetProperty("StartColor")
Dim startColor As System.Drawing.Color = startColorInfo.GetValue(value, Nothing)
Dim endColorInfo As System.Reflection.PropertyInfo = valType.GetProperty("EndColor")
Dim endColor As System.Drawing.Color = endColorInfo.GetValue(value, Nothing)
Dim fillDirectionInfo As System.Reflection.PropertyInfo = valType.GetProperty("FillDirection")
Dim fillDirType As Type = fillDirectionInfo.PropertyType
Dim fillDirNames() As String = [Enum].GetNames(fillDirType)
Dim fillDirValues() As Integer = [Enum].GetValues(fillDirType)
Dim fillDirValNameDict As New System.Collections.Generic.Dictionary(Of Integer, String)()
For cnt As Integer = 0 To fillDirValues.Length - 1
fillDirValNameDict.Add(fillDirValues(cnt), fillDirNames(cnt))
Next
Dim fillDir As Integer = fillDirectionInfo.GetValue(value, Nothing)
If startColor = System.Drawing.Color.Transparent OrElse endColor = System.Drawing.Color.Transparent Then
Exit Sub
End If
Dim brush As New LinearGradientBrush(e.Bounds, startColor, endColor, _
If(fillDir = 0, LinearGradientMode.Horizontal, LinearGradientMode.Vertical))
e.Graphics.FillRectangle(brush, e.Bounds)
End Sub
End Class
End Namespace
Il ne compile et la partie de la réflexion est le même qui est utilisé (et travaille) dans le TypeConverter personnalisé. Cependant, je ne peux tout simplement pas utiliser Visual Studio pour utiliser cet éditeur, et cela me rend vraiment fou. Voici la partie pertinente du fichier XMTA:
<Class Name="Tgz.Controls.GradientPanel">
<DesktopCompatible>true</DesktopCompatible>
<Property Name="GradientColor">
<TypeConverter>
Tgz.Drawing.Design.GradientColorConverter, Tgz.Drawing.Design,
Version=0.1.0.0, Culture=neutral, PublicKeyToken=3f315c03f85ce5c1
</TypeConverter>
<Browsable>true</Browsable>
<Category>Appearance</Category>
<Description>Defines the gradient background of the control.</Description>
<EditorBrowsable>true</EditorBrowsable>
<Editor>
<Type>
Tgz.Drawing.Design.GradientColorEditor, Tgz.Drawing.Design,
Version=0.1.0.0, Culture=neutral, PublicKeyToken=3f315c03f85ce5c1
</Type>
<BaseType>
System.Drawing.Design.UITypeEditor, System.Drawing.Design,
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
</BaseType>
</Editor>
</Property>
</Class>
Alors, comment venir Visual Studio prend la < TypeConverter tag > en compte, mais ne se soucie pas de l'< Tag Editor >? Ou est-ce que je manque quelque chose?
S'il vous plaît, aidez.
Merci, TGZ