늦은 WPF 학습-의존항 속성

5943 단어 WPF
이 장에서는 종속성, 영문 원문인 Dependency Property를 배웁니다. 이것은 전통입니다.Net Framework 속성의 확장은 WPF 전용이지만 다행히 기존 속성과 거의 동일하게 사용됩니다.WPF 요소에서 제공하는 대부분의 속성은 종속성 속성입니다.
1. 의존항 정의: 의존 대상에 의존항 속성만 추가할 수 있습니다. 즉, DependencyObject입니다. WPF의 대부분 요소는 DependencyObject를 계승합니다.속성 정보는 항상 사용할 수 있고 여러 대상 간에 접근을 공유할 수 있기 때문에 Dependency Property 대상을 연결된 클래스의 정적 필드로 설정해야 합니까?나도 잘 모르겠다. 이어서 아래를 보고 설명했다.
예를 들어 FrameworkElement 클래스는 Margin 속성을 정의하고 모든 요소가 이 속성을 공유합니다. 즉, FrameworkElement 클래스에서 Margin을 이렇게 정의해야 합니다.
public class FrameworkElement:UIElement,...
{
   public static readonly DependencyProperty MarginProperty;
   ...
}

종속 속성의 이름은 약정에 따라 종속 속성과 일반 속성의 차이를 식별하기 위해 끝에 "Property"를 붙입니다.
2. 등록 의존항: 사용하기 전에 등록을 해야 한다. 이 단계는 속성을 사용하는 모든 코드가 완성되기 전에 완성해야 하기 때문에 이와 관련된 정적 구조 함수에서 완성해야 한다(readonly 키워드는 이 필드가 정적 구조에서만 수정될 수 있음을 정의한다).WPF는 DP 대상이 직접 실례화되지 않도록 합니다. DP 클래스는 공공 구조 함수가 없기 때문에 오히려 DependencyProperty만 사용할 수 있습니다.Register() 메서드가 생성되고 WPF는 속성 값이 Register 메서드의 매개변수로 정적 구조에서 설정되므로 작성 후 수정할 수 없도록 합니다.
먼저 FrameworkPropertyMetadata를 만들고 (이 값은 의존항 속성을 통해 데이터 귀속, 애니메이션, 로그 등 어떤 서비스를 지원하고 싶은지 표시합니다.) 그리고 DependencyProperty를 사용합니다.Register() 등록
3. 원래처럼 의존항 속성을 사용한다. 등록 후 전통적인 것을 사용한다.Net에서 포장해 보십시오. WPF는 DependencyObject 기본 클래스에 정의된 SetValue와 GetValue 방법을 사용합니다. 다음과 같습니다.
public Thickness Margin{
   set{ SetValue(MarginProperty,value); }
   get{ return (Thickness)GetValue(MarginProperty); }
}

알림, 속성 패키지를 만드는 데는 SetValue와 GetValue 두 가지 방법만 포함해야 하며, 데이터 검증, 이벤트 조작 등이 추가되지 마십시오. 왜냐하면 이 요소들이 정상적인 Set과 Get을 무시할 수 있기 때문입니다.등록 정보 값을 지우려면 Dependency Object의 ClearValue 메서드: myElement.ClearValue(FrameworkElement.MarginProperty)
4. 속성 값 검색: 의존항 속성은 여러 속성 공급자에 의존하기 때문에 공급자마다 자신의 우선순위가 있기 때문에 WPF는 단계별로 검색하는 방식으로 어떤 값을 사용하는지, 그 등급의 순서(낮음에서 높음)를 확정한다.
(1) 기본값, FrameworkPropertyMetadata에서 설정한 값
(2) FrameworkPropertyMetadata가 설정된 경우 상속을 통해Inherits 로고, 차원의 어떤 요소를 포함하는 값을 제공합니다. (솔직히 이 말은 이해하지 못했습니다.)
(3) 주제 스타일의 값
(4) 항목 스타일의 값
(5) 로컬 값, 코드 또는 XAML을 사용하여 직접 설정한 값
위에서 보듯이 하나의 값을 직접 적용하여 전체 단계를 덮어쓸 수 있습니다. 그렇지 않으면 목록의 이전 사용 가능한 항목에 의해 결정됩니다.
5. 공유 의존항 속성: 일부 클래스는 같은 의존항 속성을 공유한다. 예를 들어 TextBlock과 Control에는 모두 FontFamily 속성이 있는데 그들은 같은 정적 의존항 속성을 가리킨다. 이 속성은 실제로는 TextElement 클래스에 정의된 TextElement이다.FontFamilyProperty는 TextElement의 정적 구조 함수로 등록되어 있으며, 그 두 종류는 정적 구조 함수에서 DependencyProperty를 사용합니다.AddOwner() 메서드가 속성을 재사용합니다.
TextBlock.FontFamily = TextElement.FontFamilyProperty.AddOwner( typeof( TextBlock ) )

6. 속성 검증: 속성 값을 검증하는 코드를 속성을 설정하는 논리에 원래처럼 넣지 마십시오. WPF의 속성 설정 시스템을 통해 SetValue 방법으로 직접 설정하여 검증 부분을 무효화시킬 수 있기 때문입니다. WPF는 두 가지 리셋 방법을 제공합니다.
(1) ValidateValueCallback은 새로운 값을 수락하거나 거부할 수 있으며, 일반적으로 속성 제약에 어긋나는 뚜렷한 오류를 포착하는 데 사용되며, DependencyProperty로 사용할 수 있다.Register()의 매개변수 제공
(2) CoerceValueCallback은 새로운 값을 더 받아들일 수 있는 값으로 수정한다. 보통 원래의 값이나 일부 단계의 기본값과 충돌하는 새로운 값을 처리하는데 이 방법은 FrameworkPropertyMetadata를 구성하는 매개 변수로 제공된다.
애플리케이션이 종속성 을 설정하면 다음과 같은 절차를 수행합니다.
(1) CoerceValueCallback은 제공된 값을 수정하거나 DependencyProperty로 돌아갈 기회가 있습니다.UnserValue - 수정이 완전히 거부됩니다.
(2)ValidateValueCallback을 활성화합니다. 이 방법은true로 돌아가면 수정을 받아들이고false로 돌아가면 거부 값을 표시합니다.방법은 속성을 설정한 실제 대상에 접근할 수 없습니다. 이것은 다른 속성 값을 검사할 수 없다는 것을 의미합니다.
(3) 상기 두 가지 방법이 모두 성공했습니다.PropertyChangedCallback 방법을 터치합니다. 이것은 다른 종류에 알리기를 원하면 이벤트를 터치할 수 있습니다.
7. 검증 리셋: 의존항 속성이 등록할 때 Register 방법 중 선택할 수 있는 매개 변수가 있는데 바로 검증 리셋 방법을 설정하는 것이다. 쓰기 방법은 다음과 같다.
MarginProperty = DependencyProperty.Register("Margin",
   typeof(Thickness),typeof(FrameworkElement),metadata,
   new ValidateValueCallback(FrameworkElement.IsMarginValid))

마지막 문장은 리셋을 검증하는 것이다. 리셋 방법은 Object 파라미터를 받아들이고 bool로 돌아가는 방법을 가리켜야 한다. 즉, 문장의 IsMarginValid 방법은 반드시
private static bool IsMarginValid(object value){ }

검증 리셋에 대해 정적 방법이어야 하며 검증 중인 대상에 접근할 권리가 없다는 제한이 있다.얻을 수 있는 정보는 방금 들어온value에 불과하다. 예를 들어 어떤 요소에 맥시무엄과 미니엄 두 가지 속성이 있기 때문에 맥시무m을 설정할 때 미니무엄보다 작으면 안 된다고 판단해야 하지만 이는 리셋 함수에 접근할 수 없기 때문에 검증 함수에서 실현될 수 없다.이 문제를 해결하려면 6에서 언급한 CoerceValueCallback, 즉 강제 콜백을 사용할 수 있습니다.
8. 강제 콜백: FrameworkPropertyCallback을 통해CoerceValueCallback을 사용합니다. 예를 들어
FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata();
metadata.CoerceValueCallback = new CoerceValueCallback( CoerceMaximum );

DependencyProperty.Register( "Maximum",typeof(double),typeof(Rangebase),metadata);

상호 연관된 속성은 CoerceValueCallback에서 처리할 수 있습니다.강제 리셋의 응용에 대해 책에 실례적인 설명이 있는데 잊어버리면 돌아가서 책을 뒤집어라.

좋은 웹페이지 즐겨찾기