WPFにおける依存性

14044 ワード

昨日WPFの以降の属性を学び、自分の理解を記録しました.
クラスにプロパティを設定するのは簡単ですが、コントロールにプロパティを設定するのは面倒です.
例えば、自分でbuttonコントロールを作り、buttonから継承します.
 1     class MyButton : Button

 2     {

 3         

 4         private Color _backColor;

 5         public Color BackColor

 6         {

 7             get

 8             {

 9                 return _backColor;

10             }

11             set

12             {

13                 _backColor = value;

14                 this.Background = new SolidColorBrush() { Color = _backColor };

15             }

16         }

17     }

このプロパティの目的は、ボタンの背景色を設定することです.これは問題ありませんが、スタイルを設定するときに問題が発生します.
1     <phone:PhoneApplicationPage.Resources>

2         <Color x:Key="MyForceColor">Red</Color>

3         <Color x:Key="MyBackColor">White</Color>

4         <Style x:Name="mystyle" TargetType="PhoneApp3:MyButton">

5             <Setter Property="BackColor" Value="Red"/>

6         </Style>

このときコンパイルエラーが発生します.つまり、styleでカスタム属性を直接設定できないという意味です.
スタイルで構成するには、使用後のプロパティが必要です.
 1     public class MyButton : Button

 2     {

 3         public static readonly DependencyProperty ForceColorProperty =

 4             DependencyProperty.Register("ForceColor",

 5             typeof(Color),

 6             typeof(MyButton),

 7             new PropertyMetadata(Colors.Black, OnColorChanged));

 8 

 9         public static readonly DependencyProperty BackColorProperty =

10             DependencyProperty.Register("BackColor",

11             typeof(Color),

12             typeof(MyButton),

13             new PropertyMetadata(Colors.White, OnColorChanged));

14 

15         public Color ForceColor

16         {

17             set { SetValue(ForceColorProperty, value); }

18             get { return (Color)GetValue(ForceColorProperty); }

19         }

20         public Color BackColor

21         {

22             set { SetValue(BackColorProperty, value); }

23             get { return (Color)GetValue(BackColorProperty); }

24         }

25 

26         static void OnColorChanged(DependencyObject obj,

27             DependencyPropertyChangedEventArgs args)

28         {

29             var btn = obj as MyButton;

30             if (args.Property == ForceColorProperty)

31             {

32                 btn.Foreground = new SolidColorBrush() { Color = (Color)args.NewValue };

33             }

34             if (args.Property == BackColorProperty)

35             {

36                 btn.Background = new SolidColorBrush() { Color = (Color)args.NewValue };

37             }

38         }

39 

40 

41 

42         

43 

44     }

 
とても穴のお父さん、木があって、とても複雑で、あるかどうか、これは誰が覚えていますか.
しかし、マイクロソフトはショートカットキーを与えてテンプレートを簡単に生成し、「prodp」を入力し、tabキーを2回連続で押すと、自動的にテンプレートを生成することができます.
1         public int MyProperty

2         {

3             get { return (int)GetValue(MyPropertyProperty); }

4             set { SetValue(MyPropertyProperty, value); }

5         }

6 

7         // Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...

8         public static readonly DependencyProperty MyPropertyProperty =

9             DependencyProperty.Register("MyProperty", typeof(int), typeof(ownerclass), new PropertyMetadata(0));

登録関数を見てみましょう
DependencyProperty.Register(
"MyProperty", --
typeof(int), --
typeof(ownerclass), --
new PropertyMetadata(0));--


  static void OnColorChanged(DependencyObject obj,DependencyPropertyChangedEventArgs args)
そして静的であることを忘れないでください.
最後にもう一つ、属性は静的で、つまりグローバルなものなので、処理するときは気をつけてください.
 1         static void OnColorChanged(DependencyObject obj,

 2             DependencyPropertyChangedEventArgs args)

 3         {

 4             var btn = obj as MyButton;  5             if (args.Property == ForceColorProperty)

 6             {

 7                 btn.Foreground = new SolidColorBrush() { Color = (Color)args.NewValue };

 8             }

 9             if (args.Property == BackColorProperty)

10             {

11                 btn.Background = new SolidColorBrush() { Color = (Color)args.NewValue };

12             }

13         }

4行目に注意してください.この文は、私が変更した設定が現在のオブジェクトの設定にすぎないことを保証します.全体ではありません