C# Extendet ToolTip zusammenbauen

roker002

Commander
Dabei seit
Dez. 2007
Beiträge
2.050
Ich habe ein kleines Problem. Ich versuche einen ToolTip zu erweitern, damit man die inhalte dynamisch ändern kann (möglichst mit visual designer). Deswegen habe ich mir eine komponente zusammengebaut die den Titel und Icon des Tooltips je nach object ändert.

Nur das Problem... wenn ich versuche zu debuggen, dann erreiche ich den einsprungspunkt nicht!

Mein Code

Code:
namespace MyToolTip
{
    //[System.ComponentModel.ProvideProperty("ToolTipsIcon", typeof(System.Windows.Forms.Control))]
    [System.ComponentModel.ProvideProperty("ToolTipsTitle", typeof(System.Windows.Forms.Control))]
    public class ExtToolTips : System.Windows.Forms.ToolTip, System.ComponentModel.IExtenderProvider
    {
        /// <summary>
        /// Liste mit Titeln von Tooltips
        /// </summary>
        private System.Collections.Generic.Dictionary<System.Windows.Forms.Control, string> Header;

        /// <summary>
        /// Liste mit allen Objecten und derer Icons.
        /// </summary>
        private System.Collections.Generic.Dictionary<System.Windows.Forms.Control, System.Windows.Forms.ToolTipIcon> Icons;
        
        /// <summary>
        /// Standard Text für den Titel
        /// </summary>
        private String StdHeader = "Info";

        /// <summary>
        /// Eventhandler der dafür verantwortlich ist dass 
        /// der Titel für ToolTip speziel für gewünschten Object angezeigt wird.
        /// </summary>
        public event EventHandler TitleChanged;

        /// <summary>
        /// Eventhandler der dafür verantwortlich ist dass 
        /// der Icon für ToolTip speziel für gewünschten Object angezeigt wird.
        /// </summary>
        public event EventHandler IconsChanged;

        /// <summary>
        /// Constructor für Erweiterten ToolTip
        /// </summary>
        public ExtToolTips()
        {
            Header = new Dictionary<System.Windows.Forms.Control, string>();
            Icons = new Dictionary<System.Windows.Forms.Control, System.Windows.Forms.ToolTipIcon>();
        }
        /// <summary>
        /// Auf Welches Control Element dieser ToolTip ansprechbar ist.
        /// </summary>
        public bool CanExtend(object extendee)
        {
            return (extendee is System.Windows.Forms.Control && (!(extendee is HelpTextLabel)) && (!(extendee is ExtToolTips)));
        }
        #region GETTER SETTER für ToolTipTitle
        /// <summary>
        /// Getter für den Titel des Tooltips
        /// </summary>
        [System.ComponentModel.Editor(typeof(System.ComponentModel.Design.MultilineStringEditor), typeof(System.Drawing.Design.UITypeEditor)),
        System.ComponentModel.DefaultValue("")]
        public string GetToolTipsTitle(System.Windows.Forms.Control control)
        {
            try
            {
                if (Header.ContainsKey(control)) return Header[control];
            }
            catch (Exception e)
            {
                ErrorLog.WriteError(e);
            }
            return string.Empty;
        }
        /// <summary>
        /// Speichert den ToolTip Titel bezüglich des Control Elements
        /// </summary>
        public void SetToolTipsTitle(System.Windows.Forms.Control control, string title)
        {
            if (title == null) title = this.StdHeader;
            this.TitleChanged += new EventHandler(ToolTips_ChangeTitle);
            Header[control] = title;
        }
        #endregion
        #region SETTER GETTER ToolTipIcons
        [System.ComponentModel.DefaultValue(System.Windows.Forms.ToolTipIcon.None)]
        public System.Windows.Forms.ToolTipIcon GetToolTipsIcon(System.Windows.Forms.Control control)
        {
            System.Windows.Forms.ToolTipIcon result = System.Windows.Forms.ToolTipIcon.None;
            try
            {
                if (Header.ContainsKey(control)) 
                    result = Icons[control];
            }
            catch (Exception e)
            {
                ErrorLog.WriteError(e);
            }
            return result;
        }

        public void SetToolTipsIcon(System.Windows.Forms.Control control, System.Windows.Forms.ToolTipIcon icon)
        {
            Icons[control] = icon;
            this.IconsChanged += new EventHandler(ToolTips_ChangeIcon);
        }
        #endregion
        #region Event Handler des Systems
        public void ToolTips_ChangeTitle(Object sender, EventArgs e)
        {
            if(!(sender is ExtToolTips))
                base.ToolTipTitle = GetToolTipsTitle((System.Windows.Forms.Control)sender);
        }
        public void ToolTips_ChangeIcon(Object sender, EventArgs e)
        {
            if (!(sender is ExtToolTips))
            {
                base.ToolTipIcon = GetToolTipsIcon((System.Windows.Forms.Control)sender);
            }
        }
        #endregion
    }
}
Offenbar werden die Ereignisse nicht ausgelöst.
Habe ich da jetzt irgendwas falsches gemacht! Ich muss ja wenn ein ToolTip angezeigt werden sollte den Control raushollen von welchem jetzt der ToolTip das kommt. Aber kann sein dass jetzt Custom Eventhandler einfach nicht initialisiert wird! hat da jemand einen Fehler entdeckt?

Das andere Problem Taucht auf wenn ich den Icon anzeigen lassen will. Im designer lässt sich alles regeln. Sobald ich versuche das Programm auszuführen stürzt mir der VS ab!

Jeder kann das mal ausprobieren wenn man die Kommentierung wegmacht (oben bei der Klasse)

Hmm schade... das es nicht funktioniert!
 

haze4real

Ensign
Dabei seit
Juni 2009
Beiträge
255
:/ meinste die Events TitleChanged und IconChanged? wenn ja wird es daran liegen das du diese nicht aufrufst, sondern nur nen EventHandler anhängst...
 
1

1668mib

Gast
Naja deine definierten Events können schlecht ausgelöst werden, wenn du sie auch nirgends im Code auslösen lässt...

Edit: Zu langsam ;-)
 

roker002

Commander
Ersteller dieses Themas
Dabei seit
Dez. 2007
Beiträge
2.050
ja hab noch nie selbst einen event handler zusammengebaut, deswegen habe ich auch wirklich wenig ahnung! was muss man den machen damit der event ausgelöst wird?
 

haze4real

Ensign
Dabei seit
Juni 2009
Beiträge
255
Code:
//Definition des Events
public event EventHandler TitleChanged;

//Aufruf des Events
if(TitleChanged != null) // Prüfen ob mindestens ein EventHandler angehängt wurde
{
   TitleChanged(this,EventArgs.Empty); // Aufruf
}

// Anhängen eines EventHandlers
TitleChanged += new EventHandler(OnTitleChanged);
Aufruf und Definition innerhalb der Klasse, Anhängen im Normalfall ausserhalb der Klasse... dir fehlt der Aufruf des Events, d.h. an den stellen wo du den EventHandler anhängst müsstest du eigentlich den Event aufrufen.
 

roker002

Commander
Ersteller dieses Themas
Dabei seit
Dez. 2007
Beiträge
2.050
Ja OK der event wird ausgelöst! mein Problem ist.... der wird nur am anfang ausgelöst wo die klasse initialisiert wird. Ich möchte aber dass dieser jedes mal wenn ein ToolTip angezeigt wird ausgelöst wird.

Leider kann man die interne Liste mit den Controls von ToolTip selbst nicht rausholen, wo alle tooltips texte ausgelagert sind. Ich kann ja mit einen event auslösen, Popup... dort wird leider nur die eigene Klasse mitübergeben, nicht das Object von wo aus es ausgelöst wurde
 

haze4real

Ensign
Dabei seit
Juni 2009
Beiträge
255
in den PopupEventArgs sind 2 Properties die dir evtl weiterhelfen könnten: AssociatedWindow und AssociatedControl.. Verstehe leider nicht wirklich was du machen willst. Alle Events werden irgendwo im Code ausgelöst, d.h. wenn du eigene Events erstellst musst du auch dafür Sorge tragen wann und wo diese in deinem Code ausgelöst werden.

/edit: Was für eine Liste mit allen Tooltip Texten?

/edit2: Achso, jetzt versteh ichs. Du willst das man ein ExtToolTips Control auf der Form hat und dieses zu einem gegebenen Zeitpunkt mit Zuordnungen zwischen Control und Icon/Text gespeisst wird, welche dann bei Anzeige des ToolTips gesetzt werden sollen?
 
Zuletzt bearbeitet:

roker002

Commander
Ersteller dieses Themas
Dabei seit
Dez. 2007
Beiträge
2.050
danke Haze4Real für die aufmerksamkeit... ich habe den EventArg des Popup's komplett aus den augen gelassen. Manche event args beinhalten keine informationen zu dem Control was den event hervorgerufen hat!

Ich habe den Code korrigiert, falls jemand lust hat den auch zu benutzen! Man kann eigentlich zu jedem Control element eigene Werte (Text, Titel und Icon) zuweisen, und das alle über den Design Editor!

Code:
namespace MyToolTip
{
    [System.ComponentModel.ProvideProperty("ToolTipsIcon", typeof(System.Windows.Forms.Control))]
    [System.ComponentModel.ProvideProperty("ToolTipsTitle", typeof(System.Windows.Forms.Control))]
    public class ExtToolTips : System.Windows.Forms.ToolTip, System.ComponentModel.IExtenderProvider
    {
        /// <summary>
        /// Liste mit Titeln von Tooltips
        /// </summary>
        private System.Collections.Generic.Dictionary<System.Windows.Forms.Control, string> Header;

        /// <summary>
        /// Liste mit allen Objecten und derer Icons.
        /// </summary>
        private System.Collections.Generic.Dictionary<System.Windows.Forms.Control, System.Windows.Forms.ToolTipIcon> Icons;
        
        /// <summary>
        /// Standard Text für den Titel
        /// </summary>
        private String StdHeader = "Info";

        /// <summary>
        /// Constructor für Erweiterten ToolTip
        /// </summary>
        public ExtToolTips()
        {
            Header = new Dictionary<System.Windows.Forms.Control, string>();
            Icons = new Dictionary<System.Windows.Forms.Control, System.Windows.Forms.ToolTipIcon>();
        }

        /// <summary>
        /// Auf Welches Control Element dieser ToolTip ansprechbar ist.
        /// </summary>
        public bool CanExtend(object extendee)
        {
            return (extendee is System.Windows.Forms.Control && (!(extendee is HelpTextLabel)) && (!(extendee is ExtToolTips)));
        }

        /// <summary>
        /// Getter für den Titel des Tooltips
        /// </summary>
        [System.ComponentModel.DefaultValue(""),
        System.ComponentModel.Description("Setze zu dem Control Element einen eigenen Titel."),
        System.ComponentModel.Editor(typeof(System.ComponentModel.Design.MultilineStringEditor), typeof(System.Drawing.Design.UITypeEditor))]
        public string GetToolTipsTitle(System.Windows.Forms.Control control)
        {
            try
            {
                if (Header.ContainsKey(control)) return Header[control];
            }
            catch (Exception e)
            {
                ErrorLog.WriteError(e);
            }
            return string.Empty;
        }

        /// <summary>
        /// Speichert den ToolTip Titel bezüglich des Control Elements
        /// </summary>
        public void SetToolTipsTitle(System.Windows.Forms.Control control, string title)
        {
            if (title == null) title = this.StdHeader;
            Header[control] = title;
            this.Popup += new System.Windows.Forms.PopupEventHandler(this.OnPopUp);
        }

        /// <summary>
        /// Getter des ToolTipIcons
        /// </summary>
        [System.ComponentModel.DefaultValue(System.Windows.Forms.ToolTipIcon.None),
        System.ComponentModel.Description("Ermöglicht die Auswahl aus mehreren ToolTipsIcons pro Control.")]
        public System.Windows.Forms.ToolTipIcon GetToolTipsIcon(System.Windows.Forms.Control control)
        {
            System.Windows.Forms.ToolTipIcon result = System.Windows.Forms.ToolTipIcon.None;
            try
            {
                if (Header.ContainsKey(control)) 
                    result = Icons[control];
            }
            catch (Exception e)
            {
                ErrorLog.WriteError(e);
            }
            return result;
        }

        /// <summary>
        /// Setter für den Titel des ToolTips pro Control Element
        /// </summary>
        public void SetToolTipsIcon(System.Windows.Forms.Control control, System.Windows.Forms.ToolTipIcon icon)
        {
            Icons[control] = icon;
            ///this.Popup += new System.Windows.Forms.PopupEventHandler(this.OnPopUp);
            ///Ich habe leider keine ahnung ob mach hier wirklich einen Event initialisieren muss.
        }
        
        /// <summary>
        /// Ermöglicht das Einsetzen von eigenen Titel und eigenen Icon 
        /// (wobei es sich bei 3 Icons Beschänkungen handelt)
        /// </summary>
        private void OnPopUp(Object sender, System.Windows.Forms.PopupEventArgs e)
        {
            base.ToolTipTitle = GetToolTipsTitle(e.AssociatedControl);
            base.ToolTipIcon = GetToolTipsIcon(e.AssociatedControl);
        }
    }
}
Überraschenderweise stürzt jetzt VS nicht mehr ab wenn ich versuche den Code auszuführen!

@haze4real
zu deinem EDIT: JA :D
 
Zuletzt bearbeitet:

haze4real

Ensign
Dabei seit
Juni 2009
Beiträge
255
np, wollte noch eben Anmerken, dass du das Anhängen des Events Popup besser im Konstruktor machst, da ansonsten pro Aufruf der Methode SetToolTipTitle ein EventHandler an den Event angehangen wird und dazu führt das die Methode OnPopup mehrmals pro "Popup" aufgerufen wird anstatt nur einmalig...
 

roker002

Commander
Ersteller dieses Themas
Dabei seit
Dez. 2007
Beiträge
2.050
ja stimmt... hab früher pro control einen eventhandler hinzugefügt... da es ehe ein globaler handler ist kann man ja drauf verzichten!

EDIT

Ich habe versucht auf dem ToolStrip das ganze auszuweiten! Leider funktioniert das nicht so gut, da die ToolStripItems keine Abgeleitete Klassen des Control Typs sind!

Najut ich habe dann kurzerhand mit einen Extended ToolStripButton versucht!

Mit kompilieren klappt alles gut aber die werte Lassen sich nicht übertrage!

Code:
namespace MyToolStripButton
{
    [System.ComponentModel.ProvideProperty("Icon", typeof(System.Windows.Forms.Control)),
    System.ComponentModel.ProvideProperty("Title", typeof(System.Windows.Forms.Control)),
    System.ComponentModel.ProvideProperty("Tip", typeof(System.Windows.Forms.Control)),
    System.Windows.Forms.Design.ToolStripItemDesignerAvailability(System.Windows.Forms.Design.ToolStripItemDesignerAvailability.All)]
    public class ExtToolStripButton : System.Windows.Forms.ToolStripControlHost
    {
        /// <summary>
        /// ToolTipIcon dass für diese Element angezeigt werden sollte.
        /// </summary>
        System.Windows.Forms.ToolTipIcon Icon;

        /// <summary>
        /// Titel des ToolTips auf dem ToolStripButtons
        /// </summary>
        System.String Title = System.String.Empty;

        /// <summary>
        /// ToolTipText
        /// </summary>
        System.String Tip = System.String.Empty;

        /// <summary>
        /// ToolTip was von der Klasse mitübergeben werden sollte.
        /// </summary>
        public ExtToolTips Ext { get; set; }

        /// <summary>
        /// Erstellt einen ToolStrip Item das den Button als Control Element beinhaltet.
        /// </summary>
        public ExtToolStripButton() : base(new System.Windows.Forms.Button())
        {
        }


        /// <summary>
        /// ToolTip Text für den eigenen ToolTip.
        /// </summary>
        public void SetTip(System.String txt)
        {
            ///Stelle sicher, dass eigener 
            ///ToolTipText nicht angezeigt wird
            if (!this.ToolTipText.Equals(String.Empty))
                this.ToolTipText = System.String.Empty;

            if (txt == null) txt = System.String.Empty;
            
            this.Tip = txt;
            if (Ext != null)
                Ext.SetToolTip(base.Control, this.Tip);
            else
                throw new ArgumentNullException("Ext", "Extended Tool Tip wurde nicht mitübergeben.");
        }

        /// <summary>
        /// Hollt den eigenen Titel aus dem ExtToolTip heraus.
        /// </summary>
        [System.ComponentModel.DefaultValue(""),
        System.ComponentModel.Description("Eingaben eigenes ToolTips."),
        System.ComponentModel.Editor(typeof(System.ComponentModel.Design.MultilineStringEditor), typeof(System.Drawing.Design.UITypeEditor))]
        public System.String GetTip()
        {
            return Ext.GetToolTip(base.Control);
        }

        /// <summary>
        /// Titel für den eigenen ToolTip
        /// </summary>
        public void SetTitle(System.String title)
        {
            if (title == null) title = System.String.Empty;
            this.Title = title;
            if(Ext != null)
                Ext.SetToolTipsTitle(base.Control, this.Title);
            else
                throw new ArgumentNullException("Ext", "Extended Tool Tip wurde nicht mitübergeben.");
        }

        /// <summary>
        /// Hollt den eigenen Titel aus dem ExtToolTip heraus.
        /// </summary>
        [System.ComponentModel.DefaultValue(""),
        System.ComponentModel.Description("Erstellen eines ToolTips Titels für diesen Element."),
        System.ComponentModel.Editor(typeof(System.ComponentModel.Design.MultilineStringEditor), typeof(System.Drawing.Design.UITypeEditor))]
        public System.String GetTitle()
        {
            return Ext.GetToolTipsTitle(base.Control);
        }

        /// <summary>
        /// Ermöglich die übergabe eines ToolTip Icons auf diesen Element-
        /// </summary>
        public void SetIcon(System.Windows.Forms.ToolTipIcon icon)
        {
            this.Icon = icon;
            if(Ext != null)
                Ext.SetToolTipsIcon(base.Control, this.Icon);
            else
                throw new ArgumentNullException("Ext", "Extended Tool Tip wurde nicht mitübergeben.");
        }

        /// <summary>
        /// Hollt den gesetzten ToolTipIcon wieder aus dem ExtToolTips heraus.
        /// </summary>
        [System.ComponentModel.DefaultValue(System.Windows.Forms.ToolTipIcon.None),
        System.ComponentModel.Description("Ermöglicht die Auswahl aus mehreren ToolTipsIcons pro Control.")]
        public System.Windows.Forms.ToolTipIcon GetIcon()
        {
            return Ext.GetToolTipsIcon(base.Control);
        }
    }
}
Ich kriege meine Eingaben nicht im Design Editor angezeigt! Woran kann es den liegen? Wer fragen über ToolStripControlHost hat, sollte zuerst im google nachschlagen :D
 
Zuletzt bearbeitet:

Rossibaer

Lieutenant
Dabei seit
Apr. 2007
Beiträge
735
Um die Extender Klasse auf ToolStripItems auszuweiten, musst du die Filter auch entsprechend auf System.ComponentModel.Component setzen und dann in der CanExtend Methode auch die ToolStripItems mit aufnehmen:

Code:
[System.ComponentModel.ProvideProperty("ToolTipsIcon", typeof([COLOR="Red"]System.ComponentModel.Component[/COLOR]))]
[System.ComponentModel.ProvideProperty("ToolTipsTitle", typeof([COLOR="Red"]System.ComponentModel.Component[/COLOR]))]
public class ExtToolTips : System.Windows.Forms.ToolTip, System.ComponentModel.IExtenderProvider
{
  public bool CanExtend(object extendee)
  {
    return (
      (extendee is System.Windows.Forms.Control[COLOR="Red"] || 
       extendee is System.Windows.Forms.ToolStripItem[/COLOR]) && 
      (!(extendee is HelpTextLabel)) && 
      (!(extendee is ExtToolTips)));
  }
}
 

roker002

Commander
Ersteller dieses Themas
Dabei seit
Dez. 2007
Beiträge
2.050
hmm komischerweise funktioniert das nicht! ToolTipsIcon und Title werden nicht mehr angezeigt!
 

Rossibaer

Lieutenant
Dabei seit
Apr. 2007
Beiträge
735
Sehe gerade, dass du bei den Getter und Setter Methoden jeweils die System.Windows.Forms.Control Klasse als Parameter verwendest. Das wäre natürlich auch anzupassen und dein gesamter Extender Code nach Control zu suchen und durch Component zu ersetzen. ToolStripItems sind keine Controls sondern Components, welches eine Ebene höher sind, d.h. Control erbt von Component und nicht anders rum. Schau mal das du deinen Code entsprechend änderst, sodaß alles wieder stimmig ist. Ebenso wirst du wahrscheinlich den Container, meist ist es eine Hashtable oder Dictionary, zum Verwalten der registrierten Komponenten so ändern müssen dass sie sowohl Controls als auch Components verwendet.

Also viel Erfolg.
Rossibaer
 

roker002

Commander
Ersteller dieses Themas
Dabei seit
Dez. 2007
Beiträge
2.050
aah jetzt hab ich das ganze System mit getter und Setter verstanden! Naja.... ne frage! kann man einen Ungebunden Typ übergeben? Ich brauche den Component nicht, da er sowieso für den Tooltip unbrauchbar ist! Nach meinem Code wird das ganze System von einem Button abgeleitet was selbst ein Control element ist. Dieses kann ich dann automatisch weiter an dem ToolTip innerhalb der Komponente übergeben.

Ich habe mal den Code Korrigiert!

Code:
namespace MyToolStripButton
{
    [System.ComponentModel.ProvideProperty("Icon", typeof([COLOR="Red"]System.ComponentModel.Component[/COLOR]))]
    [System.ComponentModel.ProvideProperty("Title", typeof([COLOR="Red"]System.ComponentModel.Component[/COLOR]))]
    [System.ComponentModel.ProvideProperty("Tip", typeof([COLOR="Red"]System.ComponentModel.Component[/COLOR]))]
    [System.Windows.Forms.Design.ToolStripItemDesignerAvailability(System.Windows.Forms.Design.ToolStripItemDesignerAvailability.All)]
    public class ExtToolStripButton : System.Windows.Forms.ToolStripControlHost
    {
        /// <summary>
        /// ToolTipIcon dass für diese Element angezeigt werden sollte.
        /// </summary>
        System.Windows.Forms.ToolTipIcon Icon;

        /// <summary>
        /// Titel des ToolTips auf dem ToolStripButtons
        /// </summary>
        System.String Title = System.String.Empty;

        /// <summary>
        /// ToolTipText
        /// </summary>
        System.String Tip = System.String.Empty;

        /// <summary>
        /// ToolTip was von der Klasse mitübergeben werden sollte.
        /// </summary>
        public ExtToolTips Ext { get; set; }

        /// <summary>
        /// Erstellt einen ToolStrip Item das den Button als Control Element beinhaltet.
        /// </summary>
        public ExtToolStripButton() : base(new System.Windows.Forms.Button())
        {
        }


        /// <summary>
        /// ToolTip Text für den eigenen ToolTip.
        /// </summary>
        public void SetTip([COLOR="Red"]System.ComponentModel.Component c[/COLOR], System.String txt)
        {
            ///Stelle sicher, dass eigener 
            ///ToolTipText nicht angezeigt wird
            if (!this.ToolTipText.Equals(String.Empty))
                this.ToolTipText = System.String.Empty;

            if (txt == null) txt = System.String.Empty;
            
            this.Tip = txt;
            if (Ext != null)
                Ext.SetToolTip(base.Control, this.Tip);
            else
                throw new ArgumentNullException("Ext", "Extended Tool Tip wurde nicht mitübergeben.");
        }

        /// <summary>
        /// Hollt den eigenen Titel aus dem ExtToolTip heraus.
        /// </summary>
        [System.ComponentModel.DefaultValue(""),
        System.ComponentModel.Description("Eingaben eigenes ToolTips."),
        System.ComponentModel.Editor(typeof(System.ComponentModel.Design.MultilineStringEditor), typeof(System.Drawing.Design.UITypeEditor))]
        public System.String GetTip([COLOR="Red"]System.ComponentModel.Component c[/COLOR])
        {
            return Ext.GetToolTip(base.Control);
        }

        /// <summary>
        /// Titel für den eigenen ToolTip
        /// </summary>
        public void SetTitle([COLOR="Red"]System.ComponentModel.Component c[/COLOR], System.String title)
        {
            if (title == null) title = System.String.Empty;
            this.Title = title;
            if(Ext != null)
                Ext.SetToolTipsTitle(base.Control, this.Title);
            else
                throw new ArgumentNullException("Ext", "Extended Tool Tip wurde nicht mitübergeben.");
        }

        /// <summary>
        /// Hollt den eigenen Titel aus dem ExtToolTip heraus.
        /// </summary>
        [System.ComponentModel.DefaultValue(""),
        System.ComponentModel.Description("Erstellen eines ToolTips Titels für diesen Element."),
        System.ComponentModel.Editor(typeof(System.ComponentModel.Design.MultilineStringEditor), typeof(System.Drawing.Design.UITypeEditor))]
        public System.String GetTitle([COLOR="Red"]System.ComponentModel.Component c[/COLOR])
        {
            return Ext.GetToolTipsTitle(base.Control);
        }

        /// <summary>
        /// Ermöglich die übergabe eines ToolTip Icons auf diesen Element-
        /// </summary>
        public void SetIcon([COLOR="Red"]System.ComponentModel.Component c[/COLOR], System.Windows.Forms.ToolTipIcon icon)
        {
            this.Icon = icon;
            if(Ext != null)
                Ext.SetToolTipsIcon(base.Control, this.Icon);
            else
                throw new ArgumentNullException("Ext", "Extended Tool Tip wurde nicht mitübergeben.");
        }

        /// <summary>
        /// Hollt den gesetzten ToolTipIcon wieder aus dem ExtToolTips heraus.
        /// </summary>
        [System.ComponentModel.DefaultValue(System.Windows.Forms.ToolTipIcon.None),
        System.ComponentModel.Description("Ermöglicht die Auswahl aus mehreren ToolTipsIcons pro Control.")]
        public System.Windows.Forms.ToolTipIcon GetIcon([COLOR="Red"]System.ComponentModel.Component c[/COLOR])
        {
            return Ext.GetToolTipsIcon(base.Control);
        }
    }
}
Wie man sieht, wird "Component c" nie verwendet.
Das Problem besteht aber immer noch! Ich kann den Text für den Titel/ToolTip Text und den Icon selbst immer noch nicht auswählen (per Design Editor).
Was mach ich den nun falsch?


EDIT:

Ich habe das jetzt anders gelöst! Da ich sowieso keine liste mitführen muss Kann ich es über die externen Getter Setter auch machen! Muss halt noch einen Eventhandler hinzufügen dass beim MouseHover halt die inhalte übergibt!

EDIT 2: Ich habe jetzt das ganze umgebaut! Eigentlich lässt sich das alles mit beliebigen Control Element erstellen.

Naja hier ist der Code

Code:
namespace MyToolStripButton
{
    [System.Windows.Forms.Design.ToolStripItemDesignerAvailability(System.Windows.Forms.Design.ToolStripItemDesignerAvailability.All)]
    public class ExtToolStripButton : System.Windows.Forms.ToolStripControlHost
    {
        /// <summary>
        /// ToolTipIcon dass für diese Element angezeigt werden sollte.
        /// </summary>
        [System.ComponentModel.Description("Ermöglicht die Auswahl aus mehreren ToolTipsIcons pro Control.")]
        public System.Windows.Forms.ToolTipIcon Icon { get; set; }

        /// <summary>
        /// Titel des ToolTips auf dem ToolStripButtons
        /// </summary>
        [System.ComponentModel.Description("Erstellen eines ToolTips Titels für diesen Element.")]
        [System.ComponentModel.Editor(typeof(System.ComponentModel.Design.MultilineStringEditor), typeof(System.Drawing.Design.UITypeEditor))]
        public System.String Title { get; set; }

        /// <summary>
        /// ToolTipText
        /// </summary>
        [System.ComponentModel.Description("Eingaben eigenes ToolTips.")]
        [System.ComponentModel.Editor(typeof(System.ComponentModel.Design.MultilineStringEditor), typeof(System.Drawing.Design.UITypeEditor))]
        public System.String Tip { get; set; }

        /// <summary>
        /// ToolTip was von der Klasse mitübergeben werden sollte.
        /// </summary>
        public ExtToolTips Ext { get; set; }

        /// <summary>
        /// Erstellt einen ToolStrip Item das den Button als Control Element beinhaltet.
        /// </summary>
        public ExtToolStripButton() : base(new System.Windows.Forms.Button())
        {
            base.MouseHover += new EventHandler(MouseHover);
        }

        private void MouseHover(Object sender, EventArgs e)
        {
            if (this.Ext == null)
                throw new Exception("Es wurde kein ToolTip Controlelement mitübergeben.", new ArgumentNullException("Ext", "Ext ist NULL"));
            if(this.Tip == null)
                throw new Exception("Es wurde kein Tip für den ToolTip mitübergeben.", new ArgumentNullException("Tip", "Tip ist NULL"));
            if(this.Title == null)
                throw new Exception("Es wurde kein Titel für den ToolTip mitübergeben.", new ArgumentNullException("Title", "Title ist NULL"));

            ///Ist eigentlich egal wieviele male es versucht 
            ///wird den Control zu setten, da er in der Liste eh
            ///nur ein mal vorhanden sein kann und wenn nötig um-
            ///geschrieben wird.
            this.ToolTipText = String.Empty;
            Ext.SetToolTip(base.Control, this.Tip);
            Ext.SetToolTipsIcon(base.Control, this.Icon);
            Ext.SetToolTipsTitle(base.Control, this.Title);
        }
    }
}
Man muss nur Beachten dass es GETTER und SETTER für die 3 Controls gesetzt werden, sonst wird dieser nicht nach außen sichtbar! Zumindest funktioniert das bei VS 2008 :D
 
Zuletzt bearbeitet:

Rossibaer

Lieutenant
Dabei seit
Apr. 2007
Beiträge
735
Ich war jetzt immer von deiner ersten Klasse "ExtToolTips " in diesem Thread ausgegangen und habe mir die Klasse "ExtToolStripButton " nur wenig bzw. nicht wirklich angeschaut. Nach dem du mich jetzt mit der Nase auf diese neue Klasse gestupst hast, würde ich es wahrscheinlich unter den gegebenen Umständen ebenso machen. Du hast zumindest recht das du so keinen ExtenderProvider brauchst. Dachte jetzt nicht daran, dass du scheinbar beide Klassen gemischt hast, was sehr wahrscheinlich nicht funktioniert. Freut mich jedoch, dass du auch ohne meine Hilfe das Problem lösen konntest. Zeigt sich wieder mal das viele Wege nach Rom führen...

Grüße
Rossibaer
 

roker002

Commander
Ersteller dieses Themas
Dabei seit
Dez. 2007
Beiträge
2.050
hmm man könnte auch mit dem IExtendetProvider machen (was wahrscheinlich so funktionieren wird wie bei dem HelpLabel wo du mir geholfen hast), aber ich habe dadurch immer noch keinen Control den ich für ToolTip Weitergeben kann. Deswegen dachte ich dass es auch ohne IExtendedProvider gehen würde, um die komponenten im designer anzuzeigen. Offenbar funktioniert das soooo nicht... was eigentlich schade ist. Naja, der beispiel ist unschön aber es funktioniert :D
Ist auf jeden fall viel schlanker als mit dem IExtendedProvider ;)

Habe bald sicher wieder paar fragen!!
 

Rossibaer

Lieutenant
Dabei seit
Apr. 2007
Beiträge
735
Ob schön oder unschön liegt im Auge des Betrachters, also sei nicht so kritisch damit. Wenn du oder ein anderer den Code lesen und verstehen kann ohne das viel Erklärungen nötig sind, dann ist auch die Chance groß, dass man nach Jahren diesen Code liest und versteht. Somit wären meine persönlichen Anforderungen an ein Stück Code erfüllt, also sieh es mal unter dem Aspekt das du einen "schlanken" Code gestrickt hast, mit dem du was machen kannst. Bei Windows 8 und Visual Studio 2012 wird vielleicht eh alles anders sein... :D
 

roker002

Commander
Ersteller dieses Themas
Dabei seit
Dez. 2007
Beiträge
2.050
schon über windows 8 und VS 2012 die sprache? :D
Irgendwie gehts das aber zu schnell... OK bei Vista war ja ganz neuer Core (was zum größten teil auf win 7 übernohmen wurde)
Ich hoffe dass MS jetzt unterstützung der Vorgängerversion komplett aufgibt um sich mal vom langsamen komzepten zu trennen. Die haben ja schon sozusagen eine VM intern im Kern für Xp zusammengebastelt.

Ne frage. Kann man eigentlich irgendwo eine Übersicht über die gesamten Attribute bekommen was MS alles verwendet? Ich habe in der Richtung mehr interesse, da ich sicher noch viele eigene Komponente zusammenbasteln muss.
 

Rossibaer

Lieutenant
Dabei seit
Apr. 2007
Beiträge
735
Windows 8 würde wahrscheinlich auf 7 folgen, reine Vermutung. ;) VS 2012 ebenfalls nur eine Vermutung ;)
War nur ein Witz, aber ist zu schön, dass ich auch mal einen Hoax in den Cyberspace geblasen habe ... :D

Zur Frage: Mir ist keine wirklich umfassende Doku bekannt in der alle vom VS und dessen Designer verwendeten Attribute beschrieben werden. Konnte aber bisher zu jedem konkreten Fall, den ich hatte, mit .Net Reflector das für mich Nötige herausfinden. Dann noch Klatschtante Google gefragt und schon wurde mir klar wie ich dies oder jenes für was verwenden kann. Denke, wer suchet der findet. Bin aber eh nicht auf dem aktuellen Stand was .Net angeht. Lebe halt in der Zeit vor 5 Jahren.
 
Top