6

Ich habe ein benutzerdefiniertes Registersteuerelement für meine Windows-Anwendung erstellt. Das benutzerdefinierte Registersteuerelement erweitert System.Windows.Forms.TabControl. Der Grund, warum ich ein benutzerdefiniertes Registerkartensteuerelement erstellt habe, ist, dass ich eine Eigenschaft im Fenster Eigenschaften von Visual Studio verfügbar machen kann, die es mir ermöglicht, individuelle Schriftarten für jede Registerkarte im benutzerdefinierten Registerkartensteuerelement zu definieren. Hier ist ein kurzer Blick auf die Klassendefinition:Eine Eigenschaft der Typenliste freilegen <class> In VS Designer Zugriff auf Elemente begrenzen oder ausblenden oder Eigenschaft als erweiterbares Menü anzeigen?

[ToolboxItem(true)]  
public partial class CustomTabControl : System.Windows.Forms.TabControl 

speichern jeden einzelnen Namen/font Paar I eine verschachtelte Klasse in CustomTabControl erstellt:

[TypeConverter(typeof(TabFontConverter))] 
public class TabFont 
{ 
    public string Name { get; set; } 
    public Font Font { get; set; }   
    public TabFont() 
    { 
    }   
    public TabFont(string name, Font font) 
    { 
     this.Name = name; 
     this.Font = font; 
    } 
} 

(Beachten Sie die Verwendung des Typeconverter Eigenschaft über der TabFont-Klasse hinzugefügt, weil ich online gelesen habe, dass dies erforderlich war, wenn ich diesen Typ im Visual Studio Designer enthüllen würde.)

Hier ist die Konverterklasse (die auch verschachtelt ist) innen CustomTabControl):

public class TabFontConverter : TypeConverter 
{ 
    public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] filter) 
    { 
     return TypeDescriptor.GetProperties(value, filter); 
    } 

    public override bool GetPropertiesSupported(ITypeDescriptorContext context) 
    { 
     return true; 
    } 
} 

ich eine Klassenvariable definiert die benutzerdefinierten Registerkarte Schriftarten als Liste zu speichern:

private List<TabFont> _CustomTabFonts = new List<TabFont>(); 

diese Liste zu füllen, habe ich ein Event-Handler für ControlAdded:

Hier ist, wie ich die Liste im Ereignishandler auffüllen:

private void CustomTabControl_ControlAdded(object sender, ControlEventArgs e) 
{ 
    if (e.Control.GetType() == typeof(TabPage)) 
    { 
     TabPage newTabPage = (TabPage)e.Control; 
     Font newTabPageFont = newTabPage.Font; 
     _CustomTabFonts.Add(new TabFont(newTabPage.Text, newTabPageFont)); 
     e.Control.Font = newTabPageFont; 
    } 
} 

Und schließlich binden sie alle bis ich den folgenden Code definiert das Visual Studio-Designer für den Zugriff/ändern die benutzerdefinierte Registerkarte Schriftenliste erlaubt:

[DefaultValue(typeof(List<TabFont>))] 
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 
public List<TabFont> CustomTabFonts 
{ 
    get { return _CustomTabFonts; } 
    set { _CustomTabFonts = value; } 
} 

Nach Wiederaufbau schalte ich zurück in die Visual Studio-Entwurfsansicht , habe ein CustomTabControl zu meinem Hauptformular hinzugefügt, indem ich eines aus der Toolbox gezogen habe. Dann habe ich 2 Registerkarten mit den Namen "Tab 1" und "Tab 2" hinzugefügt.

Dies ist, was die Eigenschaften zeigt für meine benutzerdefinierte Registerkarte Schriftarten Feld Eigenschaft:

Custom Tab Fonts Property

Beachten Sie, dass es die Art, wie eine Sammlung zeigt und stellt eine Schaltfläche [...] für die Bearbeitung klicken. Wenn ich auf die Schaltfläche klicken Sie hier ist, was ich sehe:

Custom Tab Fonts Property Editor

ich ein paar Fragen bezüglich der Eigenschaftseditor haben.

  • Die rechte Seite des Eigenschaftseditor zeigt sowohl die Schriftart und Namen für die ausgewählten Registerkarte. Ich möchte nur die Schriftart, nicht den Namen ändern können. Wie kann ich das Namensfeld entweder verstecken oder es zumindest nur lesen lassen?(Ich würde das Namensfeld bevorzugen, um es überhaupt nicht anzuzeigen , weil ich nicht in der Lage sein will, es zu ändern, und es ist auch redundant , weil die Namen bereits auf der linken Seite der Eigenschaft Editor angezeigt werden.)

  • Die linke Seite des Eigenschaftseditors zeigt die Liste der Register, die genau ist, was ich will. Ich möchte jedoch nicht zulassen, zu verschieben, hinzuzufügen oder eines dieser Elemente zu entfernen. Wie kann ich die Move (hoch/runter Pfeile) und Hinzufügen/Entfernen Tasten entweder verstecken oder deaktivieren?

  • Die linke Seite des Eigenschafteneditors hat eine Überschrift namens "Mitglieder". Kann ich das ändern, um zu sagen, was ich will? So etwas wie "Registerkarten", etc.

  • Die rechte Seite des Eigenschaftseditors hat eine Überschrift mit dem Namen "Misc". Can ändere ich das auch?

Vielen Dank.

Jan

____UPDATE____

Wenn es eine bessere/andere Art und Weise zu tun, was ich versuche ich, für alle Vorschläge offen bin zu tun. Ich bin neu und das, was ich bisher gemacht habe, basiert auf verschiedenen Ergebnissen von verschiedenen Websites.

Ich würde wirklich gerne meine Eigenschaft im Designer ähnlich wie die Margen angezeigt werden. Anstelle eines Popup-Fensters mit einer Liste von Registerkarten/Eigenschaften möchte ich eine erweiterbare Liste, wobei jedes Listenelement der Name der Registerkarte ist, gefolgt von der Schriftart, auf die Sie klicken können, um nur die Schriftart zu bearbeiten. Etwas wie folgt aus:

Custom Tab Fonts Property Preferred

Antwort

0

Ich kann die aktualisieren Frage nicht beantworten, aber ich werde gehen an die beiden anderen haben: den Text ändern „Mitglieder“: Der einzige Weg, Ich kann sehen, dies zu tun, um einen benutzerdefinierten CollectionEditor zu erstellen, der ein benutzerdefiniertes CollectionEditor.CollectionForm öffnet. Ich habe das nicht versucht. Anhalten der Eigenschaft "Name" im Editor: Ja, dies kann in der TypeConverter.GetProperties-Methode durch Filtern des Ergebnisses erfolgen. Ich habe das "Filter" -Argument für die TypeDescriptor.GetProperties-Methode nicht gefunden, aber es könnte daran liegen, dass ich es nicht korrekt verwendet habe. Das Problem ist, dass eine PropertyDescriptorCollection nach dem Erstellen schreibgeschützt ist, also habe ich den Inhalt des Ergebnisses kopiert, aber das Element, das ich nicht haben wollte, verpasst. Dies sollte funktionieren:

public class TabFontConverter : TypeConverter 
    { 
     public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] filter) 
     { 
      PropertyDescriptorCollection rawResult = TypeDescriptor.GetProperties(value, filter); 
      PropertyDescriptor[] arrRawResult = new PropertyDescriptor[rawResult.Count - 1]; 

      int i = 0; 
      int j = 0; 
      while (i < rawResult.Count) 
      { 
       if (rawResult[i].Name != "Name") 
       { 
        arrRawResult[j] = rawResult[i]; 
        j++; 
       } 
       i++; 
      } 
      PropertyDescriptorCollection filteredResult = new PropertyDescriptorCollection(arrRawResult); 

      return filteredResult; 
     } 
Verwandte Themen