2009-09-05 35 views
5

Tengo un problema molesto: quiero usar una vista de lista con imágenes como Menú. Digamos que la vista de lista contiene 3 "imágenes".C# WinForms Problema del panel

  • Imagen 1.) "Principal"
  • Imagen 2.) "Opciones"
  • Imagen 3.) "Miscelánea"

Ahora, cuando hago clic en la imagen "principal", me mostraría el panel "Principal", el mismo para la imagen de "Opciones" donde visualizo el panel "Opciones". pero esta es la parte molesta. Tengo 3 paneles en mi formulario. Entonces, cada vez que quiero editar un panel, tengo que cambiar el tamaño de los otros dos para poder editar el primero, ya que todos son arrojados al formulario. Resulta realmente molesto editar los paneles.

¿Hay algún tipo de control equivalente al control wxListBook de wxWidgets? ¿O alguien tiene una idea de cómo resolver esto? Pregunto por el tiempo de diseño

¡Gracias!

Respuesta

2

Puede mostrar el panel de elementos actual y ocultar los otros paneles. En su formulario, agregue un panel vacío que es el contenedor para los paneles de elementos de vista de lista.

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

Personalmente, me gustaría crear un control de usuario para cada tipo de panel que desee. La ventaja es que puedes editarlos fácilmente. Después de eso, puedes usar el mismo código anterior.

+0

He hecho algo similar para esto, solo heredé del panel para cada control. También creé una extensión de método simple para llevar al frente, y dock completo con el control padre pasado como argumento. – scottm

0

He hecho esto antes - Solo hago que la ventana sea lo suficientemente grande como para caber en todos los paneles. En tiempo de ejecución, oculto todo menos el panel predeterminado y establezco sus ubicaciones iguales. Además, configuré el tamaño de la ventana principal (o control) para que sea del tamaño que deseo de modo que un panel se ajuste bien en la ventana. Su método de selección (hacer clic en las imágenes) parece estar bien, ya que podría detectar en qué imagen se hace clic y mostrar/ocultar los paneles correspondientes.

Es un poco torpe, pero en algunos casos funciona muy bien. Esto funciona muy bien para aplicaciones en las que desea ver todos los paneles en tiempo de diseño, pero solo ve un panel en tiempo de ejecución. Por lo tanto, el uso de las herramientas de localización integradas de Visual Studio continuará funcionando.

Aquí hay un código de muestra que he copiado de un proyecto. Esta es en realidad una ventana de Configuración, donde selecciono paneles para ver desde un TreeView.

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; 

Luego, para seleccionar un panel, es posible hacer algo como lo siguiente:

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

Para la edición de los paneles en Visual Studio pensar en construir los propios paneles como controles de — y quizás tenerlos heredar de un tipo de base común. Luego cada uno obtiene su propia ventana de diseñador.

En cuanto al menú, ¿qué hay de configurar todos los paneles de tamaño completo para que se superpongan perfectamente? Después de todo, puedes superponer controles uno encima del otro. Luego puede llamar al .BringToFront() cada vez que el usuario hace una selección de menú.

+0

Este es un enfoque similar a mi respuesta, y me gusta la idea de controles personalizados. –

5

Supongo que está hablando de editar los paneles en tiempo de diseño y no de tiempo. Simplemente haga que todos sus paneles sean del mismo tamaño, colóquelos uno encima del otro y, cuando los nombre, asegúrese de que todos tengan el mismo prefijo. Seleccione el panel que se muestra en la parte superior y, si no es el que desea, use el menú desplegable en la parte superior de la ventana Propiedades para seleccionar el panel que desea, luego haga clic derecho sobre el agarre resaltado del Panel (moviéndose y cambio de tamaño de thingys) y seleccione 'BringToFront'.

0

Cree su propio descendiente TabControl como se muestra a continuación. Este código se obtuvo de 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); 
    } 
} 

crear una página de ficha para cada panel del menú que lo mencionas. En el momento del diseño, puede cambiar fácilmente entre los paneles haciendo clic en la pestaña del encabezado de la página de pestañas correspondiente. Asociar cada elemento del menú con una página de pestañas, de modo que en el tiempo de ejecución, cada vez que selecciones tu elemento de menú, puedas activar/seleccionar la pestaña correspondiente para mostrar el panel deseado. En tiempo de ejecución, el encabezado de la pestaña no estará visible. Probé lo anterior y funciona.

Alternativamente, puede encontrar un control de pestañas que tenga soporte integrado para ocultar el encabezado de la pestaña. Por ejemplo, utilizo el control de tabulación disponible en el DevExpress WinForm controls suite, que permite ocultar los encabezados.

Cuestiones relacionadas