C\#에서 WPF 가 속성 에 의존 하 는 올 바른 학습 방법
나 는 WPF 를 공부 하 는 초기 에 의존 속성 에 대한 이해 가 매우 부족 했다.그 나 쁜 결 과 는 내 가 의존 속성 을 쓸 때마다 넘 어 가 는 코드 를 뒤 집어 붙 여 넣 어야 한 다 는 것 이다.
많은 친구 들 이 저 와 같은 경험 을 가지 고 있다 고 믿 기 때문에 이 글 은 속성 에 의존 하 는 것 을 막 배우 기 시작 한 친구 들 에 게 도움 이 되 기 를 바 랍 니 다.
속성 에 의존 하 는 해설 문
초보 자 들 은 바 이 두,구 글,MSDN 이 의존 속성의 정의 와 사용 을 살 펴 보 는 일 에 직면 하 게 될 것 이다.이 글 들 은 모두 잘 쓰 여 있 지만 이미 의존 속성 을 사용 하 는 것 을 배 운 친구 들 에 비해 말이다.
초보 자 에 게 는 오도 라 고 해도 과언 이 아니다.
예 를 들 어 홈 페이지 의 이 글https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/advanced/dependency-properties-overview
의존 속성 을 소개 하 는 것 은 이 렇 습 니 다.
public static readonly DependencyProperty IsSpinningProperty =
DependencyProperty.Register(
"IsSpinning", typeof(Boolean),
typeof(MyCode)
);
public bool IsSpinning
{
get { return (bool)GetValue(IsSpinningProperty); }
set { SetValue(IsSpinningProperty, value); }
}
그 는 정 의 를 내 린 후에 속성 에 의존 하 는 정의 형식 이 이와 같다 고 말 했다.만약 네가 초보 자라 면 의심 하지 않 아 도 매우 어렵다.아무 도 이런 정 의 를 외 울 수 없 기 때문이다.
그 결 과 는 나 와 마찬가지 로 의존 속성 을 정의 할 때마다 붙 여 넣 기 를 복사 해 야 한 다 는 것 이다.그러나 이것 은 가장 큰 나 쁜 결과 가 아니다.가장 큰 나 쁜 결 과 는 너무 복잡 한 정의 로 인해 그 에 대한 이 해 를 포기 하고 속성 에 의존 하여 붙 여 넣 는 것 을 복제 해 야 한 다 는 것 을 기억 하 게 되 었 기 때문에 속성 에 의존 하여 유연 하 게 운용 하 는 능력 을 잃 었 다 는 것 이다.
정확 한 이해 의존 속성
어떻게 의존 속성 을 정확하게 이해 합 니까?
아주 간단 합 니 다.나 누 면 이해 할 수 있 습 니 다.
이제 우 리 는 의존 속성 을 나 누 어 우선 그의 정 의 를 나 누 어 의존 과 속성 을 나 눌 것 이다.
우 리 는 먼저 속성 을 보 았 다.아래 와 같이 우 리 는 속성 을 정의 했다.
private bool _IsSpinning;
public bool IsSpinning
{
get { return _IsSpinning; }
set { _IsSpinning = value; }
}
그 다음 에 저 희 는 Dependency Property 류 를 사용 하여 대상 을 정의 합 니 다.이 대상 은 IsSpinning 속성의 의존 으로 다음 과 같 습 니 다.public static readonly DependencyProperty IsSpinningProperty
그리고 우 리 는 이 의존 대상 을 속성 IsSpinning 이 있 는 클래스 에 등록 합 니 다.다음 과 같 습 니 다.
DependencyProperty.Register( "IsSpinning", typeof(bool), typeof( ));
등록 코드 에서 우 리 는 그 가 세 가지 정 보 를 등록 한 것 을 볼 수 있다.1.현재 Dependency Property 류 가 정의 하 는 대상 IsSpinning Property 는 속성 IsSpinning 에 의존 합 니 다.
2.대상 IsSpinning Property 의 의존 유형 은 속성 IsSpinning 의 유형 과 마찬가지 로 bool 입 니 다.
3.대상 IsSpinning Property 에 등 록 된 클래스 는 속성 IsSpinning 을 설명 하 는 클래스 입 니 다.즉,다른 클래스 에 서 는 의존 대상 을 볼 수 없습니다.
현재,우 리 는 마지막 작업 을 하고 속성 을 수정 하 며,의존 대상 인 IsSpinning Property 와 속성 IsSpinning 을 연결 합 니 다.
어떻게 귀속 합 니까?간단 합 니 다.우리 속성 을 정의 하 는[private bool]IsSpinning]우리 가 방금 정의 한 의존[IsSpinning Property]로 바 꾸 면 됩 니 다.
public bool IsSpinning
{
get { return (bool)GetValue(IsSpinningProperty); }
set { SetValue(IsSpinningProperty, value); }
}
여기 서 우 리 는 속성 에 값 을 부여 하고 값 을 취 할 때 GetValue 와 SetValue 를 사 용 했 습 니 다.그들 둘 은 어디에서 왔 습 니까?F12 를 사용 하여 추적 해 보 니 Dependency Property 에서 정의 하 는 방법 인 것 같 습 니 다.그런데 왜 우 리 는 창문 에서 도 사용 할 수 있 습 니까?
간단 합 니 다.Window 의 부모 클래스 를 따라 가 보 니 마지막 부모 클래스 인 Visual 이 Dependency Property 를 계승 한 것 을 발 견 했 습 니 다.그래서 우 리 는 GetValue 와 SetValue 를 직접 사용 하여 의존 대상 의 값 을 부여 하고 가 져 올 수 있 습 니 다.클래스 Dependency Property 를 계승 한 하위 클래스 라면 의존 속성 을 사용 할 수 있다 는 것 이다.
전체 버 전 의존 속성 정의 코드:
public static readonly DependencyProperty IsSpinningProperty =
DependencyProperty.Register("IsSpinning", typeof(bool), typeof(DependecyUserControl));
public bool IsSpinning
{
get { return (bool)GetValue(IsSpinningProperty); }
set { SetValue(IsSpinningProperty, value); }
}
여기까지 속성 에 의존 하 는 분할 이 끝 났 습 니 다.이제 속성 에 의존 하 는 것 이 무엇 인지 잘 아 시 겠 죠?이제 속성 에 의존 한 다 는 개념 을 이해 하 게 되 었 습 니 다.조금 만 익숙해 지면 손 으로 두 드 리 는 의존 속성 을 실현 하 는 것 은 꿈 이 아 닙 니 다.
PS:속성 에 의존 하 는 이름 은 속성 명+Property 여야 한 다 는 것 을 알려 준 사람 이 있 습 니까?그리고 믿 습 니 다.하하.
속성 에 의존 하 는 간단 한 응용
이제 속성 에 의존 하 는 시스템 컨트롤 을 정의 해서 기억 을 깊 게 합 시다.
public class KButton : Button
{
public static readonly DependencyProperty ForeImageProperty;
public static readonly DependencyProperty BackImageProperty;
public static readonly DependencyProperty MouseOverBackColorProperty;
public static readonly DependencyProperty StretchProperty;
static KButton()
{
ForeImageProperty = DependencyProperty.Register("ForeImage", typeof(string), typeof(KButton),null);
ForeImageProperty = DependencyProperty.Register("BackImage", typeof(string), typeof(KButton),null);
MouseOverBackColorProperty = DependencyProperty.Register("MouseOverBackColor", typeof(Brush), typeof(KButton), null);
StretchProperty = DependencyProperty.Register("Stretch", typeof(Stretch), typeof(KButton), null);
DefaultStyleKeyProperty.OverrideMetadata(typeof(KButton), new FrameworkPropertyMetadata(typeof(KButton)));// KButton KButton , Button
}
public string ForeImage
{
get { return (string)GetValue(ForeImageProperty); }
set { SetValue(ForeImageProperty, value); }
}
public string BackImage
{
get { return (string)GetValue(BackImageProperty); }
set { SetValue(BackImageProperty, value); }
}
public Brush MouseOverBackColor
{
get { return (Brush)GetValue(MouseOverBackColorProperty); }
set { SetValue(MouseOverBackColorProperty, value); }
}
public Stretch Stretch
{
get { return (Stretch)GetValue(StretchProperty); }
set { SetValue(StretchProperty, value); }
}
}
상기 코드 에서 보 듯 이 우 리 는 Button 에 계승 하 는 클래스 Kbutton 을 정의 했다.Kbuttion 에서 우 리 는 네 개의 의존 속성 을 정의 했다.
ForeImageProperty:단추 의 전경 그림 입 니 다.
BackImageProperty:단추 의 배경 그림 입 니 다.
마우스 오 버 백 ColorProperty:마우스 가 지나 갈 때의 색 을 누 르 십시오.
StretchProperty:단추 그림 의 스 트 레 칭 모드 입 니 다.
코드 는 매우 간결 합 니 다.네 개의 의존 속성 을 제외 하고 아무것도 없습니다.이제 K button 형식의 스타일 을 정의 하 러 갑 니 다.
프 리 젠 테 이 션 편 의 를 위해 서 나 는 직접 스타일 을 App.xaml 파일 에 정의 했다.
<Style TargetType="{x:Type local:KButton}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<DockPanel Name="dpCon" Width="{Binding Width, RelativeSource={x:Static RelativeSource.TemplatedParent}}"
Height="{Binding Height, RelativeSource={x:Static RelativeSource.TemplatedParent}}"
Background="{Binding Background, RelativeSource={x:Static RelativeSource.TemplatedParent}}"
ToolTip="{Binding ToolTip, RelativeSource={x:Static RelativeSource.TemplatedParent}}"
>
<DockPanel DockPanel.Dock="Top" Name="dpBtn">
<DockPanel.Background>
<ImageBrush ImageSource="{Binding ForeImage, RelativeSource={x:Static RelativeSource.TemplatedParent}}" Stretch="{Binding Stretch,RelativeSource={x:Static RelativeSource.TemplatedParent}}"/>
</DockPanel.Background>
<TextBlock FontSize="15" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="#f9fcff" Text="{Binding Content, RelativeSource={x:Static RelativeSource.TemplatedParent}}"></TextBlock>
</DockPanel>
</DockPanel>
<ControlTemplate.Triggers>
<DataTrigger Binding="{Binding IsMouseOver,RelativeSource={x:Static RelativeSource.Self}}" Value="True">
<Setter Property="Background" TargetName="dpBtn">
<Setter.Value>
<ImageBrush ImageSource="{Binding BackImage, RelativeSource={x:Static RelativeSource.TemplatedParent}}" Stretch="{Binding Stretch,RelativeSource={x:Static RelativeSource.TemplatedParent}}"/>
</Setter.Value>
</Setter>
<Setter Property="Background" TargetName="dpCon" Value="{Binding MouseOverBackColor, RelativeSource={x:Static RelativeSource.TemplatedParent}}"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding BackImage,RelativeSource={x:Static RelativeSource.Self},Mode=TwoWay}" Value="{x:Null}">
<Setter Property="Background" TargetName="dpBtn">
<Setter.Value>
<ImageBrush ImageSource="{Binding ForeImage, RelativeSource={x:Static RelativeSource.TemplatedParent}}" Stretch="{Binding Stretch,RelativeSource={x:Static RelativeSource.TemplatedParent}}"/>
</Setter.Value>
</Setter>
</DataTrigger>
<Trigger Property="IsEnabled" Value="true"/>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="Gray"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
스타일 코드 는 위 와 같이 매우 간단 합 니 다.템 플 릿 을 정의 한 다음 템 플 릿 에 단추 배경 그림 과 단추 텍스트 의 위 치 를 놓 는 것 입 니 다.그리고 우리 가 정 의 했 던 의존 속성 을 대응 하 는 값 에 연결 합 니 다.그 중에서 주의해 야 할 것 은 템 플 릿 에 사용자 정의 의존 속성 을 연결 하 는 것 입 니 다.예 를 들 어 RelativeSource.Templated Parent 를 사용 하 는 것 입 니 다.
{Binding ForeImage,
RelativeSource={x:Static RelativeSource.TemplatedParent}}。
템 플 릿 의 데이터 이벤트 DataTrigger 에서 귀속 의존 속성 모델 은 두 가지 로 나 뉜 다.첫 번 째,데이터 이벤트 DataTrigger 를 연결 하 는 조건 은 RelativeSource.self 를 사용 합 니 다.예 를 들 어
{Binding IsMouseOver,RelativeSource={x:Static RelativeSource.Self}}。
두 번 째,조건 이 성립 되 고 템 플 릿 변 화 를 촉발 할 때 RelativeSource.TemplatedParent 를 사용 합 니 다.예 를 들 어{Binding BackImage, RelativeSource={x:Static RelativeSource.TemplatedParent}}
----------------------------------------------------------------------------------------------------이제 우리 가 만 든 사용자 정의 컨트롤 을 사용 합 니 다.코드 는 다음 과 같 습 니 다.
<DockPanel>
<StackPanel>
<local:KButton Height="50" Width="50" Stretch="None" ForeImage="/Image/ .png" BackImage="/Image/ .png" Background="Gray" MouseOverBackColor="Brown"/>
<local:KButton Height="50" Width="50" Margin="0,10,0,0" Stretch="None" ForeImage="/Image/ .png" Background="Gray" MouseOverBackColor="Brown"/>
<local:KButton Height="100" Width="100" Margin="0,10,0,0" Content=" " Stretch="Fill" ForeImage="/Image/ .png" Background="Gray" MouseOverBackColor="Brown"/>
</StackPanel>
</DockPanel>
인터페이스 효 과 는 다음 과 같 습 니 다:사용자 정의 컨트롤 에서 의존 속성 사용
우선 새 항목 을 추가 한 다음 사용자 컨트롤 을 선택 하 십시오.
그 다음 에 저 희 는 의존 속성 HeaderTitle 을 추가 하고 현재 컨트롤 의 DataContext 를 자신 으로 설정 합 니 다--this.Data Context=this.
public string HeaderTitle
{
get { return (string)GetValue(HeaderTitleProperty); }
set { SetValue(HeaderTitleProperty, value); }
}
public static readonly DependencyProperty HeaderTitleProperty = DependencyProperty.Register("HeaderTitle", typeof(string), typeof(DependecyUserControl), null);
public DependecyUserControl()
{
this.DataContext = this;
InitializeComponent();
}
현재 사용자 컨트롤 의 Xaml 페이지 에 TextBlock 을 추가 하고 그의 Text 를 우리 가 방금 정의 한 HeaderTitle 로 연결 합 니 다.코드 는 다음 과 같 습 니 다.
<Grid>
<TextBlock Text = "{Binding HeaderTitle}" TextAlignment="Center"></TextBlock>
</Grid>
이어서 우 리 는 메 인 창 으로 돌아 가서 이 사용자 컨트롤 을 참조 합 니 다.코드 는 다음 과 같 습 니 다.
<local:DependecyUserControl Height = "30" HeaderTitle=" Header" DockPanel.Dock="Top"></local:DependecyUserControl>
실행 결과:홈 페이지 에 사용자 컨트롤 의 의존 속성 을 성공 적 으로 설정 하고 사용자 컨트롤 에 있 는 TextBlock 의 Text 속성 을 성공 적 으로 연결 한 것 을 볼 수 있 습 니 다.즉,Header 의 Title 동적 설정 을 간단하게 구현 한 것 이다.
결어
WPF 는 매우 강력 한 사용자 정의 능력 을 가지 고 있 으 며,의존 속성 을 정확하게 배 우 는 것 이 강력 한 첫걸음 임 을 깨 달 았 다.
----------------------------------------------------------------------------------------------------
이에 따라 WPF 가 속성 에 의존 하 는 올 바른 학습 방법 에 대한 설명 이 완료 되 었 습 니 다.
코드 가 Github 에 전송 되 었 습 니 다.다운로드 환영 합 니 다.
Github 주소:https://github.com/kiba518/WpfDependency
총결산
위 에서 말 한 것 은 소 편 이 여러분 에 게 소개 한 C\#중 WPF 가 속성 에 의존 하 는 정확 한 학습 방법 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 저 에 게 메 시 지 를 남 겨 주세요.소 편 은 신속하게 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
만약 당신 이 본문 이 당신 에 게 도움 이 된다 고 생각한다 면,전 재 를 환영 합 니 다.번 거 로 우 시 겠 지만 출처 를 밝 혀 주 십시오.감사합니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.