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

Wpf 网格行-填充所有可用空间,wpf,Wpf,我想在WPF中的Grid-GridView和ScheduleView中放置两个控件,一个在GridSplitter的另一个之上,如下所示: <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="4" /> <RowDefinition Height="Auto"/>

我想在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应该能够调整该空间的大小


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

只需将两行的高度指定为
*
,这意味着它将填充所有可用空间。 并使用
触发器
转换器
将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的可见性已经存在(如何使用可见性的逻辑)。请确保将GridView的可见性设置为“折叠”,而不是“隐藏”。

只需将两行的高度设置为
*
,这意味着它将填充所有可用空间。 并使用
触发器
转换器
将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的可见性已经存在(如何使用可见性的逻辑)。请确保将GridView的可见性设置为“折叠”,而不是“隐藏”。

我建议您根据一些触发器执行类似于a的操作,以明确设置网格的高度

例如,如果两个栅格都可见,则将其高度设置为
((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>


我建议做一些类似于a的事情,根据一些触发器显式设置网格的高度

例如,如果两个栅格都可见,则将其高度设置为
((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>


我将它们设置为折叠,网格行不调整大小。我将尝试将垂直对齐设置为“拉伸”。不幸的是,这不起作用。我尝试使用DataTriggers设置网格行的高度,但到目前为止没有效果。我将它们设置为折叠,网格行的大小不会调整。我将尝试将垂直对齐设置为“拉伸”。不幸的是,这不起作用。我尝试使用DataTriggers设置网格行的高度,但到目前为止没有效果。。