Obsługa czasu projektowania programu Visual Studio dla kontrolek niestandardowych (platforma .NET systemu Windows Form)

Jak zauważyłeś podczas interakcji z projektantem systemu Windows Form, istnieje wiele różnych funkcji czasu projektowania oferowanych przez kontrolki systemu Windows Form. Niektóre funkcje oferowane przez program Visual Studio Projektant obejmują linie przyciągania, elementy akcji i siatkę właściwości. Wszystkie te funkcje oferują łatwiejszy sposób interakcji i dostosowywania kontroli w czasie projektowania. Ten artykuł zawiera omówienie rodzaju obsługi, którą można dodać do kontrolek niestandardowych, aby usprawnić środowisko projektowania dla użytkowników kontrolek.

Ważne

Dokumentacja przewodnika dla komputerów dla platform .NET 7 i .NET 6 jest w budowie.

Czym różni się program .NET Framework

Wiele podstawowych elementów projektowych kontrolek niestandardowych pozostał taki sam z programu .NET Framework. Jeśli jednak używasz bardziej zaawansowanych funkcji dostosowywania projektanta, takich jak listy akcji, konwertery typów, niestandardowe okna dialogowe, masz kilka unikatowych scenariuszy do obsługi.

Program Visual Studio jest aplikacją opartą na programie .NET Framework, a w związku z tym program Visual Projektant widoczny dla systemu Windows Formjest również oparty na programie .NET Framework. W przypadku projektu .NET Framework zarówno środowisko programu Visual Studio, jak i aplikacja systemu Windows Formsą projektowane w ramach tego samego procesu, devenv.exe. Stanowi to problem podczas pracy z aplikacją .NET systemu Windows Form(a nie .NET Framework). Zarówno platforma .NET, jak i program .NET Framework nie mogą działać w ramach tego samego procesu. W związku z tym platforma .NET systemu Windows Formużywa innego projektanta , projektanta "poza procesem".

Projektant out-of-process jest procesem o nazwie DesignToolsServer.exe i jest uruchamiany wzdłuż procesu devenv.exe programu Visual Studio. Proces DesignToolsServer.exe działa w tej samej wersji i na tej samej platformie, takiej jak .NET 7 i x64, platformy .NET przeznaczonej dla twojej aplikacji. Gdy kontrolka niestandardowa musi wyświetlać interfejs użytkownika w devenv.exe kontrolka niestandardowa musi zaimplementować architekturę klient-serwer, aby ułatwić komunikację z devenv.exe i z niej. Aby uzyskać więcej informacji, zobacz Projektant zmienia się od .NET Framework (windows Forms .NET).

Okno właściwości

W oknie Właściwości programu Visual Studio są wyświetlane właściwości i zdarzenia dla wybranej kontrolki lub formularza. Jest to zazwyczaj pierwszy punkt dostosowywania, który wykonuje się w niestandardowej kontrolce lub składniku.

Na poniższej ilustracji przedstawiono kontrolkę wybraną Button w wizualizacji Projektant i siatkę właściwości pokazującą właściwości przycisku:

Projektant systemu Windows Formw programie Visual Studio przedstawiający przycisk i okno właściwości

W siatce właściwości możesz kontrolować niektóre aspekty wyświetlania informacji o kontrolce niestandardowej. Atrybuty są stosowane do niestandardowej klasy formantu lub właściwości klasy.

Atrybuty dla klas

W poniższej tabeli przedstawiono atrybuty, które można zastosować, aby określić zachowanie niestandardowych kontrolek i składników w czasie projektowania.

Atrybut opis
DefaultEventAttribute Określa zdarzenie domyślne składnika.
DefaultPropertyAttribute Określa właściwość domyślną składnika.
DesignerAttribute Określa klasę używaną do implementowania usług czasu projektowania dla składnika.
DesignerCategoryAttribute Określa, że projektant klasy należy do określonej kategorii.
ToolboxItemAttribute Reprezentuje atrybut elementu przybornika.
ToolboxItemFilterAttribute Określa ciąg filtru i typ filtru do użycia dla elementu Przybornik.

Atrybuty właściwości

W poniższej tabeli przedstawiono atrybuty, które można zastosować do właściwości lub innych elementów członkowskich niestandardowych kontrolek i składników.

Atrybut opis
AmbientValueAttribute Określa wartość, która ma być przekazywana do właściwości, aby spowodować, że właściwość pobierze jej wartość z innego źródła. Jest to nazywane klimatem.
BrowsableAttribute Określa, czy właściwość lub zdarzenie powinny być wyświetlane w oknie Właściwości .
CategoryAttribute Określa nazwę kategorii, w której ma być zgrupowana właściwość lub zdarzenie w przypadku wyświetlania w kontrolce ustawionej PropertyGrid na Categorized tryb.
DefaultValueAttribute Określa wartość domyślną właściwości.
DescriptionAttribute Określa opis właściwości lub zdarzenia.
DisplayNameAttribute Określa nazwę wyświetlaną właściwości, zdarzenia lub metody publicznej, która nie zwraca wartości i nie przyjmuje żadnych argumentów.
EditorAttribute Określa edytor do zmiany właściwości.
EditorBrowsableAttribute Określa, że właściwość lub metoda jest widoczna w edytorze.
HelpKeywordAttribute Określa słowo kluczowe kontekstu dla klasy lub składowej.
LocalizableAttribute Określa, czy właściwość ma być zlokalizowana.
PasswordPropertyTextAttribute Wskazuje, że reprezentacja tekstu obiektu jest ukryta przez znaki, takie jak gwiazdki.
ReadOnlyAttribute Określa, czy właściwość ta atrybut jest powiązana z jest tylko do odczytu, czy tylko do odczytu/zapisu w czasie projektowania.
RefreshPropertiesAttribute Wskazuje, że siatka właściwości powinna zostać odświeżona po zmianie skojarzonej wartości właściwości.
TypeConverterAttribute Określa typ, który ma być używany jako konwerter dla obiektu, z jakim jest powiązany ten atrybut.

Projektanci kontrolek niestandardowych

Środowisko projektowania kontrolek niestandardowych można zwiększyć, tworząc skojarzony projektant niestandardowy. Domyślnie kontrolka niestandardowa jest wyświetlana na powierzchni projektowej hosta i wygląda tak samo jak w czasie wykonywania. Za pomocą projektanta niestandardowego można ulepszyć widok czasu projektowania kontrolki, dodać elementy akcji, linie przyciągania i inne elementy, co może pomóc użytkownikowi w określeniu sposobu układania i konfigurowania kontrolki. Na przykład w czasie ToolStrip projektowania projektant dodaje dodatkowe kontrolki, które użytkownik może dodawać, usuwać i konfigurować poszczególne elementy, jak pokazano na poniższej ilustracji:

Projektant systemu Windows Formw programie Visual Studio przedstawiający widok czasu projektowania podzielonego kontenera.

Możesz utworzyć własnych projektantów niestandardowych, wykonując następujące kroki:

  1. Dodawanie odwołania do pliku Microsoft.WinForms.Projektant. Pakiet NuGet zestawu SDK.
  2. Tworzenie typu dziedziczy z Microsoft.DotNet.DesignTools.Designers.ControlDesigner klasy .
  3. W klasie kontrolki użytkownika oznacz klasę atrybutem System.ComponentModel.DesignerAttribute klasy, przekazując typ utworzony w poprzednim kroku.

Aby uzyskać więcej informacji, zobacz sekcję Co się różni od programu .NET Framework .

Elementy akcji

Projektant akcje to menu kontekstowe, które umożliwiają użytkownikowi szybkie wykonywanie typowych zadań. Jeśli na przykład dodasz element TabControl do formularza, dodasz i usuniesz karty do i z kontrolki. Karty są zarządzane w oknie Właściwości za pośrednictwem TabPages właściwości, która wyświetla edytor kolekcji kart. Zamiast wymuszać, aby użytkownik zawsze przesiewał listę Właściwości wyszukując TabPages właściwość, TabControl udostępnia przycisk tagu inteligentnego, który jest widoczny tylko po wybraniu kontrolki, jak pokazano na poniższych obrazach:

Projektant systemu Windows Formw programie Visual Studio przedstawiający przycisk tagu inteligentnego kontrolki karty.

Po wybraniu tagu inteligentnego zostanie wyświetlona lista akcji:

Projektant systemu Windows Formw programie Visual Studio przedstawiający przycisk tagu inteligentnego kontrolki karty, który wyświetla listę akcji.

Dodając akcje Dodaj kartę i Usuń kartę, projektant kontrolki sprawia, że umożliwia szybkie dodawanie lub usuwanie karty.

Tworzenie listy elementów akcji

Listy elementów akcji są dostarczane przez ControlDesigner utworzony typ. Poniższe kroki to podstawowy przewodnik tworzenia własnej listy akcji:

  1. Dodawanie odwołania do pliku Microsoft.WinForms.Projektant. Pakiet NuGet zestawu SDK.
  2. Utwórz nową klasę listy akcji, która dziedziczy z klasy Microsoft.DotNet.DesignTools.Designers.Actions.DesignerActionList.
  3. Dodaj właściwości do listy akcji, do której użytkownik ma uzyskać dostęp. Na przykład dodanie bool właściwości lub Boolean (w Visual Basic) do klasy powoduje utworzenie CheckBox kontrolki na liście akcji.
  4. Wykonaj kroki opisane w sekcji Niestandardowe projektanci kontrolek, aby utworzyć nowego projektanta.
  5. W klasie projektanta ActionLists przesłoń właściwość, która zwraca Microsoft.DotNet.DesignTools.Designers.Actions.DesignerActionListCollection typ.
  6. Dodaj listę akcji do DesignerActionListCollection wystąpienia i zwróć ją.

Aby zapoznać się z przykładem listy akcji, zobacz repozytorium GitHub Projektant Dokumentów rozszerzalności i przykładów systemu WindowsForm, w szczególności TileRepeater.Designer.Server/ControlDesigner folder.

W oknie Właściwości większość właściwości jest łatwo edytowana w siatce, na przykład gdy typ kopii zapasowej właściwości jest wyliczeniem, wartością logiczną lub liczbą.

Program Visual Studio okno Właściwości dla aplikacji systemu Windows Formz wyświetloną właściwością wyrównania.

Czasami właściwość jest bardziej złożona i wymaga niestandardowego okna dialogowego, którego użytkownik może użyć do zmiany właściwości. Na przykład Font właściwość jest typem System.Drawing.Font , który zawiera wiele właściwości, które zmieniają wygląd czcionki. Nie jest to łatwe do przedstawienia w oknie Właściwości , więc ta właściwość używa niestandardowego okna dialogowego do edytowania czcionki:

Okno dialogowe Czcionka programu Visual Studio dla aplikacji systemu Windows Form.

Jeśli właściwości kontrolki niestandardowej korzystają z wbudowanych edytorów typów udostępnianych przez system Windows Form, możesz użyć EditorAttribute polecenia , aby oznaczyć właściwości odpowiednim edytorem .NET Framework, który ma być używany przez program Visual Studio. Korzystając z wbudowanych edytorów, należy unikać konieczności replikowania komunikacji klient-serwer-proxy dostarczonej przez projektanta poza procesem.

W przypadku odwoływania się do wbudowanego edytora typów użyj typu .NET Framework, a nie typu .NET:

[Editor("System.Windows.Forms.Design.FileNameEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a",
        "System.Drawing.Design.UITypeEditor, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
public string? Filename { get; set; }
<Editor("System.Windows.Forms.Design.FileNameEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")>
Public Property Filename As String