bid*_*shi 7 c# wpf xaml list panel
背景
我正在创建一个自定义的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/>
Run Code Online (Sandbox Code Playgroud)
显然,事情有点简化,但长话短说:我需要在"排列"过程发生之前处理布局.我创建了一个自定义集合,我可以看到添加的项目(参见下面的代码),但这些项目只有默认属性.
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...
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我在初始化面板后查看集合时,属性都已正确设置.这让我想到了我的问题:
题
在XAML和面板初始化过程中的哪个阶段,项目会被赋予其属性,以及它们是如何分配的?我需要以某种方式挂钩并运行一些代码.
我的想法是,WPF 的面板布局系统并不是真正设计为按照您希望的方式进行拦截的。
但是有一种机制可以“同步”您的自定义 DependencyProperties。问题是在布局过程中什么时候需要这些属性?
如果是在 ArrangeOverride 期间,则必须设置AffectsArrange
. 或者AffectsMeasure
在 MeasureOverride 期间。还有其他一些口味,但我认为这两种都可以满足您的要求。
例如,如果您选择 AffectsArrange 并且您的面板收到 List.Add 通知,则将调用 ArrangeOverride 并且新添加的项目可以在您的排列逻辑中使用。