我想要做的是根据复选框切换折叠WPF ui的底部。到目前为止,这大部分都按预期工作在您逐步浏览图像时,您会看到一旦移动网格分割器,折叠就会停止工作。我不明白为什么或如何解决这个问题。
开始申请,显示正确。
切换复选框,Botttom部分按预期消失。
再次切换复选框,然后垂直移动拆分器,一切都按预期显示。
现在最后一次切换复选框,你会注意到顶部没有像之前那样填充应用程序。这就是它破碎的地方!我希望黄色部分像在初始切换中一样填充UI。
<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>
答案 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