这就是我所拥有的
<Grid.RowDefinitions>
<RowDefinition Height="Auto" MinHeight="25"/>
<RowDefinition Height="Auto"/>
<RowDefinition />
</Grid.RowDefinitions>
<Expander IsExpanded="False" Grid.Row="0" >
<DataGrid name="FirstGrid" />
</Expander>
<GridSplitter Grid.Row="1" HorizontalAlignment="Stretch" Height="5" />
<DataGrid Grid.Row="2" name="SecondGrid" />
当我单击扩展器上的展开按钮时,它正确地将第0行扩展为DataGrid FirstGrid的大小,并且它也正确地折叠了该行。但是,如果我展开FirstGrid,然后通过向上或向下拖动GridSplitter然后按下展开器上的折叠按钮来手动调整该行的大小,则不起作用。会发生什么是FirstGrid崩溃但是FirstGrid所在的行本身没有。有什么建议吗?
由于
答案 0 :(得分:2)
Rob是对的,一旦你移动了网格探测器,第一行的高度将不再是自动,所以它不会响应扩展器大小的变化 为了使其工作,您需要向扩展器添加一个行为,该行为将侦听expandder.expanded和collapsed事件并将网格行更新为再次自动。像这样的东西:
public class GridColumnWidthReseterBehaviour : Behavior<Expander>
{
private Grid _parentGrid;
public int TargetGridRowIndex { get; set; }
protected override void OnAttached()
{
AssociatedObject.Expanded += AssociatedObject_Expanded;
AssociatedObject.Collapsed += AssociatedObject_Collapsed;
FindParentGrid();
}
private void FindParentGrid()
{
DependencyObject parent = LogicalTreeHelper.GetParent(AssociatedObject);
while (parent != null)
{
if (parent is Grid)
{
_parentGrid = parent as Grid;
return;
}
parent = LogicalTreeHelper.GetParent(AssociatedObject);
}
}
void AssociatedObject_Collapsed(object sender, System.Windows.RoutedEventArgs e)
{
_parentGrid.RowDefinitions[TargetGridRowIndex].Height= GridLength.Auto;
}
void AssociatedObject_Expanded(object sender, System.Windows.RoutedEventArgs e)
{
_parentGrid.RowDefinitions[TargetGridRowIndex].Height= GridLength.Auto;
}
}
你这样使用它:
<Expander ...>
<interactivity:Interaction.Behaviors>
<behaviors:GridColumnWidthReseterBehaviour TargetGridRowIndex="0"></behaviors:GridColumnWidthReseterBehaviour>
</interactivity:Interaction.Behaviors>
...
答案 1 :(得分:0)
一旦你移动了网格探测器,第一行的高度将不再是自动,而是一个特定值,如70.之后,如果该行中的某个孩子改变其高度并不重要。
将分离器与某个自动调整大小的子/行组合起来非常困难;你可以看看Microsoft Outlook中的侧扩展器;我怀疑这就是你想要的。如果是这样,您不应该使用扩展器,因为常规扩展器包含StackPanel,因此其子节点始终在扩展方向上自动调整大小。我不确定你想要什么,但我认为选择自定义控制是你最好的选择。