2010-11-01 11 views
4

J'ai un UITypeEditor personnalisé qui est utilisé pour la sélection de couleur avec mon programme en utilisant la propriété propertygrid, mais je n'arrive pas à l'activer si je viens d'exposer system.drawing .Couleur. J'ai besoin d'envelopper la couleur avec un CustomType avant qu'il appelle mon UITypeEditor. La propriété TheColour fonctionne. Le Couleur ne fait pas. Lorsque j'ouvre le propertyGrid, je vois que GetEditStyle est appelée via les deux méthodes, mais quand il s'agit de EditValue, elle est appelée uniquement lorsque vous sélectionnez TheColour dans la grille de propriétés. La liste déroulante Couleur normale s'affiche lorsque vous sélectionnez la propriété CouleurComment forcer l'utilisation de UITypeEditor personnalisé pour les types de système

Que manque-t-il?

<CategoryAttribute("Order Colour"), _ 
Browsable(True), _ 
DisplayName("The Colour"), _ 
Description("The background colour for orders from this terminal"), _ 
EditorAttribute(GetType(IKMDependency.ColourSelectorEditor), _ 
GetType(System.Drawing.Design.UITypeEditor))> _ 
Public Property TheColour() As MyColour 
    Get 
     Return mMyColor 
    End Get 
    Set(ByVal value As MyColour) 
     If value.Colour <> mMyColor.Colour Then 
      mColor = value.Colour 
      mMyColor = value 
      mIsDirty = True 
     End If 
    End Set 
End Property 

<CategoryAttribute("Order Colour"), _ 
Browsable(True), _ 
DisplayName("Colour"), _ 
Description("The background colour for orders from this terminal"), _ 
EditorAttribute(GetType(IKMDependency.ColourSelectorEditor), _ 
GetType(System.Drawing.Design.UITypeEditor))> _ 
Public Property Colour() As Color 
    Get 
     Return mColor 
    End Get 
    Set(ByVal value As Color) 
     If mColor <> value Then 
      mColor = value 
      mMyColor = New MyColour(mColor) 
      mIsDirty = True 
     End If 
    End Set 
End Property 
+0

Trouvé - voir modifier à ma réponse. –

Répondre

5

Le problème est qu'il est à remarquer que la TypeConverter associée soutient les valeurs énumérées. Nous devons désactiver cela; noter que nous pouvons aussi hériter des implémentations par défaut pour obtenir des choses comme la peinture à l'aperçu des couleurs (exemples en C#, mais devrait être facile à traduire):

class MyColorEditor : ColorEditor { 
    public override UITypeEditorEditStyle GetEditStyle(
     ITypeDescriptorContext context) { 
     return UITypeEditorEditStyle.Modal; 
    } 
    public override object EditValue(
     ITypeDescriptorContext context, IServiceProvider provider, object value) { 
     MessageBox.Show(
       "We could show an editor here, but you meant Green, right?"); 
     return Color.Green; 
    } 
} 
class MyColorConverter : ColorConverter { // reference: System.Drawing.Design.dll 
    public override bool GetStandardValuesSupported(
      ITypeDescriptorContext context) { 
     return false; 
    } 
} 
class TestObject 
{ 
    [Category("Order Colour"), Browsable(true), DisplayName("Colour")] 
    [Description("The background colour for orders from this terminal")] 
    [Editor(typeof(MyColorEditor), typeof(UITypeEditor))] 
    [TypeConverter(typeof(MyColorConverter))] 
    public Color Colour {get;set;} 
} 

Si vous voulez que cela s'applique à tousColor propriétés, il ya aussi un moyen de le faire de telle sorte que vous n'avez pas besoin de décorer toutes les propriétés; quelque part pendant le code d'initialisation de votre application, exécutez:

TypeDescriptor.AddAttributes(typeof(Color), 
    new EditorAttribute(typeof(MyColorEditor), typeof(UITypeEditor)), 
    new TypeConverterAttribute(typeof(MyColorConverter))); 
+0

hehe J'ai obtenu la solution alors que vous avez dû poster votre mise à jour, je l'ai seulement vu mettre à jour une fois que j'ai posté mon addenda. Dommage qu'il n'y ait pas moyen de demander à la grille de peindre la cellule entière plutôt que la petite boîte de prévisualisation. –

+0

Merci pour la pointe d'utiliser TypeDescriptor.AddAttributes, nouveau pour moi. – wangzq

+0

Pouvez-vous me dire comment vous avez découvert qu'il y avait un 'TypeConverter' associé? J'essaie de le faire pour 'Dictionary ' et j'aimerais savoir comment parcourir les convertisseurs chargés et quel (s) éditeur (s) sont enregistrés pour un type dit dans linqpad par exemple. – Maslow

0

Je pense avoir trouvé une solution à ce problème.

Je devais implémenter un TypeConverter pour forcer le GetStandardValuesSupported à retourner false.

Je peux ensuite supprimer la propriété TheColour et l'utiliser.

<CategoryAttribute("Order Colour"), _ 
Browsable(True), _ 
DisplayName("Custom Colour to Use"), _ 
Description("The background colour for orders from this terminal"), _ 
EditorAttribute(GetType(IKMDependency.ColourSelectorEditor), GetType(System.Drawing.Design.UITypeEditor)), _ 
TypeConverter(GetType(ColourTypeConverter))> _ 
Public Property Colour() As Color 
    Get 
     Return mColor 
    End Get 
    Set(ByVal value As Color) 
     If mColor <> value Then 
      mColor = value 
      mIsDirty = True 
     End If 
    End Set 
End Property 

c'est un peu moche parce que la couleur est représentée dans la boîte comme la couleur sélectionnée, mais le texte est imprimé dans le reste du PropertyGridCell donc j'ai aussi ajouté quelques remplacements au convertisseur de revenir simplement des chaînes vides. (J'aurais préféré peindre toute la cellule plutôt que la petite boîte).

La classe Converter.

Public Class ColourTypeConverter 
    Inherits TypeConverter 

    Public Overrides Function GetStandardValuesSupported(ByVal context As System.ComponentModel.ITypeDescriptorContext) As Boolean 
     Return False 
    End Function 

    Public Overrides Function CanConvertFrom(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal sourceType As System.Type) As Boolean 
     If sourceType Is GetType(String) Then Return False 
     Return MyBase.CanConvertFrom(context, sourceType) 
    End Function 

    Public Overrides Function ConvertTo(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal culture As System.Globalization.CultureInfo, ByVal value As Object, ByVal destinationType As System.Type) As Object 
     If destinationType Is GetType(String) Then Return String.Empty 
     Return MyBase.ConvertTo(context, culture, value, destinationType) 
    End Function 

    Public Overrides Function ConvertFrom(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal culture As System.Globalization.CultureInfo, ByVal value As Object) As Object 
     Return MyBase.ConvertFrom(context, culture, value) 
    End Function 

    Public Overrides Function CanConvertTo(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal destinationType As System.Type) As Boolean 
     If destinationType Is GetType(String) Then Return False 
     Return MyBase.CanConvertTo(context, destinationType) 
    End Function 
End Class 
+0

Si vous héritez de 'ColorConverter' Au lieu de 'TypeConverter', vous obtiendrez une implémentation beaucoup plus complète. –