بررسی Dependency Property ها در WPF
در برنامه های WPF، Dependency Property به نوع خاصی از پراپرتی گرفته می شود که توسعه یافته CLR Property است. در این بخش به بررسی این نوع از پراپرتی های می پردازیم.
توضیحات Dependency Property ها
کلاسی که بخواهد در داخل خود Dependency Property تعریف کند باید از کلاس DependencyObject ارث بری کند. اکثر کلاس های تعریف شده در WPF که مربوط به UI هستند، از این کلاس ارث بری کرده اند و به طور پیشفرض از این نوع خاصیت ها پشتیبانی می کنند. به طور مثال خاصیت IsMouseOver یک Dependency Property است که در اکثر کنترل ها وجود دارد. برای درک بهتر به مثال زیر توجه کنید. در این مثال یک دکمه ساده با استفاده از کدهای XAML ایجاد میکنیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | <Window x:Class="WpfPlayground.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:controls="clr-namespace:WpfPlayground.Views.UserControls" mc:Ignorable="d" Title="SourceSara.Com" Height="400" Width="600" Background="#202C39" TextElement.Foreground="#fafafa" TextElement.FontSize="16" TextElement.FontFamily="Roboto" WindowStartupLocation="CenterScreen"> <Grid HorizontalAlignment="Center" VerticalAlignment="Center"> <Button Padding="16,12" 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> |
در قسمت TargetType مربوط به استایل دکمه نوشته شده است x:Type، این یک Markup Extension است که عملکرد مشابه typeof در سی شارپ را دارد و زمانی از آن استفاده می کنیم که بخواهیم نوع کنترل را مشخص کنیم.
زمانی که کد بالا کامپایل و اجرا شود، پنجره مانند شکل زیر ایجاد می شود که یک دکمه در وسط آن قرار دارد. زمانی که اشاره گر ماوس خود بر روی دکمه قرار گیرد، رنگ متن آن به قرمز تغییر می کند و زمانی که ماوس از روی دکمه برود، رنگ قبلی تنظیم می شود.
کاربرد Dependency Property ها
استفاده از این نوع خاصیت ها، قابلیت های زیادی را در هنگام ساخت برنامه در اختیار ما قرار میدهد. برای مثال:
- زمان تنظیم استایل برای یک کنترل
- زمان بایند کردن داده ها
- زمان تنظیم منابع به صورت static یا dynamic
- زمانی که بخواهیم از animation پشتیبانی کنیم
به طور کلی Dependency Property ها قابلیت هایی را در اختیار شما قرار میدهند که نمی توان آن ها را با استفاده از خاصیت های CLR بدست آورد.
Dependency Property سفارشی
شما به راحتی می توانید Dependency Property های سفارشی خودتان را برای کنترلهای مختلف ایجاد کنید. برای مثال کد زیر مربوط به یک UserControl است، یک خاصیت به نام Text و از نوع Dependency Property را به کنترل SampleControl اضافه می کند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | using System.Windows; namespace WpfPlayground.Views.UserControls { public partial class SampleControl { public SampleControl() { InitializeComponent(); DataContext = this; } public string Text { get => (string)GetValue(TextProperty); set => SetValue(TextProperty, value); } public static readonly DependencyProperty TextProperty = DependencyProperty.Register(nameof(Text), typeof(string), typeof(SampleControl), new UIPropertyMetadata(default)); } } |
کد XAML مربوط به کنترل SampleControl:
1 2 3 4 5 6 7 8 9 10 11 12 13 | <UserControl x:Class="WpfPlayground.Views.UserControls.SampleControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"> <Grid> <TextBlock Text="{Binding Text}"/> </Grid> </UserControl> |
حال می توانیم مانند نمونه زیر از این کنترل و خاصیت سفارشی که خودمان اضافه کردیم، مانند نمونه زیر استفاده کنیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <Window x:Class="WpfPlayground.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:controls="clr-namespace:WpfPlayground.Views.UserControls" mc:Ignorable="d" Title="SourceSara.Com" Height="400" Width="600" Background="#202C39" TextElement.Foreground="#fafafa" TextElement.FontSize="16" TextElement.FontFamily="Roboto" WindowStartupLocation="CenterScreen"> <Grid HorizontalAlignment="Center" VerticalAlignment="Center"> <controls:SampleControl Text="Hello World"/> </Grid> </Window> |
خروجی:
هیچ نظری ثبت نشده است