【问题标题】:WPF datagrid displaying stringWPF数据网格显示字符串
【发布时间】:2021-04-09 15:56:25
【问题描述】:

我想要做的是显示一个字符串,作为DataGrid 中的一系列字符。如果你看看这个例子,希望它是有意义的。

所以,对于字符串 'Hello there!'我想要做的是让网格显示看起来尽可能接近标准TextBlock 中的外观。

但是,无论我制作的单元格有多小,我都无法让它们正确对齐,因为单元格之间总是存在不自然的间距。我不确定您实际上将单元格之间的空间称为什么,填充,间距?

有没有办法让DataGridCell 完全适合其内容,而两侧没有任何额外的间距?

【问题讨论】:

  • 澄清一下,您想在DataGrid 的每个单元格中显示单个字符,并且在渲染时每个单元格中的字符之间的间距尽可能小?
  • 正确,我想要一个可以用列/行来寻址的网格,但它需要在用户看来就像它只是一个字符串。每个字符之前或之后没有空格。
  • 您可以下载snoop并查看可视化树控件及其属性;使用它,您可以检查网格单元格/标题所占用的总大小以及哪个属性控制它。
  • 听说过等宽字体吗?提示:IDE 通常使用它们非常成功
  • 要删除边距,这有帮助吗? stackoverflow.com/questions/26022106/wpf-datagridcell-margin IIRC,WPF 将所有列的大小调整为内容(默认为自动),但我可能没有正确理解这个问题,因此对于手动调整所有列的大小,几行代码可能会有所帮助:stackoverflow.com/questions/4997596/…

标签: c# .net wpf


【解决方案1】:

您必须与DataGrid 稍作斗争才能做到这一点,但这是可能的。

您要做的第一件事是完全停止为标题保留任何屏幕空间。您可以通过将他们的Visibility 属性设置为Collapsed 来做到这一点。

<Style TargetType="DataGridColumnHeader">
    <Setter Property="Visibility" Value="Collapsed" />
</Style>

如果您明确声明列,则需要在 XAML 中将它们的 MinWidth 值设置为 0,否则,如果它们是自动生成的,则需要以编程方式循环它们并设置它那里 - 我使用了 Loaded 事件。此默认设置为 20。

private void StringRepresentationGrid_OnLoadedRepresentationGrid_OnLoaded(object sender, RoutedEventArgs e)
{
    foreach (var column in StringRepresentationGrid.Columns)
    {
        column.MinWidth = 0;
    }
}

然后您需要将DataGridCellTemplate 属性覆盖为如下所示。我使用了等宽字体来保持布局规则。

<Style x:Key="CustomDataGridCellStyle" TargetType="DataGridCell" BasedOn="{StaticResource {x:Type DataGridCell}}">
    <Setter Property="TextBlock.TextAlignment" Value="Center"/>
    <Setter Property="FontSize" Value="12" />
    <Setter Property="Border.BorderThickness" Value="0" />
    <Setter Property="TextBlock.FontFamily" Value="Consolas" />

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate>
                <TextBlock 
                    Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content.Text}" />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

这应该会给您提供接近DataGrid 中标准TextBlock 的间距。

【讨论】:

    【解决方案2】:

    这个瓶颈是你控制的选择:

    数据网格由标题、行和列组成。您正在尝试做的事情有几个缺点:

    1. 如果您有一个包含“w”的标题(或第 1 行第 1 列中的单元格),下面的单元格(即第 2 行第 1 列)想要紧密调整为“l”可以'不要比包含 'w' 的单元格的宽度更近,因为最小尺寸将是呈现 'w' 所需的尺寸,它更宽一些。

    2. 但是,您可以使用负值填充,但这会导致各种问题。

    3. 即使您坚持为标题使用一种字体大小(或将所有标题设置为隐藏),对于每个单元格,您仍然会遇到 1) 中提到的问题。

    换句话说:数据网格不是一个很好的解决方案。 有什么限制您不使用包含每个字母的文本块的用户控件吗?这样我就可以想出一个完美的解决方案,另外还有一个控件可以让您完全控制每个字母的样式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-08
      • 1970-01-01
      • 1970-01-01
      • 2011-03-24
      • 1970-01-01
      • 1970-01-01
      • 2020-06-11
      • 2013-07-24
      相关资源
      最近更新 更多