XAML - właściwości zależności
Właściwość zależności to określony typ właściwości, w którym po wartości następuje system właściwości, który jest również częścią aplikacji Windows Runtime. Klasa, która definiuje właściwość zależności, musi być dziedziczona z klasy DependencyObject.
Wiele klas kontrolek interfejsu użytkownika, które są używane w języku XAML, pochodzi z klasy DependencyObject i obsługuje właściwości zależności. Poniższy kod XAML tworzy przycisk z niektórymi właściwościami.
<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>
Rozszerzenie znacznika x: Type w języku XAML ma podobną funkcjonalność, jak typeof () w C #. Jest używany, gdy określono atrybuty przyjmujące typ obiektu, na przykład <Style TargetType = "{x: Type Button}">
Kiedy kompilujesz i wykonujesz powyższy kod, wygeneruje on następujący plik MainWindow. Kiedy mysz znajduje się nad przyciskiem, zmienia kolor pierwszego planu przycisku. Kiedy mysz opuści przycisk, powróci do swojego pierwotnego koloru.
![](https://post.nghiatu.com/assets/tutorial/xaml/images/dependency_property.jpg)
Główną różnicą między właściwościami zależności a innymi właściwościami środowiska CLR są -
Właściwości CLR mogą bezpośrednio odczytywać / zapisywać z prywatnego elementu członkowskiego klasy przy użyciu getter i setter. W przypadku właściwości zależności nie jest przechowywany w obiekcie lokalnym.
Właściwości zależności są przechowywane w słowniku par klucz / wartość, który jest udostępniany przez klasę DependencyObject.
Oszczędza również dużo pamięci, ponieważ przechowuje właściwość po zmianie.
Może być również powiązany w XAML.
W środowisku .NET można również zdefiniować niestandardowe właściwości zależności. Oto kroki, aby zdefiniować niestandardową właściwość zależności w C #.
Zadeklaruj i zarejestruj swoją właściwość zależności w rejestrze wywołań systemowych.
Podaj metodę ustawiającą i pobierającą dla właściwości.
Zdefiniuj procedurę obsługi statycznej, aby obsłużyć wszelkie zmiany zachodzące globalnie.
Zdefiniuj procedurę obsługi instancji, aby obsłużyć wszelkie zmiany zachodzące w tej konkretnej instancji.
Poniżej podano kod w języku C # dla właściwości zależności, która została zdefiniowana w celu ustawienia właściwości SetText kontrolki użytkownika.
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();
}
}
}
Oto plik XAML, w którym TextBlock jest zdefiniowany jako kontrolka użytkownika, a właściwość Text zostanie do niego przypisana przez właściwość zależności SetText.
Poniższy kod XAML tworzy kontrolkę użytkownika z zainicjowaniem jej właściwości zależności SetText i niektórych innych właściwości.
<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>
Uruchommy tę aplikację i od razu zobaczysz w naszym MainWindow, że właściwość zależności dla kontroli użytkownika została pomyślnie użyta jako Text.
![](https://post.nghiatu.com/assets/tutorial/xaml/images/hello_world_example.jpg)