WPF切换面板可见性

时间:2011-06-08 12:31:53

标签: c# wpf xaml panel visibility

我有两个面板,只有一个面板可以同时显示。我通过单击每个面板上的一个按钮在它们之间进行切换。

在没有codebehind或viewmodel的情况下,有没有一种很好的方法可以在xaml中执行此操作?

6 个答案:

答案 0 :(得分:3)

这实际上是可能的,但非常棘手。

我的示例没有任何代码隐藏,实际上没有任何值转换器。

以下是代码:(现在简化版本,感谢@ H.B。的想法)

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

使用ToggleButtons的想法是从some other question at SO

中窃取的

答案 1 :(得分:2)

使用tabcontrol的建议很好。我找到了一些代码,它们将TabControl的样式设置为仅显示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

答案 2 :(得分:1)

如果您使用了ToggleButtons,那么您可以将Panel 1的可见性绑定到Button 2的IsChecked状态,并将Panel 2的可见性绑定到Button 1的IsChecked状态。使它们成为TwoWay绑定并使用内置的BooleanToVisibility转换器。

答案 3 :(得分:1)

为什么不使用TabControl呢?

答案 4 :(得分:0)

使用IValueConverter做一些小事可以解决问题。当然,它不是简单的旧XAML,但它不在代码隐藏中,可以重用。

我看到类似于将X可见性绑定到Y可见性并向其添加转换器的内容:

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

答案 5 :(得分:-1)

我不这么认为。您需要使用viewmodel或codebehind。将Style与DataTrigger一起使用,并将visibility属性的值绑定到viewmodel中的属性,避免使用代码隐藏。