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 ของเราคุณสมบัติการพึ่งพาสำหรับการควบคุมผู้ใช้ถูกใช้เป็นข้อความสำเร็จแล้ว