См. Следующую ссылку: http://www.bobpowell.net/dependencyproperty.aspx
То, что объявляется объектом как свойство зависимости, фактически является не чем иным, как идентификатором.Это статическое «свойство» действительно является ключом, который связывает объект с определенным идентификатором хранилища.Например, графические объекты имеют свойство Background, которое можно установить явно или с помощью шаблонов или стилей.
Пока свойство зависимости использует свое состояние по умолчанию (что очень распространено), ононе будет занимать дополнительную память, так как будет использоваться значение по умолчанию.Значение по умолчанию не сохраняется для каждого экземпляра, оно сохраняется для каждого свойства зависимости и устанавливается метаданными.
Пример, обратите внимание, как Brushes.Black
установлено в качестве значения по умолчанию
public static readonly DependencyProperty ForegroundProperty =
DependencyProperty.Register(
"Foreground",
typeof(Brush),
typeof(TextElement),
new FrameworkPropertyMetadata(Brushes.Black, ...));
Подумайте об этом так: скажем, у вас есть четыре TextBlocks
в Xaml
<StackPanel>
<TextBlock .../>
<TextBlock .../>
<TextBlock .../>
<TextBlock Foreground="Green" .../>
</StackPanel>
У трех TextBlocks
в верхней части Foreground
установлено Black хотя вы никогда не устанавливали явно 10 * черный .Они используют их значение по умолчанию.Таким образом, для свойства Foreground
для трех TextBlocks
, указанных выше, вам нужно только одно поле (так как оно является статическим).
Для четвертого TextBlock
вы явно задали Foreground
зеленый, чтобы это значение было вставлено в словарь в качестве локального значения для Foreground
в этом экземпляре и, таким образом, требует дополнительной памяти (также оно окажется на месте 3 в списке ниже, переопределяя Setters
, Triggers
и т. Д.) .
Кроме того, см. Следующий пост Джоша Смита, это хорошее чтение: Разоблачение свойств зависимостей
Тамэто четко определенный набор правил, который используется внутри WPF, чтобы выяснить, каково реальное значение DP.Вот краткое изложение правил приоритета, используемых при разрешении значения DP (подробнее об этом здесь ):
- Приведение системы свойств
- Активные анимации или анимации с поведением удержания
- Локальное значение
- Шаблон TemplatedParent
- Триггеры стиля
- Триггеры шаблона
- Установщики стилей
- Стиль темы
- Наследование
- Значение по умолчанию из метаданных свойства зависимостей
Редактировать: Ответить на комментарийfrom Duane
Если вы явно установите значение, равное значению по умолчанию, оно все равно будет сохранено как локальное значение.Это можно легко проверить с помощью следующего Xaml.
У обоих TextBlocks
будет Foreground
, установленный на Черный , но у последнего будет установлено локальное значение.Style
сможет установить Foreground
только для первого TextBlock
, но не позднее, поскольку установщики стилей имеют более низкий приоритет, чем локальное значение.
<StackPanel>
<StackPanel.Resources>
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="Green"/>
</Style>
</StackPanel.Resources>
<TextBlock Text="Displays in Green"/>
<TextBlock Foreground="Black" Text="Displays in Black"/>
</StackPanel>