对于误导性的标题,我会尽力解释一下,假设我遇到这种情况:
<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中管理它?
答案 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上的事件,比如选择改变....