如何将GridSplitter设置为特定的初始位置?

时间:2016-01-25 19:39:21

标签: wpf gridsplitter

我在我的WPF应用程序中使用了GridSplitter,并希望将其设置为代码中的特定初始位置。在为关联的GridSplitter的{​​{1}}属性设置特定值时,我会遇到Height的行为。

这是我举例说明这个问题。我添加了RowDefinition以显示TextBlocks属性的实际值。

XAML代码:

RowDefinition.Height

代码隐藏:

  <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; 最初设置为从顶部50 px(很好)
  • 它停在20px的上行GridSplitter(也没关系)

  • 它不再尊重窗口的下边界,也不再尊重下排的MinHeight
  • 移动GridSplitter时,
  • MinHeight下行的值不再更新

我在这里缺少什么?任何提示都非常感谢!

我已阅读此帖,但答案在我的案例中不起作用: How to set initial height of a GridSplitter 'pane'?

ActualHeight更改为Height="*"也无法解决问题。

1 个答案:

答案 0 :(得分:7)

问题是你将RowDef1的高度设置为50 PIXEL 。您想要做的是将其设置为 STAR 。但是明星的价值是什么?

由于您希望RowDef1以50像素结束,因此您需要以像素为单位计算RowDef1 / 2的可用空间。以STAR为单位为RowDef1分配50,并以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*
};