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?
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?
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
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.
Está subestimando XAML. –
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.
¿Está finalmente incorporado? – Snowbear
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 –
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
@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
Oh snap, mueve los desencadenantes a un estilo individual y base en el estilo de solo plantilla de control. –
Curiosamente, esto parece funcionar también, inténtalo. –
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;
}
El botón en el panel X debe hacer que el panel X * en * sea visible, ¿verdad? – Vlad
@Vlad: es verdad – Karsten