Wpf 속성 종속 추가 속성

13930 단어 WPF
의존 속성
의존 속성은 자신이 값이 없는 것이다. Binding을 통해 데이터 원본에서 값을 얻는 것은 바로 다른 사람에게 의존하는 것이다. 의존 속성을 가진 대상을 의존 대상이라고 한다.
속성에 의존하는 장면은 다음과 같습니다.
1. 스타일에서 속성을 설정할 수 있기를 바랍니다.
2. 속성이 데이터 귀속을 지원하기를 바랍니다.
3. 동적 자원 인용을 사용하여 속성을 설정할 수 있기를 바랍니다.
4. 요소 트리의 부모 요소에서 자동으로 속성 값을 상속하기를 원합니다.
5. 애니메이션 처리를 위한 속성을 원합니다.
6. 속성 시스템이 속성 시스템, 환경 또는 사용자가 수행한 작업이나 스타일을 사용하여 속성의 이전 값을 변경했을 때 보고하기를 바란다.
7. 설정된 WPF 프로세스에서도 사용되는 메타데이터 규약을 사용하고자 합니다. 예를 들어 속성 값을 변경할 때 레이아웃 시스템에 요소의 시각적 대상을 다시 작성해야 하는지 여부를 보고합니다.
의존 대상이 생성될 때 저장 데이터 공간을 포함하지 않습니다.WPF에서는 종속 객체를 종속 속성의 숙주로 사용해야 합니다.
 
종속 속성 선언 및 사용
알림: 의존 속성을 만들 때 코드 세션propdp를 사용할 수 있습니다
 1        <Window x:Class="DeepXAML.MainWindow"

 2              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

 3              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

 4              xmlns:local="clr-namespace:DeepXAML"       

 5              xmlns:sys="clr-namespace:System;assembly=mscorlib"

 6              Title="MainWindow" Height="250" Width="450">

 7          <StackPanel x:Name="stackPanel">

 8              <TextBox x:Name="textBox1" Margin="10"  Text="{Binding Path=Title}"></TextBox>

 9              <TextBox x:Name="textBox2" Margin="10" Text="{Binding Path=Title}"></TextBox>

10          </StackPanel>

11      </Window>    
     using System;

     using System.Collections.Generic;

     using System.Windows;

     using System.Windows.Data;

     using System.Windows.Documents;

       

     namespace DeepXAML

     {

        public partial class MainWindow : Window

         {

             public MainWindow()

             {

                 InitializeComponent();

                 Game game = new Game { Title = "WarCraft" };

                 this.stackPanel.DataContext = game;

             }

         }

       

         public class Game:DependencyObject

         {

             public string Title

             {

                get { return (string)GetValue(NameProperty); }

                 set { SetValue(NameProperty, value); }

             }

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

             public static readonly DependencyProperty NameProperty =

                 DependencyProperty.Register("Title", typeof(string), typeof(Game));        

         }  

     }

DependencyProperty.Register 메소드 해석
a. 첫 번째 매개변수는 종속 속성으로 포장할 CLR 속성을 나타냅니다.
b. 두 번째 매개 변수는 속성에 의존하는 저장 기간의 어떤 유형의 값을 가리킨다
c. 이 의존 속성 숙주의 유형.
속성에 의존하는 값은 어디에 존재합니까?
WPF가 실행될 때, 전역적으로Hashtable 액세스 의존 속성의 값을 유지합니다.
 
2. 추가 속성
부가 속성은 자신이 이 속성이 없으면 어떤 상하문에서 필요하면 부가되는 것이다.예를 들면 TextBox의 Grid.Row 속성, 만약 우리가 TextBox 클래스를 정의할 때 Row 속성을 정의하는 것은 무의미하다. 왜냐하면 우리는 반드시 Grid에 넣을 줄 모르기 때문에 낭비를 초래하기 때문이다.
 1 01     <Window x:Class="DeepXAML.MainWindow"

 2 02             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

 3 03             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

 4 04             xmlns:local="clr-namespace:DeepXAML"       

 5 05             xmlns:sys="clr-namespace:System;assembly=mscorlib"

 6 06             Title="MainWindow" Height="250" Width="450">

 7 07         <Grid>

 8 08             <Grid.RowDefinitions>

 9 09                 <RowDefinition Height="2*"></RowDefinition>

10 10                 <RowDefinition></RowDefinition>

11 11             </Grid.RowDefinitions>

12 12             <TextBox Grid.Row="0"></TextBox>

13 13             <TextBox Grid.Row="1"></TextBox>

14 14         </Grid>

15 15     </Window>

실제로 컴파일한 후에 Grid.Row는 Grid의 클래스에서 SetRow 방법을 생성하고 Grid는 컨트롤을 조정합니다.즉 추가 속성은 생성 방법으로 메모리 공간을 차지하지 않는다.
 1      public class GameAP : DependencyObject

 2      {

 3          public static int GetName(DependencyObject obj)

 4          {

 5              return (int)obj.GetValue(NameProperty);

 6          }

 7        

 8          public static void SetName(DependencyObject obj, int value)

 9          {

10              obj.SetValue(NameProperty, value);

11          }

12        

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

14          public static readonly DependencyProperty NameProperty =

15              DependencyProperty.RegisterAttached("Name", typeof(int), typeof(GameAP), new UIPropertyMetadata(0));

16            

17      }

좋은 웹페이지 즐겨찾기