2009-09-05 13 views
5

Mam irytujący problem - chcę użyć listview z obrazami jako menu. Załóżmy, że lista zawierała 3 "obrazy".C# Problem z WinForms Panel

  • Obraz 1.) "Main"
  • Obraz 2.) "Opcje"
  • Obraz 3.) "Inne"

Teraz gdy klikam "Main" obraz, ja wyświetliłby panel "Główny", taki sam dla obrazu "Opcje", w którym wyświetlany jest panel "Opcje". ale tutaj jest denerwująca część. Mam 3 panele w moim formularzu. Więc kiedy chcę edytować jeden panel, muszę zmienić rozmiar pozostałych dwóch, aby móc edytować pierwszy, ponieważ wszystkie są wyrzucane w formularzu. Redagowanie paneli staje się naprawdę denerwujące.

Czy istnieje jakiś formant równoważny kontrolce wxWidgets wxListBook? A może ktoś ma pomysł, jak rozwiązać ten problem? Pytam o czas projektowania

Dziękujemy!

Odpowiedz

2

Można po prostu wyświetlić panel bieżącego elementu i ukryć pozostałe panele. W formularzu dodaj pusty panel, który jest kontenerem dla paneli elementów widoku listy.

private Panel container; 

private void listView1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    //get the item panel associated with the current selection. 
    Panel itemPanel = GetItemPanelFromSelection(); 

    container.Controls.Clear(); 
    container.Controls.Add(itemPanel); 
    itemPanel.Dock = DockStyle.Fill; 
} 

Osobiście utworzę formant użytkownika dla każdego typu panelu, który ma być używany. Zaletą jest to, że możesz je łatwo edytować. Potem możesz użyć tego samego kodu powyżej.

+0

Zrobiłem coś podobnego do tego, po prostu dziedziczę z panelu dla każdej kontroli. Stworzyłem również proste rozszerzenie metody, aby wprowadzić je na wierzch, a dokowanie jest pełne, a kontrola nadrzędna jest przekazywana jako argument. – scottm

0

Zrobiłem to już wcześniej - wystarczy, że okno będzie wystarczająco duże, aby zmieścić wszystkie panele. W czasie wykonywania ukrywam wszystkie oprócz domyślnego panelu i ustawiam ich lokalizacje na równe. Dodatkowo ustawiam rozmiar okna nadrzędnego (lub kontrolnego) na taki, jaki chcę, tak aby jeden panel dobrze pasował do okna. Twoja metoda wyboru (klikanie obrazów) wydaje się być dobra, ponieważ możesz wykryć, który obraz jest kliknięty, i pokazać/ukryć odpowiednie panele.

Jest trochę niezgrabny, ale w niektórych przypadkach działa dobrze. Działa to doskonale w aplikacjach, w których chcesz wyświetlić wszystkie panele w czasie projektowania, ale wyświetlaj tylko jeden panel w czasie wykonywania. W związku z tym za pomocą wbudowanych narzędzi lokalizacyjnych Visual Studio będą nadal działać.

Oto przykładowy kod skopiowany z projektu. W rzeczywistości jest to okno Ustawienia, w którym wybieram panele do przeglądania z widoku drzewa.

Width = 640; // set the size of the form, as it's larger in Designer mode 
Height = 480; 

simulationPanel.Visible = false; // hide all panels, and set them to be top-left 
simulationPanel.Top = 0;   // relative to their parent control 
simulationPanel.Left = 0; 

delaysPanel.Visible = false; 
delaysPanel.Top = 0; 
delaysPanel.Left = 0; 

occurrencesPanel.Visible = false; 
occurrencesPanel.Top = 0; 
occurrencesPanel.Left = 0; 

languagePanel.Visible = false; 
languagePanel.Top = 0; 
languagePanel.Left = 0; 

Następnie, aby wybrać panel, można zrobić coś jak następuje:

private void ShowPanel(string name) 
{ 

    // its easy to just hide all panels again if one is currently visible 
    simulationPanel.Visible = false; 
    delaysPanel.Visible = false; 
    occurrencesPanel.Visible = false; 
    languagePanel.Visible = false; 

    if (name == "language") 
    { 
      languagePanel.Visible = true; 
    } else if (name = "delays") 
    { 
      delaysPanel.Visible = true; 
    } 
    ... etc 
} 
0

do edycji paneli w Visual Studio myśleć o budowie paneli siebie jako zwyczaj kontroluje — i może je mieć dziedziczą po wspólnym typie bazowym. Następnie każdy z nich ma własne okno projektanta.

Co do menu, a co z ustawieniem wszystkich paneli w pełnym rozmiarze, aby idealnie się pokrywały? W końcu możesz łączyć elementy sterujące jeden na drugim. Następnie możesz po prostu zadzwonić pod numer .BringToFront(), gdy użytkownik wybierze menu.

+0

To jest podobne podejście do mojej odpowiedzi i podoba mi się pomysł niestandardowych kontroli. –

5

Zakładam, że mówisz o edytowaniu paneli w czasie projektowania, a nie o czasie pracy. Wystarczy, że wszystkie panele będą tego samego rozmiaru, połóż je na sobie, a gdy je nazwiesz, upewnij się, że wszystkie mają ten sam prefiks. Wybierz panel wyświetlany u góry, a jeśli nie jest to ten, który chcesz, użyj listy rozwijanej w górnej części okna Właściwości, aby wybrać żądany panel, a następnie kliknij prawym przyciskiem myszy zaznaczony uchwyt panelu (przenoszenie i zmiana rozmiaru rzeczy) i wybierz "BringToFront".

0

Utwórz własny element potomny TabControl, jak pokazano poniżej. Kod ten został uzyskany od here:

using System; 
using System.Windows.Forms; 

public class MyTabControl : TabControl { 
    protected override void WndProc(ref Message m) 
    { 
     // Hide tabs by trapping the TCM_ADJUSTRECT message 
     if (m.Msg == 0x1328 && !DesignMode) 
      m.Result = (IntPtr)1; 
     else 
      base.WndProc(ref m); 
    } 
} 

Utwórz zakładkę dla każdego panelu menu, które można wymienić. W czasie projektowania można łatwo przełączać się między panelami, klikając odpowiednią kartę nagłówka strony karty. Powiąż każdy element menu ze stroną z zakładkami, aby w czasie wykonywania, za każdym razem, gdy wybierzesz pozycję menu, możesz aktywować/wybrać odpowiednią stronę z zakładką, aby wyświetlić planowany panel. W czasie wykonywania nagłówek karty nie będzie widoczny. Testowałem powyższe i to działa.

Alternatywnie możesz znaleźć kontrolkę zakładki, która ma wbudowaną obsługę ukrywania nagłówka karty. Na przykład używam kontrolki tabulacji dostępnej w DevExpress WinForm controls suite, która obsługuje ukrywanie nagłówków.