如何显示与控件单击的不同网格?

时间:2016-05-17 13:46:27

标签: wpf xaml

对于误导性的标题,我会尽力解释一下,假设我遇到这种情况:

<Window x:Class="Test.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:Test"
    mc:Ignorable="d"
    Title="Window1" Height="300" Width="300">
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
    </Grid.RowDefinitions>

    <Grid Grid.Column="0" Grid.Row="0">
        <TabControl>
            <TabItem Header="1" />
            <TabItem Header="2" />
        </TabControl>
    </Grid>

    <Grid Grid.Column="0" Grid.Row="1">
        <StackPanel Visibility="Hidden">
            <Button Content="1"/>
        </StackPanel>
        <StackPanel Visibility="Visible">
            <Button Content="2"/>
        </StackPanel>
    </Grid>
</Grid>
</Window>

现在我的目标是:当用户使用TabItem点击header = 1时,应显示带有按钮StackPanel的{​​{1}},以及当用户点击{时{1}},应显示带content = 1的按钮。

实际上我知道如何在代码(c#)后面执行此操作,但是只能在wpf中管理它?

2 个答案:

答案 0 :(得分:1)

有多种选择。

给定示例中最快和最脏的是触发Header的所选项目TabControl

<Grid Grid.Column="0" Grid.Row="0">
    <TabControl Name="tc">
        <TabItem Header="1" />
        <TabItem Header="2" />
    </TabControl>
</Grid>

<Grid Grid.Column="0" Grid.Row="1">
    <Button Content="1">
        <Button.Style>
            <Style TargetType="Button">
                <Setter Property="Visibility" Value="Collapsed"/>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ElementName=tc, Path=SelectedItem.Header}"
                                 Value="1">
                        <Setter Property="Visibility" Value="Visible"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
    </Button>
    <Button Content="2">
        <Button.Style>
            <Style TargetType="Button">
                <Setter Property="Visibility" Value="Collapsed"/>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ElementName=tc, Path=SelectedItem.Header}"
                                 Value="2">
                        <Setter Property="Visibility" Value="Visible"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
    </Button>
</Grid>

(由于优先权,默认可见性必须在Setter。)

更清洁/更模块化的解决方案是拥有一个支持视图模型,该模型封装按钮逻辑和外观,然后将按钮部分的数据绑定到所选项目的按钮视图模型。然后,该按钮将通过data templating创建。

答案 1 :(得分:-1)

您可以简单地将控件命名为:

<Stackpanel x:Name="spCon1" ../>

然后只需触发TabControl上的事件,比如选择改变....