我想在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应该能够调整该空间的大小。
如何在不改变显示模式的情况下明确设置高度的情况下完成此操作?
答案 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)
简单地将两行的高度设为*
,这意味着它将填充所有可用空间。
并使用Triggers
或Converter
将您感觉舒适的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
。