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

标签 wpf gridsplitter

我正在使用 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/

    相关文章:

    c# - 每个单元格中具有不同 UserControl 的 WPF DataGrid

    wpf - 增加WPF GridSplitter鼠标抓取阈值

    wpf - Gridsplitter 忽略列的最小宽度

    c# - Expander 结合 GridSplitter

    c# - 以编程方式将按钮绑定(bind)到双击命令 wpf

    c# - 文本框 MVVM 数据绑定(bind)

    wpf - 将动画应用到网格列后 GridSplitter 不起作用

    wpf - VS2010 WPF设计器自动将Horizo​​ntalAlignment ="Stretch"添加到gridsplitter

    c# - 如何从 WPF DataGrid 的单元格中读取值?

    c# - WPF C# PreviewDrop/Drop 事件未触发(使用 dragadorner)