XAML会折叠所有子元素

时间:2013-12-17 15:56:40

标签: wpf xaml

我正在研究WPF Xaml应用程序。该应用程序有各种堆栈面板(行为像图标),我需要根据特定标准更改可见性。

问题: 如何折叠所有子元素(stackpanels)? 我在vb.net的后端逐个崩溃。但更确切地说,找到一个很酷的方法来同时完成所有工作。

4 个答案:

答案 0 :(得分:2)

在这种情况下,您可以有两个选项

  1. 你可以通过样式实现它(如果你的下一个MVVM,那将是行不通的,那就是你的绑定)
  2. 创建coustom控件
  3. 使用Style:

    使用用于显示图像的目标类型

    编写如下样式
        <Window.Resources>
        <Style TargetType="TextBox">
            <Setter Property="Visibility" Value="Collapsed"/>
        </Style>
        </Window.Resources>
         <Grid>
        <StackPanel>
            <TextBox Height="26" Width="200" Name="text1"/>
            <TextBox Height="26" Width="200" Name="text2"/>
            <Button Height="26" Width="200" Click="Button_Click_2" />
        </StackPanel>
        </Grid>
    

    默认情况下,TextBox会折叠,您可以根据后端代码中的搜索将其显示

    自定义控制:

    这只是一个包装器,用于控制您使用以显示图标,但只有一个更改是默认可见性将被折叠。然后,您可以将其显示为任何您想要的

    覆盖隐藏已存在的可见性属性,其默认值为已折叠

答案 1 :(得分:1)

使用IValueConverterBooleanToVisibilityConverter实施方式绑定它们。

如果这还不够好,你将不得不一个接一个地做。也许写一个自定义行为?

答案 2 :(得分:1)

您可以将可见性设置为父级,而不是将其设置为每个控件

例如

   <StackPanel>
        <StackPanel Name="pane1">
            <Button Height="30" Width="200" Content="one" Click="Button_Click" />
        </StackPanel>
        <StackPanel Name="panel2">
            <Button Height="30" Width="200" Content="two" Click="Button_Click_1" />
        </StackPanel>
    </StackPanel>

在后端编写逻辑以设置stackpanel的可见性而不是每个控件

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        pane1.Visibility = Visibility.Collapsed;
        panel2.Visibility = Visibility.Visible;
    }

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        panel2.Visibility = Visibility.Collapsed;
        pane1.Visibility = Visibility.Visible;
    }

如果您的以下mvvm然后绑定到堆栈面板的visibility属性,如下所示

    <StackPanel>
        <StackPanel Visibility="{Binding CanShowPanel1}">
            <Button Height="30" Width="200" Content="one" Click="Button_Click" />
        </StackPanel>
        <StackPanel Visibility="{Binding CanShowPanel2}">
            <Button Height="30" Width="200" Content="two" Click="Button_Click_1" />
        </StackPanel>
    </StackPanel>

答案 3 :(得分:0)

最简单的方法是将IValueConverter与参数一起使用。

  <StackPanel>
        <StackPanel Visibility="{Binding TheQuery,Converter={StaticResource QueryConverter,ConverterParameter="MyFirstStackPanelVisible"}}">
        </StackPanel>
        <StackPanel Visibility="{Binding TheQuery,Converter={StaticResource QueryConverter,ConverterParameter="MySecondStackPanelVisible"}}">
        </StackPanel>
    </StackPanel>


public class QueryConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        switch((string)parameter)
        {
          case "MyFirstStackPanelVisible"
          bool result =CheckQueryCriteriaForFirstStackPanel();
          return Visibility.Visible or Visibility.Collapsed;

          case "MySecondStackPanelVisible"
          bool result =CheckQueryCriteriaForSecondStackPanel();
          return Visibility.Visible or Visibility.Collapsed;
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

当然你不应该为每个案例制作CheckQueryCriteriaFor ...函数。 这种方法保证逻辑在一个地方。