我正在使用 GridSplitter
在我的 WPF 应用程序中,并希望将其设置为代码中的特定初始位置。我被 GridSplitter
的行为困住了将特定值设置为 Height
时关联的属性 RowDefinition
.
这是我的示例来说明问题。我已添加 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
调整窗口的两个部分的大小,遵守 MinHeight
值并在窗口边界处停止。调整窗口大小也按设计工作:-)现在我正在尝试为
GridSplitter
设置初始位置从代码隐藏是这样的: InitializeComponent();
RowDef1.Height = new GridLength(50, GridUnitType.Pixel);
Tbl1.DataContext = this.RowDef1;
Tbl2.DataContext = this.RowDef2;
结果很奇怪:
GridSplitter
最初设置为距顶部 50 像素(很好)MinHeight
20px(也可以)但
MinHeight
下一行的值 ActualHeight
当 GridSplitter 移动时,下一行的值不再更新 我在这里缺少什么?任何提示都非常感谢!
我已经阅读了这篇文章,但答案在我的情况下不起作用:
How to set initial height of a GridSplitter 'pane'?
换
Height="*"
至 Height="Auto"
也没有解决问题。
最佳答案
问题是您将 RowDef1 的高度设置为 50 像素 .您要做的是将其设置为星 .但是明星有什么值(value)呢?
由于您希望 RowDef1 最终为 50 像素,因此您需要以像素为单位计算 RowDef1/2 可用的空间。将 50 以 STAR 单位分配给 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 设置为特定的初始位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35000893/