6

Utworzono niestandardowy element sterujący tabulacją dla mojej aplikacji systemu Windows. Niestandardowa kontrolka tabulatora rozciąga się na System.Windows.Forms.TabControl. Powodem, dla którego utworzyłem niestandardowy element sterujący tabulatorem, jest możliwość wyeksponowania właściwości w oknie Właściwości okna programu Visual Studio, która pozwala mi definiować indywidualne czcionki dla każdej strony karty w formancie zakładki niestandardowej. Oto krótkie spojrzenie na definicję klasy:Wystawienie właściwości listy typów <class> W VS Designer Ograniczanie/ukrywanie dostępu do członków lub wyświetlanie właściwości jako menu rozwijane?

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

do przechowywania każdej indywidualnej pary nazwa/font stworzyłem zagnieżdżone klasy wewnątrz CustomTabControl:

[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; 
    } 
} 

(Uwaga korzystanie z TypeConverter nieruchomości powyżej klasy TabFont. Dodałem to, ponieważ gdzieś czytałem w Internecie, że było to wymagane, jeśli mam zamiar ujawnić ten typ w projektancie Visual Studio.)

Oto klasa konwertera (która jest również zagnieżdżona wewnątrz 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; 
    } 
} 

I zdefiniowano klasę zmiennej do przechowywania czcionek niestandardowej karcie postaci listy:

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

do wypełnienia tej listy dodałem obsługi zdarzenia dla ControlAdded:

this.ControlAdded += new ControlEventHandler(CustomTabControl_ControlAdded); 

Oto jak zapełniam listę wewnątrz obsługi zdarzeń:

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; 
    } 
} 

I wreszcie związać to wszystko ja zdefiniowany następujący kod pozwalający Studio projektant wizualne do dostępu/zmodyfikować listę czcionek Zakładka zwyczaj:

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

Po przebudowie I powrócić do Visual Studio widoku projektu , dodałem CustomTabControl do mojego głównego formularza, przeciągając go z Toolbox., a następnie dodałem 2 strony z zakładkami o nazwie "Tab 1" i "Tab 2".

To właśnie właściwości box pokazy dla mojego niestandardowej właściwości czcionek zakładka:

Custom Tab Fonts Property

Zauważ, że to pokazuje typ jako zbiór i dostarcza przycisk [...], aby kliknąć na edycji. Po kliknięciu przycisku oto co widzę:

Custom Tab Fonts Property Editor

Mam kilka pytań dotyczących edytora własności.

  • Po prawej stronie edytora własności pokazuje zarówno czcionki i Nazwisko dla wybranej zakładki. Chcę tylko zmienić czcionkę, a nie nazwę. Jak mogę ukryć pole nazwy lub przynajmniej uczynić je tylko do odczytu?(Wolałbym, aby pole nazwy nie było tam wyświetlane w ogóle, ponieważ nie chcę go zmieniać, a także jest nadmiarowe , ponieważ nazwy są już widoczne po lewej stronie edytora właściwości .)

  • Lewa strona edytora właściwości pokazuje listę zakładek, która jest dokładnie taka, jak chcę. Nie chcę jednak pozwolić na przenoszenie, dodawanie, dodawanie, lub usuwanie któregokolwiek z tych elementów. Jak mogę ukryć lub dezaktywować przyciski Przenieś (strzałki w górę/w dół) i Dodaj/Usuń?

  • Lewa strona edytora właściwości zawiera nagłówek "Członkowie". Czy mogę to zmienić, aby powiedzieć, co chcę? Coś jak "Zakładki", itd.

  • Prawa strona edytora właściwości zawiera nagłówek "Różne". Czy mogę to zmienić?

Dziękuję bardzo.

Jan

____UPDATE____

Jeśli jest lepiej/inny sposób robi to, co próbuję zrobić, jestem otwarty na wszelkie sugestie. Jestem na to nowy i to, co do tej pory zrobiłem, opiera się na różnych wynikach z różnych stron internetowych.

Bardzo chciałbym, aby moja własność pojawiła się w projektancie w podobny sposób, jak pokazano marginesy. Zamiast okna wyskakującego z listą stron/właściwości karty chciałbym rozwinąć listę z każdym elementem listy będącym nazwą karty, po której następuje czcionka, którą można następnie kliknąć, aby edytować tylko czcionkę. Coś jak następuje:

Custom Tab Fonts Property Preferred

Odpowiedz

0

nie mogę odpowiedzieć zaktualizować pytanie, ale będę mieć go na drugiej dwa: zmieniając tekst „Członkowie”: Jedynym sposobem Widzę, że robię to, aby utworzyć niestandardowy CollectionEditor, który otwiera niestandardowy CollectionEditor.CollectionForm. Nie próbowałem tego jednak. Zatrzymanie właściwości "Nazwa" w edytorze: Tak, można to zrobić za pomocą metody TypeConverter.GetProperties, filtrując wynik. Nie znalazłem argumentu "filter" w metodzie TypeDescriptor.GetProperties, ale może to wynikać z tego, że nie używałem go poprawnie. Problem polega na tym, że po utworzeniu PropertyDescriptorCollection jest tylko do odczytu, więc skopiowałem zawartość wyniku, ale pominąłem element, którego nie chciałem. Powinno to zadziałać:

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; 
     }