Учебники

XAML — свойства зависимостей

Свойство зависимости — это особый тип свойства, в котором за значением следует острая система свойств, которая также является частью приложения среды выполнения Windows. Класс, который определяет свойство зависимости, должен быть унаследован от класса DependencyObject.

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

<Window x:Class = "XAMLDependencyProperty.MainWindow"
   xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
   xmlns:local = "clr-namespace:XAMLDependencyProperty"
   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:

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