2011-06-08 22 views
6

Tengo dos paneles, solo uno debe estar visible al mismo tiempo. Cambio entre ellos haciendo clic en un botón, uno en cada panel.Visibilidad del panel de alternar WPF

¿Hay una buena manera de hacer esto en xaml sin codebehind o viewmodel?

+0

El botón en el panel X debe hacer que el panel X * en * sea visible, ¿verdad? – Vlad

+0

@Vlad: es verdad – Karsten

Respuesta

2

La sugerencia de usar un tabcontrol es buena. Encontré un código que diseña un TabControl para mostrar solo el contenido de TabItem

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid> 
    <TabControl BorderThickness="0" Padding="0"> 
     <TabControl.Resources> 
     <Style TargetType="TabItem"> 
      <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="TabItem"> 
       </ControlTemplate> 
      </Setter.Value> 
      </Setter> 
     </Style> 
     </TabControl.Resources> 
     <TabItem Header="Not shown"> 
     <Grid Background="Red"/> 
     </TabItem> 
     <TabItem> 
     <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center">Tab 2 

     </TextBlock> 
     </TabItem> 
    </TabControl> 
    </Grid> 
</P 
-1

No lo creo. Debería usar viewmodel o codebehind. Utilice un estilo con DataTrigger y vincule el valor de la propiedad de visibilidad a una propiedad en viewmodel, evitando el uso de codebehind.

+1

Está subestimando XAML. –

1

Si usó ToggleButtons, puede vincular la visibilidad del Panel 1 al estado IsChecked del Botón 2 y la visibilidad del Panel 2 al estado IsChecked del Botón 1. Haga que sean enlaces TwoWay y use el built-in Conversor de BooleanToVisibility.

+0

¿Está finalmente incorporado? – Snowbear

+0

Siempre ha sido incorporado. WPF se introdujo en .NET 3.0 y también BooleanToVisibilityConverter. http://msdn.microsoft.com/en-us/library/system.windows.controls.booleantovisibilityconverter%28v=VS.85%29.aspx –

3

En realidad es posible, aunque bastante complicado.

Mi ejemplo funciona sin código subyacente, en realidad sin ningún tipo de convertidor, también.

Aquí está el código: (versión simplificada ahora, gracias a @HB de ideas)

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:sys="clr-namespace:System;assembly=mscorlib" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Page.Resources> 
    <Style x:Key="RBToggleButtonStyle" TargetType="RadioButton"> 
     <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate> 
       <ToggleButton 
       IsChecked="{Binding IsChecked, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}" 
       Content="{Binding Content, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}" /> 
      </ControlTemplate> 
     </Setter.Value> 
     </Setter> 
     <Setter Property="Width" Value="150"/> 
     <Setter Property="Height" Value="25"/> 
     <Setter Property="HorizontalAlignment" Value="Right"/> 
     <Setter Property="VerticalAlignment" Value="Bottom"/> 
     <Setter Property="Margin" Value="15"/> 
     <Setter Property="Content" Value="Hide"/> 
    </Style> 
    <Style x:Key="MyBorderStyle" TargetType="Border"> 
     <Style.Triggers> 
     <DataTrigger Binding="{Binding IsChecked}" Value="True"> 
      <Setter Property="Visibility" Value="Hidden"/> 
     </DataTrigger> 
     </Style.Triggers> 
    </Style> 
    </Page.Resources> 
    <Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition/> 
     <ColumnDefinition/> 
    </Grid.ColumnDefinitions> 
    <Border Background="Green" Grid.Column="0" Style="{StaticResource MyBorderStyle}" DataContext="{Binding ElementName=greenB}"> 
     <RadioButton x:Name="greenB" GroupName="x" Style="{StaticResource RBToggleButtonStyle}"/> 
    </Border> 
    <Border Background="Red" Grid.Column="1" Style="{StaticResource MyBorderStyle}" DataContext="{Binding ElementName=redB}"> 
     <RadioButton x:Name="redB" GroupName="x" Style="{StaticResource RBToggleButtonStyle}"/> 
    </Border> 
    </Grid> 
</Page> 

La idea de utilizar ToggleButtons es robado de some other question at SO

+0

@HB: no puede hacer que el estilo del botón de alternar sea común: los datos el disparador está ligado cada vez al botón opuesto (greenB y redB respectivamente) – Vlad

+0

Oh snap, mueve los desencadenantes a un estilo individual y base en el estilo de solo plantilla de control. –

+0

Curiosamente, esto parece funcionar también, inténtalo. –

0

estado trabajando un poco con un IValueConverter debe hacer el truco. Claro que no es simple XAML, pero no está en el código subyacente y puede volver a usarse.

veo algo así como la visibilidad X unión a la visibilidad Y y añadir un convertidor a ella:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    return (Visibility)value == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible; 
} 
1

Por qué no usar el TabControl para esto?

+0

Buena sugerencia, pero no útil en este caso – Karsten

+0

O tal vez usar un TabControl podría ser útil. ¿Es posible mover el botón de tabulación fuera del encabezado? – Karsten

Cuestiones relacionadas