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

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

Класс, определяющий свойство зависимости, должен быть унаследован от DependencyObjectкласс. Многие из классов элементов управления пользовательского интерфейса, которые используются в XAML, являются производными отDependencyObject class, и они поддерживают свойства зависимостей, например, класс 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. Когда мышь находится над кнопкой, она меняет цвет переднего плана. Когда мышь покидает кнопку, она меняет свой первоначальный цвет.

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

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

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

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

Основное различие между dependency properties и другие CLR properties перечислены ниже -

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

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

Настраиваемые свойства зависимостей

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

  • Объявите и зарегистрируйте свой dependency property с регистром системных вызовов.

  • Обеспечьте setter и getter для собственности.

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

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

Следующий код 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 свойство зависимостей для пользовательского элемента управления успешно используется как текст.