为什么 XamDataGrid 的第一列有两个 LabelPresenters?
Why does the first column of a XamDataGrid have two LabelPresenters?
我有一个 XamDataGrid
(版本 13.2),我在其中订阅了 LabelPresenters 的 SizeChanged
事件。首次加载网格时,会为第一个 Field
的 LabelPresenter
抛出两个 SizeChanged
事件。在做了一些挖掘之后,我发现这两个事件是针对 LabelPresenters
.
的两个不同实例
我正在尝试访问 LabelPresenter
的 ActualWidth
,但是对于其中一个事件,此 属性 的值不是我所期望的。例如,一个 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
?
通过在运行时深入研究可视化树,我发现额外的 LabelPresenter
是 CellPlaceholder
对象的子对象。它的 documentation 只说明它仅供内部使用,所以我真的不知道它的用途。
通过忽略这个 LabelPresenter
(并且只检查 ActualPosition.Column
属性 值为 0 的字段的可视化树),我可以过滤掉错误的 ActualWidth
我逻辑中的值。
我有一个 XamDataGrid
(版本 13.2),我在其中订阅了 LabelPresenters 的 SizeChanged
事件。首次加载网格时,会为第一个 Field
的 LabelPresenter
抛出两个 SizeChanged
事件。在做了一些挖掘之后,我发现这两个事件是针对 LabelPresenters
.
我正在尝试访问 LabelPresenter
的 ActualWidth
,但是对于其中一个事件,此 属性 的值不是我所期望的。例如,一个 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
?
通过在运行时深入研究可视化树,我发现额外的 LabelPresenter
是 CellPlaceholder
对象的子对象。它的 documentation 只说明它仅供内部使用,所以我真的不知道它的用途。
通过忽略这个 LabelPresenter
(并且只检查 ActualPosition.Column
属性 值为 0 的字段的可视化树),我可以过滤掉错误的 ActualWidth
我逻辑中的值。