【问题标题】:Getting rid of the white line at the end of GridViewColumnHeader in xaml摆脱 xaml 中 GridViewColumnHeader 末尾的白线
【发布时间】:2012-01-22 06:06:30
【问题描述】:

到目前为止,我在使用 GridViewColumnHeaders 时遇到了几个问题。最初,我遇到了一个问题,即每个列标题之间都有一小片白色。即使我们将borderthickness 设置为0,白线仍然存在。环顾四周后,我发现我必须使用 ControlTemplate 将标题更改为默认具有文本框属性。我使用了这段代码:

<Style x:Key="gridHeaderStyle" TargetType="{x:Type GridViewColumnHeader}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type GridViewColumnHeader}">
                        <TextBox Text="{TemplateBinding Content}" 
                                 FontWeight="Bold"
                                 FontFamily="Arial"
                                 FontSize="11"
                                 Foreground="#00648D"
                                 Padding="5,0,5,0" 
                                 BorderBrush="#7EB0CC" 
                                 BorderThickness="0,0,2,2"
                                 HorizontalContentAlignment="Center"
                                 VerticalContentAlignment="Center"
                                 IsReadOnly="True"
                                 Background="Transparent"/>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

这有效并删除了标题列之间的白色小条,它还阻止了用户移动和调整列的大小,这会弄乱格式,所以这很好。但是,gridviewcolumnheader 的最后仍然有一点白色,如下图所示:

有没有办法把它也去掉?

【问题讨论】:

  • 我建议使用Snoop 之类的工具来查看导致空白的原因。 Snoop可以从snoopwpf.codeplex.com下载
  • 整洁的工具,但它并没有真正帮助我弄清楚为什么这条线仍然存在。还有谁能帮忙?
  • +1 用于窥探。处理这类事情的绝佳工具。

标签: wpf xaml gridview removing-whitespace gridviewcolumn


【解决方案1】:

那个空白是你抓取和调整页眉大小的对象。我相信即使你重写标题模板它也存在,因为它是 GridView 模板的一部分,而不是标题列

我不确定是否有办法在不覆盖整个 GridView 模板的情况下覆盖这些颜色,但是您可以在加载可视树后导航并从那里手动设置背景颜色。

这是一个使用 ListView 的 Loaded 事件和一些 Visual Tree Helpers 的示例

private void ListView_Loaded(object sender, RoutedEventArgs e)
{
    var thumb = VisualTreeHelpers.FindChild<Thumb>((DependencyObject)sender, "PART_HeaderGripper");
    if (thumb == null) return;
    thumb.Background = Brushes.Transparent;

    var thumbContent = VisualTreeHelpers.FindChild<Border>(thumb);
    if (thumbContent == null) return;
    thumbContent.Background = Brushes.Transparent;
}

结果

如果你想覆盖 ListView 的 ControlTemplate,你可以找到默认的 XAML here

【讨论】:

  • 你能告诉我一个例子,我将如何只为 HeaderGripperThumb 覆盖 ListView 的 ControlTemplate。
  • @Jay 您必须复制现有模板,然后只需编辑 Thumb。您可以通过转到我的答案底部的链接来复制它,或者如果您有 Expression Blend,您可以右键单击您的 ListView 并选择编辑模板副本的选项,在这种情况下,它将复制现有模板到您的资源中,以便您可以对其进行编辑。
  • 我了解复制整个模板并仅编辑拇指部分。我有点困惑的是新模板的去向以及我如何引用它。
  • @Jay 通常它会出现在您的Resources 某处。一种简单的方法是将模板包含在&lt;Window.Resources&gt; 中并为其赋予x:Key 属性,然后使用您指定的键绑定您的ListView 模板:&lt;ListView Template="{StaticResource MyTemplateKey}" ... /&gt;
  • 我如何将它们整合在一起,因为它由多种样式组成。我把它全部放在 中,但这不起作用。我把它都放在什么里面了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-19
  • 1970-01-01
  • 1970-01-01
  • 2016-05-31
相关资源
最近更新 更多