wpf切换可见性折叠只能运行一次

时间:2015-10-07 11:48:59

标签: wpf binding visibility collapse datatrigger

我想要做的是根据复选框切换折叠WPF ui的底部。到目前为止,这大部分都按预期工作在您逐步浏览图像时,您会看到一旦移动网格分割器,折叠就会停止工作。我不明白为什么或如何解决这个问题。

开始申请,显示正确。

Initial opening of the application

切换复选框,Botttom部分按预期消失。

enter image description here

再次切换复选框,然后垂直移动拆分器,一切都按预期显示。

enter image description here

现在最后一次切换复选框,你会注意到顶部没有像之前那样填充应用程序。这就是它破碎的地方!我希望黄色部分像在初始切换中一样填充UI。

enter image description here

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="250" Width="525"
        WindowStartupLocation="CenterScreen">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>

        <CheckBox Name="ToggleVisibility" Margin="10" IsChecked="True" Content="Toggle Bottom Section"></CheckBox>

        <StackPanel Background="#feca00" Grid.Row="1">
            <TextBlock FontSize="20" Foreground="#58290A">Top Section</TextBlock>
        </StackPanel>

        <GridSplitter Grid.Row="2" Height="5" HorizontalAlignment="Stretch">
            <GridSplitter.Style>
                <Style TargetType="GridSplitter">
                    <Setter Property="Visibility" Value="Visible" />
                    <Setter Property="Background" Value="Red" />
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding ElementName=ToggleVisibility, Path=IsChecked}" Value="False">
                            <Setter Property="Visibility" Value="Collapsed"></Setter>
                            <Setter Property="Background" Value="Red"></Setter>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </GridSplitter.Style>
        </GridSplitter>

        <StackPanel Grid.Row="3" Background="LightBlue">
            <StackPanel.Style>
                <Style TargetType="StackPanel">
                    <Setter Property="Visibility" Value="Visible" />
                    <Setter Property="Background" Value="Red" />
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding ElementName=ToggleVisibility, Path=IsChecked}" Value="False">
                            <Setter Property="Visibility" Value="Collapsed"></Setter>
                            <Setter Property="Background" Value="Red"></Setter>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </StackPanel.Style>

            <TextBlock FontSize="20" Foreground="black">Bottom Section</TextBlock>
        </StackPanel>

    </Grid>
</Window>

2 个答案:

答案 0 :(得分:2)

发生这种情况的原因是,当您移动拆分器时,它会覆盖最后Height的{​​{1}}属性,并将其设置为{{的相应行中显示的任何内容的实际高度。 1}} - 您案例中的第二个RowDefinition(底部)。它不再设置为Grid,因此即使您折叠底部,该行也会保持其高度 - 因此也是空的空间。

我有时会发现自己处于类似情况,而我所做的就是使用StackPanel附加属性跨越控件,我希望占用所有空间。在您的情况下,您可以通过将以下样式应用于您的第一个Auto(顶部)来实现它:

Grid.RowSpan

然后StackPanel将跨越<Style TargetType="{x:Type StackPanel}"> <Style.Triggers> <DataTrigger Binding="{Binding IsChecked, ElementName=ToggleVisibility}" Value="False"> <Setter Property="Grid.RowSpan" Value="3" /> </DataTrigger> </Style.Triggers> </Style> 的底部,而不管以下哪些行&#39;高度。

修改

由于您对跨越控件不满意,这是另一个解决方案:从StackPanel类派生并连接您自己的可见性逻辑。这是一个例子:

Grid

然后在网格中使用该类而不是RowDefinition,并将public class MyRowDefinition : RowDefinition { static MyRowDefinition() { HeightProperty.OverrideMetadata( typeof(MyRowDefinition), new FrameworkPropertyMetadata { CoerceValueCallback = CoerceHeightPropertyValue }); } private static object CoerceHeightPropertyValue(DependencyObject d, object baseValue) { if (Equals(d.GetValue(IsVisibleProperty), false)) return new GridLength(0d); else return baseValue; } public bool IsVisible { get { return (bool)GetValue(IsVisibleProperty); } set { SetValue(IsVisibleProperty, value); } } public static readonly DependencyProperty IsVisibleProperty = DependencyProperty.Register( "IsVisible", typeof(bool), typeof(MyRowDefinition), new FrameworkPropertyMetadata { DefaultValue = true, PropertyChangedCallback = IsVisiblePropertyChanged }); private static void IsVisiblePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { d.InvalidateProperty(RowDefinition.HeightProperty); } } 属性绑定到复选框的检查状态。

答案 1 :(得分:0)

看起来UIActionSheet$arr = array(); while ($r = $result->fetch_object()){ array_push($arr, array ( "client_number" => $r ->client_number, "client_name" => $r->client_name, "service" => unserialize($r ->service), "size" => unserialize($r ->size), "volume" => unserialize($r ->volume), "deliver_point" => unserialize($r ->deliver_point), "port_orgin" => unserialize($r ->port_orgin)) ); } echo json_encode($arr); 已合并,但StackPanel 3未合并。我不确定自动高度为什么不关闭它。编辑:我看到@ Grx70解释了它。

这:Hide grid row in WPF 建议将所有子项设置为GridSplitter应该可以工作,但您可以选择将Grid.Row 3的高度设置为0。

我认为高度=&#34; 5&#34;您的Grid.Row也可能会占用空间,优先于样式设置(它会折叠并从中获得高度0,但从高度获得高度5 =&#34; 5&#34;,其中获胜(但它仍然是不可见的)。但这样的风格可能会更好:

Visibility.Collapsed