Wpf 移动GridSplitter后使用扩展器调整网格大小不工作
背景 我试图创建一个控件,它的顶部有一个文件资源管理器,底部有一个Wpf 移动GridSplitter后使用扩展器调整网格大小不工作,wpf,xaml,expander,gridsplitter,Wpf,Xaml,Expander,Gridsplitter,背景 我试图创建一个控件,它的顶部有一个文件资源管理器,底部有一个GridSplitter分隔的TreeView。用户可以更改文件资源管理器的大小,但不能超过最小值。当扩展器折叠时,树状视图将占据整个房间。当扩展器展开时,它会恢复到折叠前的大小 示例 我试着用post做一个有效的例子 当我折叠并展开GridSplitter时,首先调整大小是有效的 问题1 移动GridSplitter后,折叠后的大小调整不再起作用。 问题2 我可以在扩展器行的行定义中设置150的最小高度之外调整大小。
GridSplitter
分隔的TreeView
。用户可以更改文件资源管理器的大小,但不能超过最小值。当扩展器
折叠时,树状视图
将占据整个房间。当扩展器
展开时,它会恢复到折叠前的大小
示例
我试着用post做一个有效的例子
当我折叠并展开GridSplitter
时,首先调整大小是有效的
问题1
移动GridSplitter
后,折叠后的大小调整不再起作用。
问题2
我可以在扩展器
行的行定义
中设置150的最小高度
之外调整大小。
如何解决这些问题?您当前的XAML无法工作有几个原因
那真是太美了!非常感谢你!我将深入了解它的工作原理:)
<Grid Margin="3">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition x:Name="ExpanderRow">
<RowDefinition.Style>
<Style TargetType="{x:Type RowDefinition}">
<Setter Property="MinHeight" Value="150" />
<Style.Triggers>
<DataTrigger
Binding="{Binding ElementName=MyExpander, Path=IsExpanded}"
Value="False">
<Setter Property="MinHeight" Value="40" />
</DataTrigger>
</Style.Triggers>
</Style>
</RowDefinition.Style>
</RowDefinition>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Border
Grid.Row="0"
Grid.RowSpan="2"
BorderBrush="Red"
BorderThickness="3" />
<Button
Grid.Row="0"
Margin="6"
HorizontalAlignment="Stretch"
Content="Button 1" />
<Expander x:Name="MyExpander"
Grid.Row="1"
Margin="6"
local:ExpanderRowHeightBehavior.IsEnabled="True"
local:ExpanderRowHeightBehavior.TargetRow="{Binding ElementName=ExpanderRow}"
IsExpanded="True">
<Border
BorderBrush="Blue"
BorderThickness="3" />
</Expander>
<GridSplitter
Grid.Row="2"
Height="3"
Margin="3,0,3,0"
HorizontalAlignment="Stretch"
VerticalAlignment="Center" />
<Border
Grid.Row="3"
BorderBrush="Green"
BorderThickness="3" />
</Grid>
using System.Windows;
using System.Windows.Controls;
namespace SO
{
public static class ExpanderRowHeightBehavior
{
#region IsEnabled (Attached Property)
public static readonly DependencyProperty IsEnabledProperty =
DependencyProperty.RegisterAttached(
"IsEnabled",
typeof(bool),
typeof(ExpanderRowHeightBehavior),
new PropertyMetadata(false, OnIsEnabledChanged));
public static bool GetIsEnabled(DependencyObject obj)
{
return (bool)obj.GetValue(IsEnabledProperty);
}
public static void SetIsEnabled(DependencyObject obj, bool value)
{
obj.SetValue(IsEnabledProperty, value);
}
private static void OnIsEnabledChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (!(d is Expander expander)) return;
expander.Collapsed += OnCollapsed;
expander.Expanded += OnExpanded;
}
#endregion
#region TargetRow (Attached Property)
public static readonly DependencyProperty TargetRowProperty =
DependencyProperty.RegisterAttached(
"TargetRow",
typeof(RowDefinition),
typeof(ExpanderRowHeightBehavior),
new PropertyMetadata(null));
public static RowDefinition GetTargetRow(DependencyObject obj)
{
return (RowDefinition)obj.GetValue(TargetRowProperty);
}
public static void SetTargetRow(DependencyObject obj, RowDefinition value)
{
obj.SetValue(TargetRowProperty, value);
}
#endregion
#region TargetRowPrevHeight (Attached Property)
public static readonly DependencyProperty TargetRowPrevHeightProperty =
DependencyProperty.RegisterAttached(
"TargetRowPrevHeight",
typeof(GridLength),
typeof(ExpanderRowHeightBehavior),
new PropertyMetadata(GridLength.Auto));
public static GridLength GetTargetRowPrevHeight(DependencyObject obj)
{
return (GridLength)obj.GetValue(TargetRowPrevHeightProperty);
}
public static void SetTargetRowPrevHeight(DependencyObject obj, GridLength value)
{
obj.SetValue(TargetRowPrevHeightProperty, value);
}
#endregion
private static void OnCollapsed(object sender, RoutedEventArgs e)
{
if (!(sender is Expander expander)) return;
var targetRow = GetTargetRow(expander);
if (targetRow == null) return;
SetTargetRowPrevHeight(expander, targetRow.Height);
targetRow.Height = GridLength.Auto;
}
private static void OnExpanded(object sender, RoutedEventArgs e)
{
if (!(sender is Expander expander)) return;
var targetRow = GetTargetRow(expander);
if (targetRow == null) return;
var targetRowPrevHeight = GetTargetRowPrevHeight(expander);
targetRow.Height = targetRowPrevHeight;
}
}
}