在wpf ListView GridView上设置边距/填充在哪里?

ser*_*ist 10 wpf listview gridview margin padding

我在XAML中有一个WPF ListView/GridView规范.第一列使用CellTemplate指定图标,其他列使用DisplayMemberBinding填充自己.图标列是20宽,图标16但它们被边距/填充/东西截断.我无法确定它的位置.

这是必需品(我删除了一些列,因为它们是相同的):

<ListView.ItemContainerStyle>
    <Style TargetType="{x:Type ListViewItem}">
        <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
        <Setter Property="FontWeight" Value="Normal" />
        <Style.Triggers>
            <Trigger Property="IsSelected" Value="True">
                <Setter Property="FontWeight" Value="Bold" />
            </Trigger>
        </Style.Triggers>
    </Style>
</ListView.ItemContainerStyle>

<ListView.Resources>
    <DataTemplate x:Key="image">
        <Image Width="16" Height="16" Margin="0,0,0,0"
                          HorizontalAlignment="Center"
                          Source="{Binding Path=ObjectType, 
                                           Converter={StaticResource imageConverter} }" />
    </DataTemplate>
</ListView.Resources>

<ListView.View>
    <GridView>
        <GridViewColumn Width="20"
                        CellTemplate="{StaticResource image}"/>
        <GridViewColumn Width="120" Header="Name"
                        DisplayMemberBinding="{Binding Path=Name}"/>
    </GridView>
</ListView.View>
Run Code Online (Sandbox Code Playgroud)

ImageConverter只是将ObjectType转换为图像,因此每种类型的项都有自己的图标.

Qua*_*kly 38

GridView的许多功能都硬编码到类中.特别是GridViewRowPresenter为每个单元格创建一个硬编码的TextBlock或ContentPresenter容器,并强制边距为6,0,6,0,无论你喜欢与否.

通常情况下,我会阻止你从任何涉及硬编码负边距来补偿的事情,因为它是另一个黑客分层的黑客.但是,在反汇编GridViewRowPresenter之后,没有其他选项.

我的第一次尝试是覆盖在GridViewRowPresenter类中创建的容器控件的隐式样式,但该控件是TextBox或ContentPresenter,它没有要覆盖的模板.

我的第二次尝试是反汇编代码并构建一个新的GridViewRowPresenter.我担心课堂上有太多乱伦的"内部"电话让这个问题成为可行的解决方案.

一个更聪明的架构师会提供一个DependencyProperty,允许该类的用户覆盖为每个单元格创建的容器.出于某种原因,他们允许使用标题而不是实际的单元格内容.

因此,我们留下的事实是,GridRowPresenter中的单元既不能被覆盖,也不能被反向设计,也不能被模板化.对不起,但是负利润是这个班级可以做到的最好的.

我们需要一个更好的ListView:GridView不适合无外观的界面,虽然我很欣赏他们原来的建筑师试图通过将ItemsPresenter与演示文稿分开来做.


fed*_*bin 9

默认情况下,每个单元格的硬编码边距为6.0.可能那是你的问题.您可以通过在celltemplate中设置-6,0的边距来覆盖此行为


Ken*_*art 6

使用Snoop确定哪个元素负责施加额外的间距.将鼠标悬停在空间上并按住控制并切换.然后,元素将在可视化树中突出显示.