WPF - Abhängigkeitseigenschaften

In WPF-Anwendungen ist die Abhängigkeitseigenschaft ein bestimmter Eigenschaftstyp, der die CLR-Eigenschaft erweitert. Es nutzt die spezifischen Funktionen, die im WPF-Eigenschaftssystem verfügbar sind.

Eine Klasse, die eine Abhängigkeitseigenschaft definiert, muss von der geerbt werden DependencyObjectKlasse. Viele der in XAML verwendeten UI-Steuerelemente werden von der abgeleitetDependencyObject Klasse und sie unterstützen Abhängigkeitseigenschaften, z. B. Button-Klasse unterstützt die IsMouseOver Abhängigkeitseigenschaft.

Der folgende XAML-Code erstellt eine Schaltfläche mit einigen Eigenschaften.

<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>

Die Markup-Erweiterung x: Type in XAML verfügt über eine ähnliche Funktionalität wie typeof () in C #. Es wird verwendet, wenn Attribute angegeben werden, die den Typ des Objekts annehmen, z. B. <Style TargetType = "{x: Type Button}">

Wenn der obige Code kompiliert und ausgeführt wird, erhalten Sie Folgendes MainWindow. Wenn sich die Maus über der Schaltfläche befindet, wird die Vordergrundfarbe einer Schaltfläche geändert. Wenn die Maus die Taste verlässt, nimmt sie wieder ihre ursprüngliche Farbe an.

Warum wir Abhängigkeitseigenschaften benötigen

Die Abhängigkeitseigenschaft bietet Ihnen alle möglichen Vorteile, wenn Sie sie in Ihrer Anwendung verwenden. Die Abhängigkeitseigenschaft kann in den folgenden Szenarien über eine CLR-Eigenschaft verwendet werden:

  • Wenn Sie den Stil festlegen möchten
  • Wenn Sie Daten binden möchten
  • Wenn Sie mit einer Ressource (einer statischen oder einer dynamischen Ressource) festlegen möchten
  • Wenn Sie Animation unterstützen möchten

Grundsätzlich bieten Abhängigkeitseigenschaften viele Funktionen, die Sie mit einer CLR-Eigenschaft nicht erhalten.

Der Hauptunterschied zwischen dependency properties und andere CLR properties sind unten aufgeführt -

  • CLR-Eigenschaften können mithilfe von direkt vom privaten Mitglied einer Klasse lesen / schreiben getter und setter. Im Gegensatz dazu werden Abhängigkeitseigenschaften nicht im lokalen Objekt gespeichert.

  • Abhängigkeitseigenschaften werden in einem Wörterbuch von Schlüssel / Wert-Paaren gespeichert, das von der DependencyObject-Klasse bereitgestellt wird. Es spart auch viel Speicher, da es die Eigenschaft speichert, wenn es geändert wird. Es kann auch in XAML gebunden werden.

Benutzerdefinierte Abhängigkeitseigenschaften

In .NET Framework können auch benutzerdefinierte Abhängigkeitseigenschaften definiert werden. Führen Sie die folgenden Schritte aus, um die benutzerdefinierte Abhängigkeitseigenschaft in C # zu definieren.

  • Deklarieren und registrieren Sie Ihre dependency property mit Systemaufrufregister.

  • Das ____ bereitstellen setter und getter für die Immobilie.

  • Definieren Sie a static handler Hiermit werden alle Änderungen behandelt, die global auftreten

  • Definieren Sie eine instance handler Hiermit werden alle Änderungen behandelt, die an dieser bestimmten Instanz auftreten.

Der folgende C # -Code definiert eine Abhängigkeitseigenschaft zum Festlegen der SetText Eigenschaft des Benutzersteuerelements.

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(); 
      }  
   } 
}

Hier ist die XAML-Datei, in der der TextBlock als Benutzersteuerelement definiert ist und ihm die Text-Eigenschaft von der SetText-Abhängigkeitseigenschaft zugewiesen wird.

Der folgende XAML-Code erstellt ein Benutzersteuerelement und initialisiert es SetText Abhängigkeitseigenschaft.

<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>

Lassen Sie uns diese Anwendung ausführen. Sie können sofort feststellen, dass in unserem MainWindow die Abhängigkeitseigenschaft für die Benutzersteuerung erfolgreich als Text verwendet wurde.