C# Problem mit ImageKey List und diverse Properties

roker002

Commander
Registriert
Dez. 2007
Beiträge
2.077
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ExtendedControls
{
    [System.Windows.Forms.Design.ToolStripItemDesignerAvailability(System.Windows.Forms.Design.ToolStripItemDesignerAvailability.All)]
    public class ExtToolStripButton : System.Windows.Forms.ToolStripControlHost
    {
        /// <summary>
        /// Wurde ToolTip schon einmal gesetzt?
        /// </summary>
        private Boolean ToolTipSet = false;

        /// <summary>
        /// Der inner Controlelement was ToolStripControlHost beherrbergt.
        /// </summary>
        [System.ComponentModel.Category("Inner Button")]
        [System.ComponentModel.Description("Der inner Controlelement was ToolStripControlHost beherrbergt.")]
        public System.Windows.Forms.Button ToolStripButton
        {
            get
            {
                return this.Control as System.Windows.Forms.Button;
            }
        }

        /// <summary>
        /// Bestimmt, ob Element seine Größe auf der Basis seines Bildes und Textes automatisch ändern soll.
        /// </summary>
        [System.ComponentModel.Description("Bestimmt, ob Element seine Größe auf der Basis seines Bildes und Textes automatisch ändern soll.")]
        public new Boolean AutoSize 
        {
            get
            {
                return base.AutoSize;
            }
            set
            {
                base.AutoSize = value;
            }
        }

        /// <summary>
        /// ToolTipIcon dass für diese Element angezeigt werden sollte.
        /// </summary>
        [System.ComponentModel.Category("ToolTips")]
        [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.Category("ToolTips")]
        [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.Category("ToolTips")]
        [System.ComponentModel.Description("Eingaben eigenes ToolTips.")]
        [System.ComponentModel.Editor(typeof(System.ComponentModel.Design.MultilineStringEditor), typeof(System.Drawing.Design.UITypeEditor))]
        public new System.String ToolTipText { get; set; }

        /// <summary>
        /// ToolTip was von der Klasse mitübergeben werden sollte.
        /// </summary>
        [System.ComponentModel.Category("ToolTips")]
        [System.ComponentModel.Description("Weitervergabe der Extended ToolTip Klasse, um die Anzeige zu verbessern.")]
        public ExtToolTips Ext { get; set; }

        /// <summary>
        /// ImageList für den Internen Button.
        /// </summary>
        [System.ComponentModel.Category("Inner Button")]
        [System.ComponentModel.Description("ImageList für den internen Button des ToolStripButtons.")]
        [System.ComponentModel.Browsable(true)]
        public System.Windows.Forms.ImageList ImageList
        {
            get
            {
                return this.ToolStripButton.ImageList;
            }
            set
            {
                if (!value.Equals(this.ToolStripButton.ImageList))
                    this.ToolStripButton.ImageList = value;
            }
        }

        /// <summary>
        /// TextImageRelation für den Internen Button.
        /// </summary>
        [System.ComponentModel.Category("Inner Button")]
        [System.ComponentModel.Description("TextImageRelation für den internen Button des ToolStripButtons.")]
        [System.ComponentModel.Browsable(true)]
        [System.ComponentModel.DefaultValue(false)]
        public new System.Windows.Forms.TextImageRelation TextImageRelation
        {
            get
            {
                return this.ToolStripButton.TextImageRelation;
            }
            set
            {
                this.ToolStripButton.TextImageRelation = value;
            }
        }

        /// <summary>
        /// ImageKey für den Internen Button.
        /// </summary>
        [System.ComponentModel.Category("Inner Button")]
        [System.ComponentModel.Description("ImageKey für den internen Button des ToolStripButtons.")]
        [System.ComponentModel.Editor("System.Windows.Forms.Design.ImageIndexEditor, System.Design", typeof(System.Drawing.Design.UITypeEditor))]
        [System.Windows.Forms.RelatedImageList("ImageList")]
        [System.ComponentModel.TypeConverter(typeof(System.Windows.Forms.ImageKeyConverter))]
        [System.ComponentModel.Browsable(true)]
        public new System.String ImageKey
        {
            get
            {
                return this.ToolStripButton.ImageKey;
            }
            set
            {
                this.ToolStripButton.ImageKey = value;
            }
        }

        /// <summary>
        /// ImageIndex für den Internen Button.
        /// </summary>
        [System.ComponentModel.Category("Inner Button")]
        [System.ComponentModel.Description("ImageIndex für den internen Button des ToolStripButtons.")]
        [System.Windows.Forms.RelatedImageList("ImageList")]
        [System.ComponentModel.Browsable(true)]
        public new System.Int32 ImageIndex
        {
            get
            {
                return this.ToolStripButton.ImageIndex;
            }
            set
            {
                if (!int.Equals(value, this.ToolStripButton.ImageIndex))
                    this.ToolStripButton.ImageIndex = value;
            }
        }

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

        private void EventMouseHover(Object sender, System.Windows.Forms.PaintEventArgs e)
        {
            ///Sollte ToolTipText schon Initialisiert worden sein, dann beende die Anweisung.
            if (this.ToolTipSet)
                return;

            if (this.Ext == null)
                return;
                //throw new Exception("Es wurde kein ToolTip Controlelement mitübergeben.", new ArgumentNullException("Ext", "Ext ist NULL"));

            if (this.ToolTipText == null)
                this.ToolTipText = String.Empty;
                //throw new Exception("Es wurde kein Tip für den ToolTip mitübergeben.", new ArgumentNullException("Tip", "Tip ist NULL"));

            if (this.Title == null)
                this.Title = String.Empty;
                //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.
            Ext.SetToolTip(base.Control, this.ToolTipText);
            Ext.SetToolTipsIcon(base.Control, this.Icon);
            Ext.SetToolTipsTitle(base.Control, this.Title);

            this.ToolTipSet = true;
        }
    }
}

Den SourceCode kann ja jeder haben... da ich hier sowieso Poste...

In der erste Instanz wollte ich an den ToolStripButton einen ToolTip anhängen, was mein Programm nutzt, da es ja auch "Ext" = also Extended ToolTip ist, was eigenes aussehen hat.

Ich wollte über den GUI Editor den Button auch Images mitgeben lassen. Da mein Button in den Host Class eingebettet ist, funktioniert die einfache Zuweisung nicht. Der Editor überschreibt alles im Designer, wenn ich zum Editieren das Fenster aufmache. Über die eigene Methoden zur erstellung der ImageList und Keys für den eingebettet Button wollte ich auch nicht gehen, da es schon Teilweise ziemlich knapp mit Übersicht wird.

Mein Problem (falls jemand die Vorrede nicht lesen will :P) ist:

Ich habe schon Properties in der Klasse reingeschrieben, aber diese Tauchen im (GUI) Designer nicht auf.

Alle ToolTips und ImageList (die Klasse, in diesen Fall Property von dem Button) Kann ich im Designer beeinflüssen, aber (TextImageRelation, ImageKey, ImageIndex) werden nicht angezeigt. Ich habe schon überall herumgesucht, wie man die Properties sichtbar machen kann, aber nichts gefunden.

Habe ich da irgendwas falsches gemacht?
 
Zuletzt bearbeitet:
Danke für den Link @mib aber es hilft mir nicht weiter. ToolStripControlHost erbt von ToolStripItem und diese hat ja in der Vererbungsebene auch den Component.

Hier ist die Eigenschaftsliste von der Klasse als Bild... Die 3 fehlende Properties sollten bei der Kategorie Sonstiges auftauchen, aber die tun das nicht!
 

Anhänge

  • PropertyListe.png
    PropertyListe.png
    9,9 KB · Aufrufe: 172
Setz halt testweise mal
[Browsable(true)]
vor die Properites...

lol, und bei ImageKey setzst du es ja sogar noch auf "false" ...
Man könnte ja auch mal den Text durchlesen, wenigstens querlesen, den ich dir verlinkt habe...
 
Zuletzt bearbeitet:
Browsable beschreibt nur die zugänglichkeit der Property. Also kann man das überhaupt ändern oder nicht. Die Property sollte an sich aber trotzdem auftauchen!

Hmm ich habe sicher damals alles auf True gesetzt... Naja, Browsable ist die Lösung, aber ich verstehe immer noch nicht wieso.

Nebenbei gab es noch ein Problem.... DefaultValue auf False setzen damit der Designer auch jeden beliebigen Wert annimmt!
 
Zuletzt bearbeitet:
In this example, SimpleComponent has two properties: Data and IsDataValid. It makes little sense to have IsDataValid in the property browser because it is read-only and a developer does not need to know its value at design time. So, we can easily hide it by adding the BrowsableAttribute:

Den Satz solltest du dir mal zu Gemüte führen: "So, we can easily hide it by adding the BrowsableAttribute"...
Browsable hat nichts, rein gar nichts mit "ändern können" oder "nicht ändern können" zu tun...

Und wenn du dir mal die Mühe gemacht hättest und genau zu schauen, siehst du auch in Figure 1A wie read-only-properties vom Browser angezeigt werden... ganz ohne dass irgendwas mit browsable gemacht wurde. Da dies aber eine nutzlose Information ist wird sie dann im Folgenden über browsable versteckt...
 
Zuletzt bearbeitet:
hehe... ja tut mir leid... habs auf jeden Fall zu schnell Gelesen!

Naja, wenn jemand den Code brauchen würde, kann diesen auch ruhig benutzen. Ich habe auf jeden Fall den Code korrigiert.

@MIB
Danke, war wohl bisschen zu Kurzsichtig und voreilig! Werde in der Zukunft auf jeden Fall aufpassen.
 
Zurück
Oben