2015-05-31 3 views
3

Я пытаюсь динамически добавлять флажки в единую таблицу в wpf. Но похоже, что сетка не выделяет их достаточно места, и поэтому все они лежат друг над другом. Это, как я добавить их в код:Добавление checkBoxes в UniformGrid

foreach (string folder in subfolders) 
{ 
    PathCheckBox chk = new PathCheckBox(); 
    chk.Content = new DirectoryInfo(folder).Name; 
    chk.FullPath = folder; 
    chk.HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch; 
    chk.VerticalAlignment = System.Windows.VerticalAlignment.Stretch;   

    unfiformGridSubfolders.Children.Add(chk); 
} 

Это как моя XAML выглядит (я поместил UniformGrid в ScrollViewer)

<ScrollViewer Grid.Column="1" Grid.RowSpan="3"> 
    <UniformGrid x:Name="unfiformGridSubfolders" Grid.Column="1" Grid.Row="0" Grid.RowSpan="3" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/> 
</ScrollViewer> 

И вот как это выглядит в программе:

enter image description here

Я просто хочу, чтобы каждый CheckBox имеет достаточно места, так что содержимое может быть полностью прочитать.

+0

Чего вы хотите достичь? Что делать, если одна папка занимает всю ширину? Вы хотите, чтобы все заняло всю ширину? UniformGrid, делает каждую ячейку однородной, то есть все ячейки ** идентичны ** размер. –

+0

Тогда как я могу это сделать, чтобы каждая ячейка имела размер checkBox с самым большим контентом? –

+0

Попробуйте WrapPanel. Или установите стиль для установки ширины всех флажков, но в итоге вы получите полосы прокрутки из-за переполнения, и это будет не очень приятное решение (см. Предыдущие комментарии) – Gigi

ответ

4

вы должны добавить элементы пользовательского интерфейса динамически? не можете ли вы просто предопределить свой шаблон CheckBox и вместо этого добавить CheckBox.Content? Если это возможно, то определить ObservableCollection, который содержит ваш CheckBox.Content так:

public ObservableCollection<string> SubfolderNames { get; set; } 

затем определить ItemsControl и связать это ItemsSource к вашей коллекции:

<ItemsControl Grid.Row="0" x:Name="gridSubfolders" ItemsSource="{Binding SubfolderNames}" Grid.IsSharedSizeScope="True"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <WrapPanel></WrapPanel> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <Grid> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="Auto" SharedSizeGroup="50" /> 
        </Grid.ColumnDefinitions> 
        <Border Margin="5" BorderThickness="1" BorderBrush="Black"> 
         <CheckBox Content="{Binding}"/> 
        </Border> 
       </Grid> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 

Таким образом, все детали имеют такую ​​же ширину, они разделяют группу размеров, более того, потому что они имеют размер Auto, они также будут иметь размер до наибольшего CheckBox.Content.

2

Я предложил бы использовать что-то вроде WrapPanel

Тогда как я могу это сделать, что каждая ячейка имеет размер CheckBox с самым большим содержанием?

Использование UniformGrid Вам придется вручную пройти каждый флажок, проверяя его размера, и изменение Единых Grid.Columns к чему-то вроде Math.Floor(Grid.CurrentWidth/CheckBoxMaxWidth)

0

Когда Rows и Columns свойства UniformGrid оба установленный в ноль, UniformGrid пытается компоновать элементы в квадрате без учета размера элементов. Я бы написал панель, которая отображает ваши элементы так, как вы хотите, чтобы они выглядели следующим образом. Просто используйте MyPanel вместо UniformGrid в вашем XAML.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows; 
using System.Windows.Controls; 

namespace MyNamespace 
{ 
    class MyPanel : Panel 
    { 
     int columns; 
     int rows; 

     protected override Size MeasureOverride (Size constraint) 
     { 
      Size childConstraint = constraint; 
      double maxChildDesiredWidth = 0.0; 
      double maxChildDesiredHeight = 0.0; 

      if (InternalChildren.Count > 0) 
      { 
       for (int i = 0, count = InternalChildren.Count; i < count; ++i) 
       { 
        UIElement child = InternalChildren[i]; 

        // Measure the child. 
        child.Measure (childConstraint); 
        Size childDesiredSize = child.DesiredSize; 

        if (maxChildDesiredWidth < childDesiredSize.Width) 
        { 
         maxChildDesiredWidth = childDesiredSize.Width; 
        } 

        if (maxChildDesiredHeight < childDesiredSize.Height) 
        { 
         maxChildDesiredHeight = childDesiredSize.Height; 
        } 
       } 

       columns = (int)(constraint.Width/maxChildDesiredWidth); 
       rows = (int)(InternalChildren.Count/columns + 0.5); 
      } 
      else 
      { 
       columns = 0; 
       rows = 0; 
      } 

      return new Size ((maxChildDesiredWidth * columns), (maxChildDesiredHeight * rows)); 
     } 

     protected override Size ArrangeOverride (Size arrangeSize) 
     { 
      Rect childBounds = new Rect (0, 0, arrangeSize.Width/columns, arrangeSize.Height/rows); 
      double xStep = childBounds.Width; 
      double xBound = arrangeSize.Width - 1.0; 

      childBounds.X += 0; 

      foreach (UIElement child in InternalChildren) 
      { 
       child.Arrange (childBounds); 

       if (child.Visibility != Visibility.Collapsed) 
       { 
        childBounds.X += xStep; 
        if (childBounds.X >= xBound) 
        { 
         childBounds.Y += childBounds.Height; 
         childBounds.X = 0; 
        } 
       } 
      } 

      return arrangeSize; 
     } 
    } 
}