网格行 - 填充所有可用空间

时间:2011-11-25 10:42:44

标签: wpf

我想在WPF中将两个控件放在一个Grid中 - GridView和ScheduleView一个在GridSplitter之上,如下所示:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="4" />
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <telerik:RadScheduleView Grid.Row="0" />
    <GridSplitter Grid.Row="1" HorizontalAlignment="Stretch"  Height="4"/>
    <telerik:RadGridView Grid.Row="2"/>
</Grid>

问题在于有三种模式:   - 仅显示GridView   - 仅显示ScheduleView   - 显示GridView和ScheduleView 在每种情况下,我希望可见控件填充所有可用空间。如果显示两个,我希望它们共享它们之间的空间,GridSplitter应该能够调整该空间的大小。

如何在不改变显示模式的情况下明确设置高度的情况下完成此操作?

2 个答案:

答案 0 :(得分:1)

我建议做类似MathConverter的操作,根据一些触发器明确设置Grid的高度

例如,如果两个网格都可见,则将其高度设置为((GridHeight - 4) / 2),而如果只有一个网格可见,则将其设置为网格的完整高度,因为GridSplitter和其他网格都不可见。

这是一个例子。我遗漏了可见性触发器,因为我假设你已经知道如何实现它们。

<Grid x:Name="ParentGrid">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <telerik:RadScheduleView x:Name="MyGridView" Grid.Row="0">
        <telerik:RadScheduleView.Style>
           <Style TargetType="telerik:RadScheduleView">
              <Setter Property="Height" 
                      Value="{Binding ElementName=ParentGrid, 
                                      Path=ActualHeight,
                                      Converter={StaticResource MathConverter},
                                      ConverterParameter=((@VALUE-4)/2)}"/>
                 <Style.Triggers>
                    <DataTrigger Binding="{Binding ElementName=MyScheduleView, Path=IsVisible}" Value="False">
                      <Setter Property="Height" Value="{Binding ElementName=ParentGrid, Path=ActualHeight}"/>
                    </DataTrigger>
                 </Style.Triggers>
            </Style>
       </telerik:RadScheduleView.Style>
    </telerik:RadScheduleView>

    <GridSplitter Grid.Row="1" HorizontalAlignment="Stretch"  Height="4"/>

    <telerik:RadGridView x:Name="MyScheduleView" Grid.Row="2"
        <telerik:RadScheduleView.Style>
           <Style TargetType="telerik:RadScheduleView">
              <Setter Property="Height" 
                      Value="{Binding ElementName=ParentGrid, 
                                      Path=ActualHeight,
                                      Converter={StaticResource MathConverter},
                                      ConverterParameter=((@VALUE-4)/2)}" />
                 <Style.Triggers>
                    <DataTrigger Binding="{Binding ElementName=MyGridView, Path=IsVisible}" Value="False">
                      <Setter Property="Height" Value="{Binding ElementName=ParentGrid, Path=ActualHeight}"/>
                    </DataTrigger>
                 </Style.Triggers>
            </Style>
       </telerik:RadScheduleView.Style>
    </telerik:RadScheduleView>
</Grid>

答案 1 :(得分:0)

简单地将两行的高度设为*,这意味着它将填充所有可用空间。 并使用TriggersConverter将您感觉舒适的GridSplitter与两列的可见性绑定在一起。使用触发器,这将起作用 -

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="4" />
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <telerik:RadScheduleView Grid.Row="0" />
    <GridSplitter Grid.Row="1" HorizontalAlignment="Stretch">
       <GridSplitter.Style>
           <Style TargetType="GridSplitter">
              <Setter Property="Visibility" Value="Visible"/>
                 <Style.Triggers>
                    <DataTrigger Binding="{Binding ElementName=btn1, Path=IsVisible}" Value="False">
                        <Setter Property="Visibility" Value="Collapsed"/>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding ElementName=btn2, Path=IsVisible}" Value="False">
                        <Setter Property="Visibility" Value="Collapsed"/>
                    </DataTrigger>
                 </Style.Triggers>
            </Style>
       </GridSplitter.Style>
    </GridSplitter>
    <telerik:RadGridView Grid.Row="2"/>
</Grid>

我假设您的GridView的可见性已经到位(如何使用可见性的逻辑)。确保为网格视图将可见性设置为Collapsed而不是Hidden