我想显示/折叠一个面板(Stakpanel,Grid等),如果每个孩子都折叠了,如果孩子再次可见,至少有一个孩子可以显示它。
这是实现这一目标的最佳途径? (转换器,触发器,其他东西?) 谢谢!
我做了一个转换器但是当我改变孩子们的可见性时它不会发射
public class HasChildrenVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
Panel parent = value as Panel;
foreach (var child in parent.Children.OfType<UIElement>())
{
if (child.IsVisible)
return Visibility.Visible;
}
return Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return value;//no implementado
}
}
这是xaml示例
<Window.Resources>
<local:HasChildrenVisibilityConverter x:Key="converter" />
</Window.Resources>
<StackPanel Visibility="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource converter}}">
<TextBlock x:Name="text1"> Text 1</TextBlock>
<TextBlock x:Name="text2"> Text 2</TextBlock>
</StackPanel>
答案 0 :(得分:1)
MultiDataTrigger
在这里可以很好地运作。以下是StackPanel
和几个TextBlock
的简单示例
我在样式中声明触发器并将该样式应用于相关的StackPanel
MainWindow.xaml
<Window.Resources>
<Style x:Key="ShowHideStyle" TargetType="StackPanel">
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding ElementName=txtName, Path=Visibility}" Value="Collapsed" />
<Condition Binding="{Binding ElementName=txtDescription, Path=Visibility}" Value="Collapsed" />
</MultiDataTrigger.Conditions>
<Setter Property="Visibility" Value="Collapsed"/>
</MultiDataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding ElementName=txtName, Path=Visibility}" Value="Visible" />
<Condition Binding="{Binding ElementName=txtDescription, Path=Visibility}" Value="Visible" />
</MultiDataTrigger.Conditions>
<Setter Property="Visibility" Value="Visible"/>
</MultiDataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<StackPanel>
<StackPanel Style="{StaticResource ShowHideStyle}" Height="300" Width="300" Background="Red">
<TextBlock x:Name="txtName" Text="name" />
<TextBlock x:Name="txtDescription" Text="description" />
</StackPanel>
<Button x:Name="btnHide" Width="100" Height="30" Content="hide" Click="btnHide_Click"/>
<Button x:Name="btnShow" Width="100" Height="30" Content="show" Click="btnShow_Click"/>
</StackPanel>
Mainwindow.xaml.cs 我只需添加按钮单击事件来隐藏/显示子元素
private void btnHide_Click(object sender, RoutedEventArgs e)
{
txtDescription.Visibility = System.Windows.Visibility.Collapsed;
txtName.Visibility = System.Windows.Visibility.Collapsed;
}
private void btnShow_Click(object sender, RoutedEventArgs e)
{
txtDescription.Visibility = System.Windows.Visibility.Visible;
txtName.Visibility = System.Windows.Visibility.Visible;
}