【问题标题】:How to set a GridSplitter to a specific initial position?如何将 GridSplitter 设置为特定的初始位置?
【发布时间】:2016-01-26 04:56:24
【问题描述】:

我在我的 WPF 应用程序中使用GridSplitter,并希望将其设置为代码中的特定初始位置。在为关联的RowDefinitionHeight 属性设置特定值时,我被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 调整窗口的两个部分的大小,遵循MinHeight 的值并在窗口边界处停止。调整窗口大小也可以按设计工作:-)

现在我正在尝试从代码隐藏中设置 GridSplitter 的初始位置,如下所示:

    InitializeComponent();

    RowDef1.Height = new GridLength(50, GridUnitType.Pixel);
    Tbl1.DataContext = this.RowDef1;
    Tbl2.DataContext = this.RowDef2;

结果很奇怪:

  • GridSplitter 最初设置为距顶部 50 像素(没关系)
  • 它停在 20px 的上排 MinHeight(也可以)

但是

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

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

我已阅读这篇文章,但答案在我的情况下不起作用: How to set initial height of a GridSplitter 'pane'?

Height="*" 更改为Height="Auto" 也不能解决问题。

【问题讨论】:

    标签: wpf gridsplitter


    【解决方案1】:

    问题在于您将 RowDef1 的高度设置为 50 PIXEL。您要做的是将其设置为 STAR。但是星的价值是多少?

    由于您希望 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*
    };
    

    【讨论】:

      猜你喜欢
      • 2011-08-05
      • 2021-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多