为什么 XamDataGrid 的第一列有两个 LabelPresenters?

Why does the first column of a XamDataGrid have two LabelPresenters?

我有一个 XamDataGrid(版本 13.2),我在其中订阅了 LabelPresenters 的 SizeChanged 事件。首次加载网格时,会为第一个 FieldLabelPresenter 抛出两个 SizeChanged 事件。在做了一些挖掘之后,我发现这两个事件是针对 LabelPresenters.

的两个不同实例

我正在尝试访问 LabelPresenterActualWidth,但是对于其中一个事件,此 属性 的值不是我所期望的。例如,一个 LabelPresenter 的值为 40.0(与屏幕上显示的相符),而另一个将显示为 166.0。

当我使用 Snoop 查看可视化树时,它只显示所显示字段的 LabelPresenters,这正是我所期望的。

样本XAML:

<igDP:XamDataGrid BindToSampleData="True" Name="xamDataGrid1" VerticalAlignment="Top" >
    <igDP:XamDataGrid.Resources>
        <Style TargetType="{x:Type igDP:LabelPresenter}">
            <EventSetter Event="SizeChanged" Handler="OnLabelPresenterSizeChanged"/>
        </Style>
    </igDP:XamDataGrid.Resources>
</igDP:XamDataGrid>

示例 C#:

public partial class MainWindow : Window
{
    Dictionary<LabelPresenter, Field> labelPresenters = new Dictionary<LabelPresenter, Field>();

    public MainWindow()
    {
        InitializeComponent();
    }

    private void OnLabelPresenterSizeChanged(object sender, SizeChangedEventArgs e)
    {
        LabelPresenter lp = sender as LabelPresenter;
        labelPresenters.Add(lp, lp.Field);

        Debug.WriteLine("Field count: {0} LabelPresenter Count: {1}", xamDataGrid1.FieldLayouts[0].Fields.Count, labelPresenters.Count);
    }

您可以在字典中看到 5 LabelPresenters,即使网格中存在四个字段。

Snoop 显示的内容

如何在 SizeChanged 事件期间过滤掉或忽略这个额外的 LabelPresenter

通过在运行时深入研究可视化树,我发现额外的 LabelPresenterCellPlaceholder 对象的子对象。它的 documentation 只说明它仅供内部使用,所以我真的不知道它的用途。

通过忽略这个 LabelPresenter(并且只检查 ActualPosition.Column 属性 值为 0 的字段的可视化树),我可以过滤掉错误的 ActualWidth 我逻辑中的值。