2016-02-03 3 views
0

Я пытаюсь добавить столбцы и сетки в сетку, но не могу получить точное поведение.
После того как пользователь указывает, где он хочет вертикальный разделитель появляться:Поведение GridSplitter

   // 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. 

Я могу повторить это и создать произвольное количество вертикальных разделителей.

Требуемое изменение размера: перемещение сплиттера мгновенно изменяет размеры столбцов. слева и справа от сплиттера.
Текущее изменение размера: перемещение сплиттера рассматривает все, что находится справа от сплиттера, как один объект, расширяя или уменьшая столбец слева от разделителя, перемещая все вправо. То есть, если есть 3 столбца, перемещение самого левого сплиттера появляется, чтобы нажать col 2 вправо и сжимать col 3, без изменения размера col.
(Надеюсь, я объяснил это достаточно ясно.)
Я пробовал поместив GridSplitters в свои собственные столбцы и попробовал различные GridResizeBehaviors, но не нашел правильной комбинации.

Любые советы будут оценены ....

И связанный с этим вопрос: В качестве обработчика событий для OnDragDelta GridSplitter, является ли способ, чтобы остановить сплиттер от путешествия дальше в определенном направлении? Я бы хотел, чтобы они не сокращали правый столбец ниже определенной ширины, позволяя им перемещать разделитель назад влево.
Спасибо.

+0

Я думаю, что вопрос назначение ширины столбцов. Я хочу создать новый столбец w/i пределы текущего столбца 0. Однако, чтобы заставить gridsplitters работать по желанию, кажется, мне придется вычислить все новые ширины столбцов и установить их в соответствующие «*», размеры. – Number8

ответ

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); 
     } 
Смежные вопросы