none
ListView ItemContainerStyle的对齐问题 RRS feed

  • 问题

  • 一般ListView的列标题与单元格内容不是对齐的,单元格前后会有6像素的留白防止前单元格内容与后单元格内容连接起来,但现在特殊情况某个单元格不需要这空白, ItemContainerStyle是这样定义的 <Style x:Key="alternatingWithTriggers" TargetType="{x:Type ListViewItem}"> <Setter Property="SnapsToDevicePixels" Value="true"/> <Setter Property="OverridesDefaultStyle" Value="true"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="ListBoxItem"> <Border Name="Border" Padding="2" SnapsToDevicePixels="true" Background="Transparent"> <GridViewRowPresenter VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> </Border> </ControlTemplate> </Setter.Value> </Setter> </Style>通过snoop查看发现GridViewRowPresenter中定义的ContentPresenter的Margin属性值为“6,0,6,0” 想将其改掉,该如何定义修改GridViewRowPresenter?
    2011年2月18日 7:04

答案

  • 你好!

    首先,我要遗憾的告诉你,这个我们是没有办法改的,这个是真相,没办法。

    下面我给你解释一下我这么说的原因。

    开始看了VisualTree,结果正如你所说的,在GridViewRowPresenter中ContentPresenterMargin属性是“6,0,6,0”。

    我以为这个是GridViewRowPresenter的默认模板的值,如果通过得到默认模板,然后改掉就可以了。但是,当我找到这个默认模板,我发现没有可改的内容,因此这个方法是不能解决你的问题的。

    然后我就想到了这个值是不是HardCode进去的,如果这样我们也可以改掉它。通过Reflector查看我发现了真相,代码是:

    static GridViewRowPresenter()

    {

        ContentProperty = ContentControl.ContentProperty.AddOwner(typeof(GridViewRowPresenter), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsMeasure, new PropertyChangedCallback(GridViewRowPresenter.OnContentChanged)));

        _defalutCellMargin = new Thickness(6.0, 0.0, 6.0, 0.0);

    }

    defalutCellMargin 的定义:

    private static readonly Thickness _defalutCellMargin;

    我想你已经明白了,这个defalutCellMargin 属性是ReadOnly的,因此是没有办法去改变的。

    希望我的解释对你有所帮助。

    同时,我真诚的希望这个Margin属性没有给你的项目带来太大的影响。

     

    Best regards,


    Sheldon _Xiao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 dk.huang 2011年2月19日 8:36
    2011年2月18日 8:25
    版主

全部回复

  • 你好!

    首先,我要遗憾的告诉你,这个我们是没有办法改的,这个是真相,没办法。

    下面我给你解释一下我这么说的原因。

    开始看了VisualTree,结果正如你所说的,在GridViewRowPresenter中ContentPresenterMargin属性是“6,0,6,0”。

    我以为这个是GridViewRowPresenter的默认模板的值,如果通过得到默认模板,然后改掉就可以了。但是,当我找到这个默认模板,我发现没有可改的内容,因此这个方法是不能解决你的问题的。

    然后我就想到了这个值是不是HardCode进去的,如果这样我们也可以改掉它。通过Reflector查看我发现了真相,代码是:

    static GridViewRowPresenter()

    {

        ContentProperty = ContentControl.ContentProperty.AddOwner(typeof(GridViewRowPresenter), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsMeasure, new PropertyChangedCallback(GridViewRowPresenter.OnContentChanged)));

        _defalutCellMargin = new Thickness(6.0, 0.0, 6.0, 0.0);

    }

    defalutCellMargin 的定义:

    private static readonly Thickness _defalutCellMargin;

    我想你已经明白了,这个defalutCellMargin 属性是ReadOnly的,因此是没有办法去改变的。

    希望我的解释对你有所帮助。

    同时,我真诚的希望这个Margin属性没有给你的项目带来太大的影响。

     

    Best regards,


    Sheldon _Xiao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 dk.huang 2011年2月19日 8:36
    2011年2月18日 8:25
    版主
  • 好吧,我用了一个最原始的办法:通过VisualTreeHelper找到了这个ContentPresenter,然后把它的Margin属性值设为0,目前看起来没啥问题,先这样了……
    2011年2月19日 8:36