WPF-依存関係のプロパティ

WPFアプリケーションでは、依存関係プロパティは、CLRプロパティを拡張する特定の種類のプロパティです。これは、WPFプロパティシステムで利用可能な特定の機能を利用します。

依存関係プロパティを定義するクラスは、から継承する必要があります DependencyObjectクラス。XAMLで使用されるUIコントロールクラスの多くは、DependencyObject クラスとそれらは依存関係プロパティをサポートします。たとえば、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>

XAMLのx:Typeマークアップ拡張機能には、C#のtypeof()と同様の機能があります。<Style TargetType = "{x:TypeButton}">などのオブジェクトのタイプをとる属性が指定されている場合に使用されます。

上記のコードをコンパイルして実行すると、次のようになります。 MainWindow。マウスをボタンの上に置くと、ボタンの前景色が変わります。マウスがボタンを離れると、元の色に戻ります。

依存関係プロパティが必要な理由

依存関係プロパティは、アプリケーションで使用するときにあらゆる種類の利点を提供します。依存関係プロパティは、次のシナリオでCLRプロパティに対して使用できます-

  • スタイルを設定したい場合
  • データバインディングが必要な場合
  • リソース(静的または動的リソース)で設定する場合
  • アニメーションをサポートしたい場合

基本的に、依存関係プロパティは、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(); 
      }  
   } 
}

これは、TextBlockがユーザーコントロールとして定義され、TextプロパティがSetText依存関係プロパティによって割り当てられるXAMLファイルです。

次の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で、ユーザーコントロールの依存関係プロパティがテキストとして正常に使用されていることがすぐにわかります。