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

Wpf 如果所有子级都已折叠,如何折叠父级内容,wpf,xaml,Wpf,Xaml,如果每个子项都已折叠,我希望显示/折叠面板(Stakpanel、Grid等),如果至少有一个子项再次可见,则将其显示出来 实现这一目标的最佳方式是什么?(转换器、触发器、其他东西?) 谢谢 我做了一个转换器,但当我改变孩子们的可见性时,它不会启动 public class HasChildrenVisibilityConverter : IValueConverter { public object Convert(object value, Type targetType, obje

如果每个子项都已折叠,我希望显示/折叠面板(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
    }
}
public类HasChildrenVisibilityConverter:IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、CultureInfo区域性)
{
Panel parent=作为Panel的值;
foreach(parent.Children.OfType()中的var child)
{
if(child.IsVisible)
返回可见性。可见;
}
返回可见性。折叠;
}
公共对象转换回(对象值、类型targetType、对象参数、CultureInfo区域性)
{
返回值;//没有实现
}
}
这是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
文本2

A
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>

parent.Children
在它的集合中有什么吗?是的,它有那两个文本块,但它没有重新评估如何隐藏/折叠孩子们?没有问题,很高兴它有帮助:)
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;
}