WPF - คุณสมบัติการพึ่งพา
ในแอ็พพลิเคชัน WPF คุณสมบัติการพึ่งพาเป็นคุณสมบัติเฉพาะชนิดหนึ่งซึ่งขยายคุณสมบัติ CLR ใช้ประโยชน์จากฟังก์ชันเฉพาะที่มีอยู่ในระบบคุณสมบัติ WPF
คลาสที่กำหนดคุณสมบัติการพึ่งพาจะต้องสืบทอดจาก DependencyObjectชั้นเรียน คลาสควบคุม UI จำนวนมากที่ใช้ใน XAML ได้มาจากไฟล์DependencyObject คลาสและรองรับคุณสมบัติการพึ่งพาเช่นคลาสปุ่มรองรับไฟล์ 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>
ส่วนขยายมาร์กอัป x: Type ใน XAML มีฟังก์ชันการทำงานที่คล้ายกันเช่น typeof () ใน C # ใช้เมื่อมีการระบุแอตทริบิวต์ซึ่งรับประเภทของวัตถุเช่น <Style TargetType = "{x: Type Button}">
เมื่อโค้ดด้านบนถูกรวบรวมและดำเนินการคุณจะได้รับสิ่งต่อไปนี้ MainWindow. เมื่อเมาส์อยู่เหนือปุ่มมันจะเปลี่ยนสีพื้นหน้าของปุ่ม เมื่อเมาส์ออกจากปุ่มเมาส์จะเปลี่ยนกลับเป็นสีเดิม
เหตุใดเราจึงต้องการคุณสมบัติการพึ่งพา
ทรัพย์สินอ้างอิงให้ประโยชน์ทุกประเภทแก่คุณเมื่อคุณใช้ในแอปพลิเคชันของคุณ Dependency Property สามารถใช้กับคุณสมบัติ CLR ในสถานการณ์ต่อไปนี้ -
- หากต้องการตั้งค่ารูปแบบ
- หากคุณต้องการเชื่อมโยงข้อมูล
- หากคุณต้องการตั้งค่าด้วยทรัพยากร (ทรัพยากรแบบคงที่หรือแบบไดนามิก)
- หากคุณต้องการสนับสนุนภาพเคลื่อนไหว
โดยทั่วไปคุณสมบัติการพึ่งพามีฟังก์ชันมากมายที่คุณจะไม่ได้รับจากการใช้คุณสมบัติ CLR
ความแตกต่างที่สำคัญระหว่าง dependency properties และอื่น ๆ CLR properties อยู่ด้านล่าง -
คุณสมบัติ CLR สามารถอ่าน / เขียนโดยตรงจากสมาชิกส่วนตัวของคลาสโดยใช้ getter และ setter. ในทางตรงกันข้ามคุณสมบัติการพึ่งพาจะไม่ถูกเก็บไว้ในโลคัลอ็อบเจ็กต์
คุณสมบัติการพึ่งพาจะถูกเก็บไว้ในพจนานุกรมของคู่คีย์ / ค่าซึ่งจัดเตรียมโดยคลาส DependencyObject นอกจากนี้ยังช่วยประหยัดหน่วยความจำได้มากเนื่องจากเก็บทรัพย์สินเมื่อมีการเปลี่ยนแปลง สามารถผูกไว้ใน XAML ได้เช่นกัน
คุณสมบัติการพึ่งพาแบบกำหนดเอง
ใน. NET framework ยังสามารถกำหนดคุณสมบัติการอ้างอิงแบบกำหนดเองได้ ทำตามขั้นตอนด้านล่างเพื่อกำหนดคุณสมบัติการอ้างอิงแบบกำหนดเองใน C #
ประกาศและลงทะเบียนไฟล์ dependency property ด้วยระบบลงทะเบียนโทร
ระบุไฟล์ setter และ getter สำหรับทรัพย์สิน
กำหนด a 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();
}
}
}
นี่คือไฟล์ XAML ซึ่ง TextBlock ถูกกำหนดให้เป็นตัวควบคุมผู้ใช้และคุณสมบัติข้อความจะถูกกำหนดโดยคุณสมบัติการอ้างอิง SetText
รหัส 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 ของเราคุณสมบัติการพึ่งพาสำหรับการควบคุมผู้ใช้ถูกใช้เป็นข้อความสำเร็จแล้ว