2009-08-02 26 views
14

Tengo problemas para hacer que funcione en una aplicación WPF en la que estoy trabajando. Básicamente, lo que busco es algo así como el panel de tareas en una MMC:Cómo activar o desactivar una visibilidad de columna WPF Grid

  • La aplicación tiene tres columnas en la parte principal de la pantalla. Necesito una columna en el lado derecho que se puede cambiar de tamaño. Supongo que esto significa el uso de una cuadrícula con un GridSplitter, pero todo lo que funciona va a hacer.
  • Quiero ser capaz de guardar el ancho de la columna del lado derecho cuando la aplicación está cerrada y cargarla cuando se abre la aplicación, pero este debe ser un tamaño inicial: el usuario debería poder cambiar el tamaño.
  • Cuando cambio el tamaño de la ventana, quiero que las columnas del lado izquierdo y del lado derecho permanezcan del mismo tamaño y que la columna del medio cambie el tamaño con el ancho de la ventana.
  • Las columnas del lado izquierdo y derecho deben tener un ancho mínimo. Cuando cambio el tamaño de la columna del lado derecho, quiero que la columna central se haga más pequeña, pero no la columna del lado izquierdo.
  • También quiero poder alternar la visibilidad de la columna del lado derecho con un botón de alternar que está fuera de la columna y cuando vuelva a la visibilidad quiero que sea del mismo ancho que antes.

Estoy tratando de hacer tanto como sea posible en XAML y con encuadernación.

¿Y puedo tenerlo cubierto con nata, helado y chispas de chocolate, por favor? :-)

+0

He editado bastante la pregunta original porque mi original era tan claro como el barro. – serialhobbyist

+0

Mi segunda recompensa en diez minutos. Como aún no he completado uno, no estoy muy seguro de lo que sucede. Supongo que veremos ... – serialhobbyist

+0

Si no elige una de las respuestas más votadas, automáticamente la obtiene –

Respuesta

16

Cuando leo sus requisitos, en lugar de pensar en un Grid, pienso en un DockPanel.

<DockPanel> 
    <Grid Name="right" 
     DockPanel.Dock="Right" MinWidth="100" /> 
    <Grid Name="Left" 
     DockPanel.Dock="Left" MinWidth="100" /> 
    <Grid Name="middle" /> 
</DockPanel> 

Si haces una manera de cambiar el tamaño de right, entonces middle cambiará a medida que se cambia el tamaño right. Si cambia el tamaño de la ventana, solo cambiará middle. El almacenamiento y configuración de Width de right depende de usted, pero no debe ser difícil.

En cuanto a permitir que el usuario cambie el tamaño right, eso será un poco más complicado, pero encontré this article que debería ayudar. podría ayudar aún más.

Para la visibilidad de right, puede configurar su Visibility a Collapsed de ocultarlo y restaurarlo estableciéndolo en Visible.

Nota: Los paneles en el interior no tienen que ser Grid s, pero querrá usar algún tipo de Panel para cada uno. Lo que tenga dentro de sus columnas actuales Grid debería funcionar bien.

+0

Usé su enfoque y los artículos que sugirió y funciona como un encanto. Ato las propiedades de Visibilidad del contenido y el divisor al botón de alternar y todo funciona según lo planeado. Muchas gracias por su ayuda. – serialhobbyist

+0

De nada. –

4

Establezca el valor de definición de columna en Auto y coloque un control dentro de esa columna y asigne a Star las otras columnas. Siempre que quiera ocultar la columna con contenido, configure el control. Visibilidad = Colapsado y dado que el ancho de la columna es Automático, no verá esa columna y las columnas restantes ocuparán el espacio.

+0

No puedo hacer que esto funcione con el comportamiento deseado. Establecer Ancho en Automático significa que cambiar el tamaño de la ventana afecta las columnas en lo que parecería al usuario como formas no sensuales. – serialhobbyist

7

Utilicé una cuadrícula con GridSplitters ya que esto hizo que sea realmente fácil cambiar el tamaño de la columna central manteniendo el ancho de las columnas izquierda y derecha.

XAML:

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    x:Class="MainWindow" 
    Title="Main Window" 
    Width="640" Height="480"> 

    <Grid> 
     <Grid.ColumnDefinitions> 
      <!-- Left column --> 
       <ColumnDefinition Width="200" MinWidth="100"/> 
       <!-- Left GridSplitter column --> 
       <ColumnDefinition Width="5"/> 
       <!-- Center column. A width of * means the column will fill 
        any remaining space. --> 
       <ColumnDefinition Width="*"/> 
       <!-- Right GridSplitter column --> 
       <ColumnDefinition x:Name="RightSplitterColumn" Width="5"/> 
       <!-- Right column --> 
       <ColumnDefinition x:Name="RightColumn" Width="200" 
            MinWidth="100"/> 
       </Grid.ColumnDefinitions> 
       <GridSplitter Grid.Column="1" HorizontalAlignment="Stretch" /> 
       <GridSplitter Grid.Column="3" HorizontalAlignment="Stretch" /> 
       <Button x:Name="ToggleButton" Grid.Column="2" 
         Content="Toggle Right Column" Width="150" Height="25" 
         Click="ToggleButton_Click" /> 
    </Grid> 
</Window> 

de código subyacente

Cuando ocultar la columna de la derecha, que acaba de establecer el ancho de columna a 0 ya que las columnas de cuadrícula no tienen una propiedad de visibilidad.

public partial class MainWindow : Window 
{ 
    private double rightColumnWidth; 
    private double rightColumnMinWidth; 
    private bool rightColumnHidden; 

    public MainWindow() 
    { 
     this.InitializeComponent(); 
    } 

    private void ToggleButton_Click(object sender, RoutedEventArgs e) 
    { 
     if (rightColumnHidden) 
     { 
      // Restore the widths. 
      RightColumn.MinWidth = rightColumnMinWidth; 
      RightColumn.Width = new GridLength(rightColumnWidth); 
      RightSplitterColumn.Width = new GridLength(5); 
     } 
     else 
     { 
      // Remember the user-set widths for the columns. 
      rightColumnWidth = RightColumn.Width.Value; 
      rightColumnMinWidth = RightColumn.MinWidth; 

      // Remember to set the minimum width to 0 before changing the actual 
      // width. 
      RightColumn.MinWidth = 0; 
      RightColumn.Width = new GridLength(0); 
      RightSplitterColumn.Width = new GridLength(0); 
     } 

     rightColumnHidden = !rightColumnHidden; 
    } 
} 

En cuanto a guardar y restaurar los anchos de columna en el inicio, me acaba de almacenar las variables de anchura a un archivo de configuración y luego aplicarlos cuando se vuelve a abrir la aplicación.

+0

Gracias por la sugerencia: logra lo que yo quería, así que lo 'subí', pero creo que este tipo de cosas se hace mejor en XAML con encuadernación siempre que sea posible. He aceptado la respuesta de Joel porque está más cerca de ese enfoque. Gracias de nuevo por tu trabajo. – serialhobbyist

Cuestiones relacionadas