【问题标题】:Adding checkBoxes to UniformGrid将复选框添加到 UniformGrid
【发布时间】:2015-08-13 23:27:54
【问题描述】:

我正在尝试将复选框动态添加到 wpf 中的 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 Grid.Column="1" Grid.RowSpan="3">
  <UniformGrid x:Name="unfiformGridSubfolders" Grid.Column="1" Grid.Row="0" Grid.RowSpan="3" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/>
</ScrollViewer>  

这就是它在程序中的样子:

我只是希望每个checkBox都有足够的空间,以便内容可以完整阅读。

【问题讨论】:

  • 你想达到什么目的?如果一个文件夹占据了整个宽度怎么办?你想让所有东西都占据整个宽度吗? UniformGrid,使每个单元格统一,这意味着所有单元格都是相同大小。
  • 那我该怎么做呢,每个单元格都有最大内容的复选框的大小?
  • 试试 WrapPanel。或者设置一个样式来设置所有复选框的宽度,但是由于溢出,你最终会出现滚动条,这不是一个很好的解决方案(参见以前的 cmets)

标签: c# wpf checkbox uniformgrid


【解决方案1】:

您是否必须动态添加 UI 元素?你不能只预定义你的CheckBox 模板并添加CheckBox.Content 吗?如果可能,则定义一个包含您的CheckBox.ContentObservableCollection,如下所示:

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

    那我该怎么做呢,每个单元格都有最大内容的复选框的大小?

    使用 UniformGrid 您必须手动检查每个复选框,检查其大小,并将 Uniform Grid.Columns 修改为 Math.Floor(Grid.CurrentWidth / CheckBoxMaxWidth)

    【讨论】:

      【解决方案3】:

      UniformGridRowsColumns 属性都设置为零时,UniformGrid 会尝试将元素布局为正方形,而不考虑元素的大小。我会编写一个面板,按照您的需要布局您的元素,如下所示。只需在 XAML 中使用 MyPanel 而不是 UniformGrid

      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;
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2017-02-07
        • 2015-11-22
        • 2012-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多