2011-06-08 86 views
6

我有兩個面板,只有一個應該在同一時間可見。我通過點擊每個面板上的一個按鈕來改變它們之間的關係。WPF切換面板的可見性

是否有一個很好的方式來做到這一點在xaml沒有codebehind或viewmodel?

+0

上面板X按鈕應使面板X *在*可見,對不對? – Vlad 2011-06-08 12:36:59

+0

@Vlad:那是真的 – Karsten 2011-06-08 13:40:32

回答

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

我不這麼認爲。您需要使用視圖模型或代碼隱藏。對DataTrigger使用Style,並將visible屬性的值綁定到viewmodel中的屬性,避免使用代碼隱藏。

+1

您低估了XAML。 – 2011-06-08 15:24:22

1

如果您使用了ToggleButtons,那麼您可以將Panel 1的可見性綁定到Button 2的IsChecked狀態,並將Panel 2的可見性綁定到Button 1的IsChecked狀態。使它們成爲TwoWay綁定並使用內置BooleanToVisibility轉換器。

+0

終於內置了嗎? – Snowbear 2011-06-08 13:30:51

+0

它一直都是內置的。 WPF是在.NET 3.0中引入的,因此是BooleanToVisibilityConverter。 http://msdn.microsoft.com/en-us/library/system.windows.controls.booleantovisibilityconverter%28v=VS.85%29.aspx – 2011-06-08 17:29:27

3

這實際上是可能的,但非常棘手。

我的例子沒有任何代碼隱藏,實際上沒有任何值轉換器。

下面是代碼:(現在的簡化版本,由於@HB的想法)

<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

+0

@ HB:你不能使切換按鈕的樣式通用:數據觸發器每次綁定到相反的按鈕(分別爲greenB和redB) – Vlad 2011-06-08 16:37:12

+0

哦,將觸發器移動到單獨的樣式中,並將其基於僅限控制模板的樣式。 – 2011-06-08 16:44:43

+0

有趣的是,這似乎也可以工作,嘗試一下。 – 2011-06-08 16:45:38

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

爲什麼不使用的TabControl這個?

+0

不錯的建議,但對這種情況不適用 – Karsten 2011-06-09 07:57:53

+0

或者使用TabControl可能會有用。是否可以將標籤按鈕移動到標題之外? – Karsten 2011-06-09 11:00:21