2015-08-11 1 views
7

Когда объявленные элементы списка XAML имеют свои свойства зависимостей?

Я создаю пользовательскую панель 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 и инициализации панели делать элементы получают назначены их свойства, и как они назначены? Мне нужно как-то подключиться к этому и запустить немного кода.

+0

Нужно ли перехватывать ДО или ПОСЛЕ того, что значения, установленные в приложении, установлены/использованы? Если речь идет об управлении устройством вообще, вы можете посмотреть https://msdn.microsoft.com/de-de/library/system.windows.frameworkelement.arrangeoverride(v=vs.110).aspx – MABVT

+0

Прикрепленные объекты ('Panel.Layout' - это прикрепленное свойство) имеют обратный вызов, который вы можете использовать, чтобы узнать, когда значение установлено/изменено. Вы можете переопределить этот обратный вызов в своем классе Window. Было бы неплохо, если бы вы показывали код, в котором вы создаете эти прикрепленные свойства, а также конкретную точку, вызывающую проблему. Тогда это должно быть легко исправить. См. [This] (http://stackoverflow.com/a/31857866/1997232). – Sinatr

+1

Почему бы не обработать макеты в MeasureOverride, прежде чем фактически измерить и затем упорядочить дочерние элементы? – Clemens

ответ

1

Моя идея заключается в том, что система компоновки панелей WPF на самом деле не предназначена для перехвата, как вы этого хотели.

Но есть механизм, позволяющий «синхронизировать» ваши пользовательские свойства DependencyProperties. И вопрос: КОГДА вам нужны эти свойства во время макетов?

Если это во время ArrangeOverride, вы должны установить AffectsArrange. Или AffectsMeasure, когда во время MeasureOverride. Есть некоторые другие вкусы этого, но я думаю, что любой из этих двух может удовлетворить ваши требования.

Например, если вы выбрали AffectsArrange и ваша панель уведомлена о List.Add, ArrangeOverride будет вызываться, а вновь добавленный элемент можно использовать в вашей логике компоновки.

+0

Я провел много испытаний, и я знаю, что все установлено к тому времени, когда вызывается OnInitialized. Ваше решение обеспечивает элегантный способ решения проблемы. Я думаю, что я настрою AffectsArrange в инициализации элемента управления. – bidanshi

 Смежные вопросы

  • Нет связанных вопросов^_^