2013-09-06 3 views

ответ

2

Background свойство зависимостей в WPF разделяется многими классами. Он определен в классе Panel, другие классы просто вызывают AddOwner.

Border.cs

[CommonDependencyProperty] 
public static readonly DependencyProperty BackgroundProperty = 
    Panel.BackgroundProperty.AddOwner(
     typeof (Border), 
     new FrameworkPropertyMetadata(null, 
      FrameworkPropertyMetadataOptions.AffectsRender | 
      FrameworkPropertyMetadataOptions.SubPropertiesDoNotAffectRender)); 

Panel.cs

[CommonDependencyProperty] 
public static readonly DependencyProperty BackgroundProperty = 
    DependencyProperty.Register("Background", 
     typeof(Brush), 
     typeof(Panel), 
     new FrameworkPropertyMetadata((Brush)null, 
      FrameworkPropertyMetadataOptions.AffectsRender | 
      FrameworkPropertyMetadataOptions.SubPropertiesDoNotAffectRender)); 
+0

спасибо. Теперь мне интересно, как я мог это сделать сам. – franssu

+0

@franssu Нет волшебства, я только что декомпилировал класс «Border» с помощью Resharper (есть также Reflector и другие декомпиляторы). Источники .NET Framework также работают ... время от времени. – Athari

1

класса Control, которые могут взаимодействовать с пользователем. Это включает в себя классы: TextBox, Button и т.д. Цитата MSDN:

Класс Control является базовым классом для многих элементов управления, которые добавляют к приложению. Класс Control определяет очень малое поведение; в то время как вы можете добавить элемент управления в свое приложение, гораздо чаще используется элемент управления, который наследуется от элемента управления, например Button или ListBox.

Он также добавляет свойство зависимостей, таких как Background, FontFamily, Foreground и т.д., которые доступны все элементы управления, которые находятся в System.Windows.Controls. Полный список свойств - here. Он также представляет базовый класс для элементов пользовательского интерфейса (UI), которые используют ControlTemplate для определения их внешнего вида.

Давайте посмотрим на иерархию наследования на Border, ссылка на MSDN:

System.Object 
System.Windows.Threading.DispatcherObject 
    System.Windows.DependencyObject 
    System.Windows.Media.Visual 
    System.Windows.UIElement 
    System.Windows.FrameworkElement 
     System.Windows.Controls.Decorator 
     System.Windows.Controls.Border 

Это в System.Windows.Controls, следовательно, он наследует все свойства, которые доступны для Control.

+0

«Он в System.Windows.Controls, следовательно, наследует все свойства, доступные для Control». Почему? – franssu

+0

@franssu: Например, в 'WinForms', каждый визуальный компонент называется' Control'. В WPF нет. Например, 'Panel' не является элементом управления, но имеет свойства, которые унаследованы от класса' Control'. Это приводит к некоторой путанице. В иерархии показано, что 'Border' происходит непосредственно из' FrameworkElement', но у него нет таких свойств, как 'Background',' FontFamily'. Следовательно, все элементы, найденные в 'System.Windows.Controls', неявно или явно наследуют свойства, доступные в классе' Control'. –

+0

Спасибо, но как вы это узнали? Это написано где-нибудь в MSDN? Это стандартная практика? – franssu