head.WriteLine()

Samstag, April 08, 2006

Komponenten mit Smart Tags veredeln, Teil 2

Wie Sie Ihre eigenen Controls mit Smart Tags ausstatten können, haben ich hier bereits erklärt. Heute möchte ich Ihnen zeigen, wie Sie das gleiche erreichen können, ohne eine eigene Designer-Klasse erstellen zu müssen.

Normalerweise wird die Komponente über das Designer-Attribute mit einem Designer verbunden, der über die ActionLists-Eigenschaft die Smart Tag Action List bereitstellt. Mit Hilfe des DesignerActionSerivce können Sie sich diesen Zusatzaufwand jedoch sparen.
Und das geht so:
  • Überschreiben der OnHandleCreated()-Methode in der eigenen Control-Klasse
  • Ermitteln einer DesignerActionService-Instanz
  • Einhängen der eigenen Action List über die Add()-Methode

Dies könnte beispielsweise so aussehen:

class LabelEx : Label
{
    protected override void OnHandleCreated(EventArgs e)
    {
        base.OnHandleCreated(e);
        if (this.Site != null)
        {
            DesignerActionService actionService =
                this.Site.GetService(typeof(DesignerActionService)) as DesignerActionService;
            if (actionService != null)
            {
                actionService.Add(this, new LabelExActionList(this));
            }
        }
    }
}

2 Comments:

  • Wenn ich das in einer Form-Klasse einbinde, die als Basisklasse für Visual Inheritance fungiert, und die abgeleitete Form nicht ganz in das Designer-Fenster passt, verschwindet beim Scrollen der Smart Tag.
      Ich finde keine Möglichkeit den Tag wieder anzuzeigen ohne das Designerfenster neu aufzumachen(weil da die Form und der FormDesigner neuerzeugt werden). Gibt es eine Möglichkeit den Smart Tag wieder einzublenden wiederum ohne einen eigenen Designer zu entwerfen?

    By Anonymous Anonym, at Januar 24, 2008 11:52 AM  

  • Du könntest die Komponente mit einem Designer Verb versehen, die den Smart Tag mit Hilfe der DesignerActionUIService-Klasse anzeigt. Hierfür ist jedoch eine Designer-Klasse erforderlich. Das Ganze könnte zum Beispiel so aussehen:

    internal class LabelExDesigner : ControlDesigner
    {
    private IComponent m_component;
    private DesignerVerbCollection m_verbs;
    private DesignerActionListCollection m_actionLists;

    public override void Initialize(System.ComponentModel.IComponent component)
    {
    base.Initialize(component);
    m_component = component;
    }

    public override DesignerActionListCollection ActionLists
    {
    get
    {
    if (m_actionLists == null)
    {
    m_actionLists = new DesignerActionListCollection();
    m_actionLists.Add(new LabelExActionList((LabelEx)Control));
    }
    return m_actionLists;
    }
    }

    public override DesignerVerbCollection Verbs
    {
    get
    {
    if (m_verbs == null)
    {
    m_verbs = new DesignerVerbCollection();
    DesignerVerb verbSmartTag = new DesignerVerb("Show Smart Tag...",
    new EventHandler(this.OnShowSmartTag));
    m_verbs.Add(verbSmartTag);
    }
    return m_verbs;
    }
    }

    private void OnShowSmartTag(object sender, EventArgs e)
    {
    DesignerActionUIService srv = this.GetService(typeof(DesignerActionUIService)) as DesignerActionUIService;
    srv.ShowUI(m_component);
    }
    }

    By Blogger Jörg Neumann, at Februar 08, 2008 11:59 AM  

Kommentar veröffentlichen

<< Home