【问题标题】:Grid rows - fill all available space网格行 - 填充所有可用空间
【发布时间】:2011-11-25 10:42:44
【问题描述】:

我想将 WPF 中的两个控件放在一个网格中 - 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 应该能够调整该空间的大小。

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

【问题讨论】:

    标签: wpf


    【解决方案1】:

    我建议您使用MathConverter 之类的方法来根据某些触发器明确设置网格的高度

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

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

    <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>
    

    【讨论】:

      【解决方案2】:

      只需将两行的高度设为*,这意味着它将填满所有可用空间。 并使用 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 的可见性已经到位(如何使用可见性的逻辑)。确保将 GridView 的可见性设置为 Collapsed 而不是 Hidden

      【讨论】:

      • 我将它们设置为折叠并且网格行没有调整大小。我会尝试将 VerticalAlignment 设置为 Stretch。
      • 不幸的是,这不起作用。我正在尝试使用 DataTriggers 设置网格行的高度,但到目前为止没有效果..
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-01
      • 1970-01-01
      • 2012-03-01
      • 2020-02-15
      • 1970-01-01
      相关资源
      最近更新 更多