2016-10-30 5 views
2

Si je crée une classe et fais dériver d'un ListView comme ça ...Pourquoi l'événement OnDrawItem d'un ListView n'affecte-t-il pas l'environnement au moment du design?

class MyListView : ListView 
{ 
    public MyListView() : base() 
    { 
     DoubleBuffered = true; 
     OwnerDraw = true; 
     Cursor = Cursors.Hand; 
     Scrollable = false; 
    } 

    protected override void OnDrawItem(DrawListViewItemEventArgs e) 
    { 
     //base.OnDrawItem(e); 
    } 
} 

Puis-je ouvrir la vue de la conception de ma forme Windows et ajouter un nouvel objet MyListView puis ajoutez un seul élément et le lier à une liste d'images. Je peux voir qu'il y a un élément dans l'objet mylistview. Il n'a aucun effet sur l'objet que j'ai sur mon formulaire appelé lv de type MyListView. Lorsque je lance mon application, je vois exactement ce à quoi je m'attendais et il n'y a aucun élément listé.

Pourquoi cela affecterait-il le temps d'exécution et non la conception?

enter image description here

+0

Umm ... OK, bien, je colle ce code dans un nouveau fichier de classe, puis ouvrez mon formulaire et cliquez sur la boîte à outils et faites-le glisser sur le formulaire. Je sélectionne le nouvel objet sur le formulaire et change 'LargeImageList' pour ma liste d'images et édite les éléments pour inclure un élément avec une image de la liste d'images et utilise le' View' par défaut de 'LargeIcon'. Il montre l'objet très bien au moment de la conception, mais exécutez-le et il n'y a rien affiché ... Comment vous le faites fonctionner est incroyable pour moi. –

+0

Le fait de ne pas définir la propriété View est une grosse erreur, cela compte beaucoup lorsque vous dessinez. À l'heure actuelle, vous ne voyez que l'étiquette, ce n'est pas personnalisé.Deviner: n'utilisez pas l'événement Load pour changer les propriétés, c'est * gauche *. –

+0

J'ai également testé avec ce code: 'this.View = System.Windows.Forms.View.Details; this.OwnerDraw = true; this.Columns.Add ("X"); this.Items.Add ("1"); this.Items.Add ("2"); 'Mais rien n'a changé. –

Répondre

0

La réponse

ListViewDesigner ombres OwnerDraw propriété comme Visible ou Enabled propriété de contrôle. Cela fonctionne donc au moment de l'exécution et le fait de le modifier n'affecte pas le temps de conception.

Side Note

Si vous jetez un oeil à code source de ListViewDesigner, vous verrez cette propriété:

private bool OwnerDraw 
{ 
    get { return (bool) base.ShadowProperties["OwnerDraw"]; } 
    set { base.ShadowProperties["OwnerDraw"] = value; } 
} 

Et PreFilterProperties vous verrez le concepteur a remplacé la propriété originale avec cette un:

PropertyDescriptor oldPropertyDescriptor = (PropertyDescriptor) properties["OwnerDraw"]; 
if (oldPropertyDescriptor != null) 
{ 
    properties["OwnerDraw"] = TypeDescriptor.CreateProperty(typeof(ListViewDesigner), 
     oldPropertyDescriptor, new Attribute[0]); 
} 

il n'a pas d'importance ce que View vous utilisez, il effectue la peinture par défaut indépendamment de ce que vous avez dans OnDrawItem. C'est parce qu'il n'utilise pas la propriété OwnerDraw au moment de la conception. Le concepteur l'ombre. C'est le même comportement que vous voyez pour la propriété Enabled ou Visible.

Solution pour permettre owner-draw lors de l'exécution

Pour contourner ce problème, vous pouvez enregistrer un Designer différent pour votre contrôle dérivé. De cette façon, la propriété OwnerDraw fonctionnera comme une propriété normale:

[Designer(typeof(ControlDesigner))] 
public class MyListView : ListView 

Attention: Gardez à l'esprit, en enregistrant un nouveau concepteur pour le contrôle, vous perdrez les ListViewDesigner liées à des fonctionnalités comme ses verbes de concepteur ou son smart balise (liste d'actions) ou options de dimensionnement de colonne. Si vous avez besoin de ces fonctionnalités, vous pouvez implémenter ces fonctionnalités dans un concepteur personnalisé en examinant le code source ListViewDesigner.

+0

Est-il possible de montrer ces changements au moment du design d'une manière différente? –

+0

Quels sont les changements? Et comment par exemple? –

+0

J'ai ajouté quelques codes de 'ListViewDesigner' qui, je crois, décrit la raison. –