Прикрепленные свойства сетки всегда доступны?

В xaml для этого окна я удалил контейнер Grid и поместил DockPanel. Тем не менее, я могу получить доступ к прикрепленным свойствам Grid из DockPanel. Как это возможно?

Спасибо!

<Window x:Class="testWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="testWindow" Height="300" Width="300">
    <DockPanel Grid.Column="2">

    </DockPanel>
</Window>

person soumyasg    schedule 08.04.2016    source источник


Ответы (1)


Поскольку свойства находятся не в экземпляре, а присоединены, то есть они определены статически в классе Grid, а значения хранятся в контейнере свойств за пределами обычной системы свойств.

Если у вас есть DockPanel внутри Grid, вы используете Grid.Column, чтобы указать, в каком столбце должен находиться DockPanel. Следовательно, они могут быть очень полезными. Присоединенные свойства зависимостей также могут быть унаследованы от родительского дерева.

Для получения дополнительной информации прочитайте эту ссылку:

http://www.abhisheksur.com/2011/07/internals-of-dependency-property-in-wpf.html

Если мы возьмем пример Grid.Column, внутреннее устройство таково, что где-то в классе Grid лежит такое определение:

public static readonly DependencyProperty ColumnProperty =
    DependencyProperty.RegisterAttached(
        "Column",
        typeof(int),
        typeof(Grid),
        new PropertyMetadata(0));

Приведенный выше код — это фактически все, что нужно для объявления прикрепленного свойства зависимостей. Обратите внимание, что здесь нет ни геттера, ни сеттера, а свойство является статическим. Все это декларация поведения — нет никакой логики для ее сохранения или извлечения.

Это связано с тем, что WPF имеет собственное внутреннее хранилище для свойств зависимостей (DP). Обычный DP также не имеет резервных полей в классах. Другими словами, все DP хранятся внутри WPF. Однако WPF по-прежнему отслеживает, какие значения принадлежат каким экземплярам, ​​поэтому по-прежнему можно хранить Width = 20 вместо TextBox1. Это также означает, что можно хранить значения, которые даже не определены в самих классах, как в случае с присоединенными DP.

Поскольку нет правил, для которых можно установить элементы управления Grid.Column, их можно хранить даже в элементах управления, которые не являются дочерними элементами элемента управления Grid.

person Troels Larsen    schedule 08.04.2016
comment
Спасибо за ответ. Я понимаю, что дочерние элементы управления могут получать доступ к прикрепленным свойствам своих контейнеров. Но в этом случае обратите внимание, что док-панель находится прямо в окне, а не в сетке. Тем не менее, я могу получить доступ к присоединенному свойству Grid.Column. - person soumyasg; 09.04.2016
comment
@soumyasg: Я попытался уточнить свой ответ. Пожалуйста, дайте мне знать, если он недостаточно ясен. - person Troels Larsen; 10.04.2016
comment
Большое спасибо за ваш развернутый ответ. Мне нужно будет вернуться к зависимостям/присоединенным свойствам, чтобы полностью понять это. Мне все еще кажется немного размытым. - person soumyasg; 10.04.2016
comment
Полагаю, у меня есть еще один вопрос: в каком контексте кому-то нужно установить Grid.Column, как показано выше, когда на картинке вообще нет сетки? - person soumyasg; 10.04.2016
comment
@soumyasg: Никогда .. Grid - единственный класс, который читает прикрепленное свойство Grid.Column. Любой может использовать его, но Grid — единственный, кто это делает. Другими словами, хотя любой может использовать его где угодно, это имеет смысл только тогда, когда родительский элемент в Grid. - person Troels Larsen; 10.04.2016
comment
:Понятно. Большое спасибо! - person soumyasg; 12.04.2016