Учебники

WPF – Свойства зависимостей

В приложениях WPF свойство зависимости – это особый тип свойства, который расширяет свойство CLR. Он использует преимущества определенных функций, доступных в системе свойств WPF.

Класс, который определяет свойство зависимости, должен быть унаследован от класса DependencyObject . Многие из классов элементов управления пользовательского интерфейса, которые используются в XAML, являются производными от класса DependencyObject и поддерживают свойства зависимостей, например, класс Button поддерживает свойство зависимостей IsMouseOver .

Следующий код XAML создает кнопку с некоторыми свойствами.

<Window x:Class = "WPFDependencyProperty.MainWindow" 
   xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
   xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml" 
   xmlns:local = "clr-namespace:WPFDependencyProperty"
   Title = "MainWindow" Height = "350" Width = "604"> 
	
   <Grid> 
      <Button  Height = "40" Width = "175" Margin = "10" Content = "Dependency Property"> 
         <Button.Style> 
            <Style TargetType = "{x:Type Button}"> 
               <Style.Triggers> 
					
                  <Trigger Property = "IsMouseOver" Value = "True"> 
                     <Setter Property = "Foreground" Value = "Red" /> 
                  </Trigger>
						
               </Style.Triggers>
            </Style> 
         </Button.Style> 
      </Button> 
   </Grid> 
	
</Window> 

Расширение разметки x: Type в XAML имеет аналогичную функциональность, как typeof () в C #. Он используется, когда указываются атрибуты, которые принимают тип объекта, например <Style TargetType = “{x: Type Button}”>>

Когда приведенный выше код скомпилирован и выполнен, вы получите следующее MainWindow . Когда мышь находится над кнопкой, она изменит цвет переднего плана кнопки. Когда мышь покидает кнопку, она меняет свой первоначальный цвет.

Свойство зависимости

Почему нам нужны свойства зависимостей

Свойство Dependency дает вам все преимущества, когда вы используете его в своем приложении. Свойство зависимости можно использовать над свойством CLR в следующих сценариях:

  • Если вы хотите установить стиль
  • Если вы хотите привязку данных
  • Если вы хотите установить с ресурсом (статический или динамический ресурс)
  • Если вы хотите поддержать анимацию

По сути, свойства зависимости предлагают множество функций, которые вы не получите, используя свойство CLR.

Основное различие между свойствами зависимости и другими свойствами CLR перечислено ниже –

  • Свойства CLR могут напрямую читать / писать из закрытого члена класса, используя getter и setter . В отличие от свойств зависимости не хранятся в локальном объекте.

  • Свойства зависимостей хранятся в словаре пар ключ / значение, который предоставляется классом DependencyObject. Это также экономит много памяти, поскольку сохраняет свойства при изменении. Это также может быть связано в XAML.

Свойства CLR могут напрямую читать / писать из закрытого члена класса, используя getter и setter . В отличие от свойств зависимости не хранятся в локальном объекте.

Свойства зависимостей хранятся в словаре пар ключ / значение, который предоставляется классом DependencyObject. Это также экономит много памяти, поскольку сохраняет свойства при изменении. Это также может быть связано в XAML.

Пользовательские свойства зависимостей

В .NET Framework также могут быть определены пользовательские свойства зависимостей. Выполните шаги, указанные ниже, чтобы определить пользовательское свойство зависимости в C #.

  • Объявите и зарегистрируйте свойство зависимости с помощью регистра системных вызовов.

  • Предоставить установщик и получатель для свойства.

  • Определите статический обработчик, который будет обрабатывать любые изменения, которые происходят глобально

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

Объявите и зарегистрируйте свойство зависимости с помощью регистра системных вызовов.

Предоставить установщик и получатель для свойства.

Определите статический обработчик, который будет обрабатывать любые изменения, которые происходят глобально

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

Следующий код C # определяет свойство зависимостей для установки свойства SetText пользовательского элемента управления.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes;  

namespace WpfApplication3 { 
   /// <summary> 
      /// Interaction logic for UserControl1.xaml 
   /// </summary> 
	
   public partial class UserControl1 : UserControl { 
	
      public UserControl1() { 
         InitializeComponent(); 
      }
		
      public static readonly DependencyProperty SetTextProperty = 
         DependencyProperty.Register("SetText", typeof(string), typeof(UserControl1), new 
            PropertyMetadata("", new PropertyChangedCallback(OnSetTextChanged))); 
				
      public string SetText { 
         get { return (string)GetValue(SetTextProperty); } 
         set { SetValue(SetTextProperty, value); } 
      } 
		
      private static void OnSetTextChanged(DependencyObject d,
         DependencyPropertyChangedEventArgs e) { 
         UserControl1 UserControl1Control = d as UserControl1; 
         UserControl1Control.OnSetTextChanged(e); 
      } 
		
      private void OnSetTextChanged(DependencyPropertyChangedEventArgs e) { 
         tbTest.Text = e.NewValue.ToString(); 
      }  
   } 
}

Вот файл XAML, в котором TextBlock определен как пользовательский элемент управления, и свойство Text будет назначено ему свойством зависимости SetText.

Следующий код XAML создает пользовательский элемент управления и инициализирует его свойство зависимостей SetText .

<Window x:Class = "WpfApplication3.MainWindow" 
   xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
   xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml" 
   xmlns:views = "clr-namespace:WpfApplication3"
   Title = "MainWindow" Height = "350" Width = "604"> 
	
   <Grid> 
      <views:UserControl1 SetText = "Hellow World"/> 
   </Grid> 
	
</Window> 

Давайте запустим это приложение. Вы можете сразу заметить, что в нашем MainWindow свойство зависимостей для пользовательского элемента управления было успешно использовано в качестве текста.