WPF Expander - 当 GridSplitter 用于手动调整行大小时,行未正确折叠
WPF Expander - when GridSplitter used to manually resize row, row does not properly collapse
这就是我的
<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 所在的行本身没有折叠。有什么建议吗?
谢谢
一旦你移动gridsplitter,第一行的高度就不再是Auto,而是一个特定的值,比如70。之后那行有没有child就没关系了改变它的高度。
将分离器与一些 auto-sized child/row 结合起来非常困难;您可以查看 Microsoft Outlook 中的侧边扩展器;我怀疑这就是你想要的。如果是这样,您不应该使用扩展器,因为常规扩展器包含 StackPanel,所以它的 children 在扩展方向上总是 auto-sizing。我不确定您想要什么,但我认为使用自定义控件是您的最佳选择。
Rob说得对,一旦你移动了gridsplitter,第一行的Height就不再是Auto了,所以它不会响应expander尺寸的变化
为了让它工作,您需要向扩展器添加一个行为,它将监听 expander.expanded 和折叠事件并将网格行再次更新为自动。像这样:
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>
...
这就是我的
<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 所在的行本身没有折叠。有什么建议吗?
谢谢
一旦你移动gridsplitter,第一行的高度就不再是Auto,而是一个特定的值,比如70。之后那行有没有child就没关系了改变它的高度。
将分离器与一些 auto-sized child/row 结合起来非常困难;您可以查看 Microsoft Outlook 中的侧边扩展器;我怀疑这就是你想要的。如果是这样,您不应该使用扩展器,因为常规扩展器包含 StackPanel,所以它的 children 在扩展方向上总是 auto-sizing。我不确定您想要什么,但我认为使用自定义控件是您的最佳选择。
Rob说得对,一旦你移动了gridsplitter,第一行的Height就不再是Auto了,所以它不会响应expander尺寸的变化 为了让它工作,您需要向扩展器添加一个行为,它将监听 expander.expanded 和折叠事件并将网格行再次更新为自动。像这样:
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>
...