2010-05-07 16 views
20

Spróbuję wyjaśnić, o co mi chodzi. Nie znam technicznego terminu, więc tutaj:Jak włączyć obsługę projektu w sterowaniu niestandardowym?

Przykład 1: Jeśli umieściłem ListView na formularzu i dodaję kolumny, jestem w stanie, w Design-Time, kliknąć i przeciągnąć kolumny, aby zmienić ich rozmiar.

Przykład 2: Teraz umieszczam ListView w UserControl i nazywam go "MyCustomListView" (i być może dodam jakąś metodę, aby jakoś go poprawić).

Jeśli wiem, umieść "MyCustomListView" na formularzu, nie mogę kliknąć i przeciągnąć nagłówków kolumn, aby zmienić ich rozmiar w czasie projektowania.

Czy istnieje sposób, aby łatwo to zrobić? Pewna forma "przekazuje zdarzenie click-and-drag do kontrolki i pozwala tej kontroli na magię". Naprawdę nie chcę recode, wystarczy przekazać myszką (lub cokolwiek to jest) i pozwolić, w tym przypadku, ListView, zareagować tak jak w pierwszym przykładzie powyżej.

Odpowiedz

47

Projektant formularzy Windows ma dedykowane klasy projektantów dla większości elementów sterujących. Projektantem ListView jest System.Windows.Forms.Design.ListViewDesigner, klasa wewnętrzna w zestawie System.Design.dll. Ta klasa umożliwia przeciąganie nagłówków kolumn.

UserControl korzysta z klasy projektanta System.Windows.Forms.Design.ControlDesigner. Nie robi nic specjalnego, po prostu umieszcza prostokąt wokół kontrolki za pomocą uchwytów przeciągania. Możesz zobaczyć, gdzie jest to nagłówek: po umieszczeniu formantu użytkownika na formularzu, jest to ControlDesigner, który jest używany do projektowania klasy, ListViewDesigner nie ma na zdjęciu. W ten sposób tracisz możliwość przeciągania nagłówków kolumn. Zauważ też, że ControlDesigner nie daje dostępu do kontroli wewnątrz UC.

Można to jednak naprawić, tworząc własnego projektanta. Rozpocznij od projektów + Dodaj odwołanie, wybierz System.Design. Musisz dodać właściwość publiczną do UC, aby odsłonić widok listy i zastosować atrybut [DesignerSerializationVisibility], aby umożliwić zapisanie zmienionych właściwości. I zastosuj atrybut [Projektant] do klasy UC, aby zastąpić domyślnego projektanta. Powinno to wszystko przypominać (używając nazw domyślnych i ListView, który wyświetla „pracownicy”):

using System; 
using System.ComponentModel; 
using System.Drawing; 
using System.Windows.Forms; 
using System.Windows.Forms.Design; // Note: add reference required: System.Design.dll 

namespace WindowsFormsApplication1 { 
    [Designer(typeof(MyDesigner))] // Note: custom designer 
    public partial class UserControl1 : UserControl { 
     public UserControl1() { 
      InitializeComponent(); 
     } 

     // Note: property added 
     [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
     public ListView Employees { get { return listView1; } } 
    } 

    // Note: custom designer class added 
    class MyDesigner : ControlDesigner { 
     public override void Initialize(IComponent comp) { 
      base.Initialize(comp); 
      var uc = (UserControl1)comp; 
      EnableDesignMode(uc.Employees, "Employees"); 
     } 
    } 
} 

widoku listy w kontroli użytkownika można teraz kliknąć i zaprojektowany jako normalne.

+6

++ dzięki za uprzejmość. Cieszę się, że się pokazałeś i czegoś mnie nauczyłeś. –

+4

To był idealny przykład idealnej odpowiedzi =) Thx! – Ted

Powiązane problemy