منابع در WPF – آموزش WPF

wpf resources 10637 تصویر

منابع در WPF

منابع در WPF کاربردی شبیه به CSS در HTML دارد. منابع (Resources) اشیایی هستند که پیش بینی می شود بیش از یک بار مورد استفاده قرار گیرند. بنابراین آن ها را به صورت Resource تعریف می کنیم تا در جاهای مختلف بتوانیم از آن استفاده کنیم. منابع را می توان در سه سطح زیر تعریف کرد:

  • محلی (local): یعنی منابع فقط در دسترس عنصری که در داخل آن تعریف شده و عناصر فرزند آن قرار دارد.
  • عنصر ریشه (مثلا Window): یعنی منابع در دسترسی کل عناصر فرزند عنصر ریشه قرار دارد.
  • سراسری (کل برنامه): یعنی منابع در کل برنامه قابل دسترسی هستند.

هنگام تعریف منابع می توانیم یک کلید هم برای آن ها مشخص کنیم. برای مثال اگر یک استایل خاص برای یک نوع button داشته باشیم می توانیم استایل مربوط به آن را به صورت یک Resource تعریف کرده و کلیدی مثل MyCustomButton را به آن بدهیم و سپس در برنامه هر جا که بخواهیم از این استایل استفاده کنیم، کافیست با کمک یکی از Markup Extension های زیر آن را تنظیم کنیم:

  • StaticResource
  • DynamicResource

تفاوت دو مورد بالا در این است که StaticResource فقط یک بار در زمان اولین بارگیری XAML منابع را تنظیم می کند و هر تغییری که بعد از آن در منابع رخ دهد نادیده گرفته می شود. اما DynamicResource به جای تنظیم مقدار منابع در هنگام اولین بارگیری XAML، یک Expression تنظیم می کند و هر زمان که کنترل نیاز به مقدار منابع مشخص شده داشته باشد، آن Expression اجرا می شود و مقدار جاری منابع برای کنترل تنظیم می شود. به زبان ساده‌تر هر زمان که لازم باشد، مقدار مورد نظر از منبع مشخص شده لود می گردد.

مثال

برای مشاهده نحوه عمل کرد دو مورد ذکر شده در بالا، یک پروژه WPF با نام WPFResource ایجاد کرده و آن را مانند نمونه زیر تغییر دهید. محتوای فایل MainWindow.xaml:

<Window x:Class = "WPFResources.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:local = "clr-namespace:WPFResources" 
   mc:Ignorable = "d" Title = "MainWindow" Height = "350" Width = "525"> 
	
   <Window.Resources> 
      <SolidColorBrush x:Key = "brushResource" Color = "Blue" /> 
   </Window.Resources> 
	
   <StackPanel> 
      <Rectangle Height = "50" Margin = "20" Fill = "{StaticResource brushResource}" /> 
      <Rectangle Height = "50" Margin = "20" Fill = "{DynamicResource brushResource}" /> 
      <Button x:Name = "changeResourceButton"
         Content = "_Change Resource" Click = "changeResourceButton_Click" /> 
   </StackPanel> 
	
</Window>

در کد فوق دو کنترل Rectangle ایجاد شده است که رنگ پر کننده اولی به صورت StaticResource و دومی هم به صورت DynamicResource بر روی brushResource تنظیم شده است. در بخش سی شارپ برای تغییر مقدار Resource می توانید از تکه کد زیر استفاده کنید:

private void changeResourceButton_Click(object sender, EventArgs e)
{
    SolidColorBrush MyBrush = Brushes.Red;
    Application.Current.Resources["themeColour"] = MyBrush;
}

زمانی که مثال فوق را کامپایل و اجرا کنید، خروجی زیر را تولید خواهد کرد:

wpf resources 10637 1 تصویر

اگر بر روی دکمه Change Resource کلیک کنید، رنگ Rectangle دوم که به صورت DynamicResource بود، به روز خواهد شد:

wpf resources 10637 2 تصویر

دیکشنری منابع (Resource Dictionaries)

دیکشنری منابع در XAML به این معنی است که منابع در فایل های جداگانه نگه داری می شوند. تعریف منابع به صورت فایل های جداگانه می تواند مزایای زیر را داشته باشد:

  • جدا سازی کد مربوط به UI و منابع (یعنی کد تمیز تر)
  • تعریف منابع در یک فایل جدا مانند XAML باعث می شود که در کل برنامه در دسترس باشند.

حال چگونه باید منابع را در فایل های جداگانه تعریف کنیم؟ خوب این کار چندان پیچیده نیست، فقط کافیست مراحل زیر را دنبال کنید:

  • در Solution Explorer یک فولدر جدید با نام ResourceDictionaries ایجاد کنید.
  • بر روی فولدر ایجاد شده کلیک راست کرده و از زیر منوی Add گزینه Resource Dictionary را انتخاب کنید. نام فایل جدید را XAML بگذارید.

مثال

مثال قبلی را در نظر بگیرید، با این تفاوت که در اینجا رنگ تعریف شده در بخش منابع Window به ResourceDictionary منتقل شده است.

<Window x:Class = "WPFResources.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:local = "clr-namespace:WPFResources" 
   mc:Ignorable = "d" Title = "MainWindow" Height = "350" Width = "525"> 
	
   <StackPanel> 
      <Rectangle Height = "50" Margin = "20" Fill = "{StaticResource brushResource}" /> 
      <Rectangle Height = "50" Margin = "20" Fill = "{DynamicResource brushResource}" /> 
      <Button x:Name = "changeResourceButton"
         Content = "_Change Resource" Click = "changeResourceButton_Click" /> 
   </StackPanel> 
	
</Window>

محتوای فایل DictionaryWithBrush.xaml:

<ResourceDictionary xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
   xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"> 
	
   <SolidColorBrush x:Key = "brushResource" Color = "Blue" /> 
</ResourceDictionary>

محتوای فایل App.xaml:

<Application x:Class="WPFResources.App" 
   xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
   xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml" 
   StartupUri = "MainWindow.xaml"> 
	
   <Application.Resources> 
      <ResourceDictionary Source = " XAMLResources\ResourceDictionaries\DictionaryWithBrush.xaml"/> 
   </Application.Resources> 
	
</Application>

زمانی که مثال فوق را کامپایل و اجرا کنید، خروجی زیر را تولید خواهد کرد:

wpf resources 10637 1 تصویر

اگر بر روی دکمه Change Resource کلیک کنید، رنگ Rectangle دوم که به صورت DynamicResource بود، به روز خواهد شد:

wpf resources 10637 2 تصویر

نوشته منابع در WPF – آموزش WPF اولین بار در سورس سرا - آموزش برنامه نویسی. پدیدار شد.

درباره نویسنده: administrator

ممکن است دوست داشته باشید

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *