当声明的XAML列表项设置了它们的依赖属性时
本文关键字:依赖 属性 设置 声明 XAML 列表 | 更新日期: 2023-09-27 18:07:25
背景
我正在创建一个自定义wpf面板。为了帮助布局子项,它使用了一个辅助列表(类似于Grid)。RowDefinitions或Grid.ColumnDefinitions),我称之为"布局"。每个布局都有几个依赖属性,子条目使用附加属性来确定它们的位置,如下所示。<Panel>
<Panel.Layouts>
<Layout/>
<Layout Attachment="Right"/>
<Layout Attachment="Left" Target="0"/>
</Panel.Layouts>
<ChildItem Panel.Layout="0"/>
<ChildItem Panel.Layout="1"/>
<ChildItem Panel.Layout="2"/>
<Panel/>
显然,事情被简化了一点,但长话短说:我需要在"安排"过程发生之前处理添加的布局。我已经创建了一个自定义集合,我可以看到添加的项目(见下面的代码),但是项目只有它们的默认属性。
LayoutCollection: IList
{
public int IList.Add(object value)
{
// When first starting, this line always returns the default value, not the one set in XAML
Attachment a = (value as Layout).Attachment;
// Other code happens below...
}
}
但是,当我在面板初始化后查看集合时,属性都设置正确。这就引出了我的问题:
在XAML和面板初始化之间的过程中,项目被分配属性的时间点是什么,它们是如何分配的?我需要以某种方式连接到它并运行一些代码
我的想法是,WPF的面板布局系统并不是真正设计为拦截你想要的方式。
但是有一个机制可以"同步"你的自定义DependencyProperties。问题是什么时候你需要这些属性在布局过程中?
如果是在"ArrangeOverride"期间,则需要设置"AffectsArrange
"。或AffectsMeasure
在MeasureOverride期间。这个还有其他几种口味,但我想这两种都能满足您的要求。
例如,如果你选择了影响范围,你的面板被通知列表。Add, ArrangeOverride将被调用,并且新添加的项可以在您的排列逻辑中使用。