WPF - Propriétés de dépendance

Dans les applications WPF, la propriété de dépendance est un type spécifique de propriété qui étend la propriété CLR. Il tire parti des fonctionnalités spécifiques disponibles dans le système de propriétés WPF.

Une classe qui définit une propriété de dépendance doit être héritée du DependencyObjectclasse. La plupart des classes de contrôles d'interface utilisateur utilisées en XAML sont dérivées de laDependencyObject classe et ils prennent en charge les propriétés de dépendance, par exemple, la classe Button prend en charge le IsMouseOver propriété de dépendance.

Le code XAML suivant crée un bouton avec certaines propriétés.

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

L'extension de balisage x: Type en XAML a une fonctionnalité similaire à celle de typeof () en C #. Il est utilisé lorsque des attributs sont spécifiés qui prennent le type de l'objet tels que <Style TargetType = "{x: Type Button}">

Lorsque le code ci-dessus est compilé et exécuté, vous obtiendrez ce qui suit MainWindow. Lorsque la souris est sur le bouton, cela changera la couleur de premier plan d'un bouton. Lorsque la souris quitte le bouton, elle reprend sa couleur d'origine.

Pourquoi nous avons besoin de propriétés de dépendance

La propriété de dépendance vous offre toutes sortes d'avantages lorsque vous l'utilisez dans votre application. La propriété de dépendance peut être utilisée sur une propriété CLR dans les scénarios suivants -

  • Si vous souhaitez définir le style
  • Si vous voulez une liaison de données
  • Si vous souhaitez définir avec une ressource (une ressource statique ou dynamique)
  • Si vous souhaitez prendre en charge l'animation

Fondamentalement, les propriétés de dépendance offrent de nombreuses fonctionnalités que vous n'obtiendrez pas en utilisant une propriété CLR.

La principale différence entre dependency properties et autre CLR properties sont listés ci-dessous -

  • Les propriétés CLR peuvent directement lire / écrire à partir du membre privé d'une classe en utilisant getter et setter. En revanche, les propriétés de dépendance ne sont pas stockées dans l'objet local.

  • Les propriétés de dépendance sont stockées dans un dictionnaire de paires clé / valeur fourni par la classe DependencyObject. Il économise également beaucoup de mémoire car il stocke la propriété lorsqu'elle est modifiée. Il peut également être lié en XAML.

Propriétés de dépendance personnalisées

Dans le framework .NET, les propriétés de dépendance personnalisées peuvent également être définies. Suivez les étapes ci-dessous pour définir la propriété de dépendance personnalisée en C #.

  • Déclarez et enregistrez votre dependency property avec registre d'appels système.

  • Fournir le setter et getter pour la propriété.

  • Définir un static handler qui gérera tous les changements qui se produisent globalement

  • Définir un instance handler qui gérera toutes les modifications apportées à cette instance particulière.

Le code C # suivant définit une propriété de dépendance pour définir le SetText propriété du contrôle utilisateur.

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

Voici le fichier XAML dans lequel le TextBlock est défini en tant que contrôle utilisateur et la propriété Text lui sera affectée par la propriété de dépendance SetText.

Le code XAML suivant crée un contrôle utilisateur et initialise son SetText propriété de dépendance.

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

Lançons cette application. Vous pouvez immédiatement observer que dans notre MainWindow, la propriété de dépendance pour le contrôle utilisateur a été utilisée avec succès en tant que texte.