我有兩個面板,只有一個應該在同一時間可見。我通過點擊每個面板上的一個按鈕來改變它們之間的關係。WPF切換面板的可見性
是否有一個很好的方式來做到這一點在xaml沒有codebehind或viewmodel?
我有兩個面板,只有一個應該在同一時間可見。我通過點擊每個面板上的一個按鈕來改變它們之間的關係。WPF切換面板的可見性
是否有一個很好的方式來做到這一點在xaml沒有codebehind或viewmodel?
使用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
我不這麼認爲。您需要使用視圖模型或代碼隱藏。對DataTrigger使用Style,並將visible屬性的值綁定到viewmodel中的屬性,避免使用代碼隱藏。
您低估了XAML。 – 2011-06-08 15:24:22
如果您使用了ToggleButtons,那麼您可以將Panel 1的可見性綁定到Button 2的IsChecked狀態,並將Panel 2的可見性綁定到Button 1的IsChecked狀態。使它們成爲TwoWay綁定並使用內置BooleanToVisibility轉換器。
終於內置了嗎? – Snowbear 2011-06-08 13:30:51
它一直都是內置的。 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
這實際上是可能的,但非常棘手。
我的例子沒有任何代碼隱藏,實際上沒有任何值轉換器。
下面是代碼:(現在的簡化版本,由於@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
@ HB:你不能使切換按鈕的樣式通用:數據觸發器每次綁定到相反的按鈕(分別爲greenB和redB) – Vlad 2011-06-08 16:37:12
哦,將觸發器移動到單獨的樣式中,並將其基於僅限控制模板的樣式。 – 2011-06-08 16:44:43
有趣的是,這似乎也可以工作,嘗試一下。 – 2011-06-08 16:45:38
被盜一點工作與IValueConverter
應該做的訣竅。確定這不是普通的舊XAML,但它不在代碼隱藏中,可以重用。
我看到類似X的可視性結合爲Y的知名度和轉換器添加到它:
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return (Visibility)value == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible;
}
上面板X按鈕應使面板X *在*可見,對不對? – Vlad 2011-06-08 12:36:59
@Vlad:那是真的 – Karsten 2011-06-08 13:40:32