背景
我正在创建一个自定义的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和面板初始化之间的过程中,在何时分配项目它们的属性,以及如何分配?我需要找到方法来挂接并运行一些代码。
Panel.Layout
是附加属性)具有回调函数,您可以使用它来了解何时设置/更改值。您可以在Window类中覆盖该回调。如果您展示创建这些附加属性的代码以及导致问题的特定点,那将很好。然后修复它应该很容易。请参见此处。 - Sinatr<Panel.Layouts/>
是面板的自定义属性,它会被填充上你在我提供的 XAML 中看到的<Layout/>
项。问题在于当它开始运行并且列表被填充时,我在 XAML 中设置的任何值都没有传递过来。当面板加载时,这些项会自动添加,但属性为空或默认值。 - bidanshi