如何将 GridSplitter 设置到特定的初始位置?
How to set a GridSplitter to a specific initial position?
我在我的 WPF 应用程序中使用 GridSplitter
,并希望通过代码将其设置为特定的初始位置。在为关联 RowDefinition
的 Height
属性 设置特定值时,我坚持使用 GridSplitter
的行为。
这是我的例子来说明问题。我添加了 TextBlocks
以显示 RowDefinition.Height
属性的实际值。
XAML代码:
<Grid>
<Grid.RowDefinitions>
<RowDefinition x:Name="RowDef1" Height="*" MinHeight="20"/>
<RowDefinition Height="Auto" />
<RowDefinition x:Name="RowDef2" Height="*" MinHeight="20"/>
</Grid.RowDefinitions>
<DockPanel Grid.Row="0" LastChildFill="True" >
<TextBlock FontSize="16" VerticalAlignment="Top" Text="Upside Height: "/>
<TextBlock x:Name="Tbl1" FontSize="16" Text="{Binding Height}"/>
</DockPanel>
<GridSplitter Grid.Row="1" Height="10" HorizontalAlignment="Stretch" ResizeBehavior="PreviousAndNext" Background="Black" />
<DockPanel Grid.Row="2" LastChildFill="True" >
<TextBlock FontSize="16" VerticalAlignment="Top" Text="Downside Height: "/>
<TextBlock x:Name="Tbl2" FontSize="16" Text="{Binding Height}"/>
</DockPanel>
</Grid>
代码隐藏:
namespace WpfGridSplitterTest
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Tbl1.DataContext = this.RowDef1;
Tbl2.DataContext = this.RowDef2;
}
}
}
结果符合预期。 GridSplitter
调整 window 两部分的大小,服从 MinHeight
值并在 window 边界处停止。调整 window 的大小也能按设计工作:-)
现在我正尝试从代码隐藏中设置 GridSplitter
的初始位置,如下所示:
InitializeComponent();
RowDef1.Height = new GridLength(50, GridUnitType.Pixel);
Tbl1.DataContext = this.RowDef1;
Tbl2.DataContext = this.RowDef2;
结果很奇怪:
GridSplitter
最初设置为距顶部 50 像素(没关系)
- 它停在 20px 的上部
MinHeight
行(也可以)
但是
- 它不再考虑 window 的下边界,也不再考虑下行的
MinHeight
值
ActualHeight
当移动 GridSplitter 时,下一行的值不再更新
我在这里错过了什么?非常感谢任何提示!
我已阅读此 post,但答案不适用于我的情况:
How to set initial height of a GridSplitter 'pane'?
将 Height="*"
更改为 Height="Auto"
也无法解决问题。
问题是您将 RowDef1 的高度设置为 50 PIXEL。您要做的是将其设置为 STAR。但是star值多少呢?
由于您希望 RowDef1 以 50 像素结束,因此您需要计算 space 可用于 RowDef1/2 的像素。以 STAR 为单位将 50 分配给 RowDef1,并将剩余的以 STAR 为单位分配给 RowDef2。
InitializeComponent();
Tbl1.DataContext = this.RowDef1;
Tbl2.DataContext = this.RowDef2;
this.Loaded += (s, e) =>
{
var height = RowDef1.ActualHeight + RowDef2.ActualHeight; // 301 pixels
RowDef1.Height = new GridLength(50, GridUnitType.Star); // 50*
RowDef2.Height = new GridLength(height - 50, GridUnitType.Star); // 251*
};
我在我的 WPF 应用程序中使用 GridSplitter
,并希望通过代码将其设置为特定的初始位置。在为关联 RowDefinition
的 Height
属性 设置特定值时,我坚持使用 GridSplitter
的行为。
这是我的例子来说明问题。我添加了 TextBlocks
以显示 RowDefinition.Height
属性的实际值。
XAML代码:
<Grid>
<Grid.RowDefinitions>
<RowDefinition x:Name="RowDef1" Height="*" MinHeight="20"/>
<RowDefinition Height="Auto" />
<RowDefinition x:Name="RowDef2" Height="*" MinHeight="20"/>
</Grid.RowDefinitions>
<DockPanel Grid.Row="0" LastChildFill="True" >
<TextBlock FontSize="16" VerticalAlignment="Top" Text="Upside Height: "/>
<TextBlock x:Name="Tbl1" FontSize="16" Text="{Binding Height}"/>
</DockPanel>
<GridSplitter Grid.Row="1" Height="10" HorizontalAlignment="Stretch" ResizeBehavior="PreviousAndNext" Background="Black" />
<DockPanel Grid.Row="2" LastChildFill="True" >
<TextBlock FontSize="16" VerticalAlignment="Top" Text="Downside Height: "/>
<TextBlock x:Name="Tbl2" FontSize="16" Text="{Binding Height}"/>
</DockPanel>
</Grid>
代码隐藏:
namespace WpfGridSplitterTest
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Tbl1.DataContext = this.RowDef1;
Tbl2.DataContext = this.RowDef2;
}
}
}
结果符合预期。 GridSplitter
调整 window 两部分的大小,服从 MinHeight
值并在 window 边界处停止。调整 window 的大小也能按设计工作:-)
现在我正尝试从代码隐藏中设置 GridSplitter
的初始位置,如下所示:
InitializeComponent();
RowDef1.Height = new GridLength(50, GridUnitType.Pixel);
Tbl1.DataContext = this.RowDef1;
Tbl2.DataContext = this.RowDef2;
结果很奇怪:
GridSplitter
最初设置为距顶部 50 像素(没关系)- 它停在 20px 的上部
MinHeight
行(也可以)
但是
- 它不再考虑 window 的下边界,也不再考虑下行的
MinHeight
值 ActualHeight
当移动 GridSplitter 时,下一行的值不再更新
我在这里错过了什么?非常感谢任何提示!
我已阅读此 post,但答案不适用于我的情况: How to set initial height of a GridSplitter 'pane'?
将 Height="*"
更改为 Height="Auto"
也无法解决问题。
问题是您将 RowDef1 的高度设置为 50 PIXEL。您要做的是将其设置为 STAR。但是star值多少呢?
由于您希望 RowDef1 以 50 像素结束,因此您需要计算 space 可用于 RowDef1/2 的像素。以 STAR 为单位将 50 分配给 RowDef1,并将剩余的以 STAR 为单位分配给 RowDef2。
InitializeComponent();
Tbl1.DataContext = this.RowDef1;
Tbl2.DataContext = this.RowDef2;
this.Loaded += (s, e) =>
{
var height = RowDef1.ActualHeight + RowDef2.ActualHeight; // 301 pixels
RowDef1.Height = new GridLength(50, GridUnitType.Star); // 50*
RowDef2.Height = new GridLength(height - 50, GridUnitType.Star); // 251*
};