繁体   English   中英

声明的XAML列表项何时设置了依赖项属性?

[英]When do declared XAML list items have their dependency properties set?

背景

我正在创建一个自定义的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的Panel布局系统并没有真正按照你想要的方式截取。

但是有一种“同步”自定义DependencyProperties的机制。 问题是在布局过程中你需要这些属性吗?

如果是在ArrangeOverride期间,则必须设置AffectsArrange AffectsMeasure的MeasureOverride期间时。 还有一些其他的味道,但我认为这两个中的任何一个都可以满足您的要求。

例如,如果选择AffectsArrange并且Panel会收到List.Add的通知,则会调用ArrangeOverride,并且可以在排列逻辑中使用新添加的项目。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM