如果所有子项都已折叠,如何折叠父内容

时间:2015-03-17 08:15:21

标签: wpf xaml

我想显示/折叠一个面板(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>

1 个答案:

答案 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;
}