2010-10-29 3 views
1

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

Répondre

1

Ma mauvaise, la classe System.Drawing.Design.UITypeEditor est pas dans le System.Drawing.Design, mais l'ensemble de System.Drawing, ressemble à c'est pourquoi il n'a pas trouvé ma éditeur. Eh bien, en fait, il l'a trouvé, mais il n'a pas trouvé la classe de base.

Je l'ai testé bien, et il ressemble à la ligne

e.Graphics.Clear(Color.White) 

qui est la première ligne de la procédure PaintValue (...) n'est pas nécessaire. En fait, il efface toutes les lignes précédentes dans la grille des propriétés, il devrait donc être évité.

0

Comment avez-vous hérité de System.ComponentModel.TypeConverter? Le TypeConverter mentionné est juste une classe vide. La classe System.Drawing.Design.UITypeEditor n'est également pas disponible sur le framework compact.

Comment avez-vous fait?

Questions connexes