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与演示文稿分开来做.