我正在尝试将列和网格分割器添加到网格中,但无法获得确切的行为 在用户指定他想要显示垂直分割器的位置之后:
// Get current Col0 width, size new col and existing Col0
double col0Width = LayoutRoot.ColumnDefinitions[0].ActualWidth;
double newCol0Width = col0Width - 5 - pt.X;
LayoutRoot.ColumnDefinitions[0].Width = new GridLength(newCol0Width);
// New Column 0
var c = new ColumnDefinition();
c.Width = new GridLength(pt.X);
LayoutRoot.ColumnDefinitions.Insert(0, c);// Attach GridSplitter to left edge of existing first column
var gss = new GridSplitter();
gss.Background = new SolidColorBrush(Colors.DarkSlateBlue);
gss.Width = 5; gss.Cursor = Cursors.ScrollWE;
gss.ResizeBehavior = GridResizeBehavior.BasedOnAlignment;
gss.HorizontalAlignment = HorizontalAlignment.Left;
LayoutRoot.Children.Add(gss);
// Add to current left-most colunn
Grid.SetColumn(gss, 0);
// Create new column, insert
// New Column 0
var c = new ColumnDefinition();
c.Width = new GridLength(pt.X);
LayoutRoot.ColumnDefinitions.Insert(0, c);
// Move existing content from Col 0 to new Col 1.
我可以重复这个并创建任意数量的垂直分割器。
所需的调整大小行为:移动拆分器仅调整immed列的大小。在分离器的左侧和右侧。
当前调整大小的行为:移动拆分器将拆分器右侧的所有内容视为一个对象,将列扩展或缩小到拆分器的左侧,同时将所有内容移动到右侧。也就是说,如果有3列,则移动最左侧的分离器似乎将第2列向右推并缩小第3列,而不调整第2列的大小。
(我希望我能够清楚地解释清楚。)
我已经尝试将GridSplitters放在他们自己的列中,并尝试了各种GridResizeBehaviors,但没有找到正确的组合。
任何提示都将不胜感激....
一个相关的问题:在GridSplitter的OnDragDelta的事件处理程序中,有没有办法阻止拆分器在某个方向上进一步移动?我想阻止它们将最右边的列缩小到一定宽度以下,同时允许它们将分离器向后移动到左边。
感谢。
答案 0 :(得分:0)
正如我的评论所示,看起来列的大小必须为'*' 因此,在添加新的色谱柱和分离器之后,我修正了这样的宽度(在解决方案时首先进行了笨拙的切割):
// Get all col widths, set appropriate '*' sizes.
foreach (ColumnDefinition col in LayoutRoot.ColumnDefinitions)
{
colWidths.Add(col.Width);
total += col.Width.Value;
Debug.WriteLine($" Width : {col.Width}");
}
Debug.WriteLine($"{total}");
for (int i = 0; i < LayoutRoot.ColumnDefinitions.Count; i++)
{
double d = colWidths[i].Value;
double ratio = d / total;
int ii = (int) (ratio * 100);
LayoutRoot.ColumnDefinitions[i].Width = new GridLength(ii, GridUnitType.Star);
}