This article is currently in the process of being translated into Uzbek (~97% done).
Resources
WPF modeli juda qulay funksionallikni taklif etadi: ma'lumotlarni resurs sifatida saqlash, boshqaruv uchun mahalliy, butun oyna uchun mahalliy yoki butun dastur uchun global. Ma'lumotlar amaldagi ma'lumotlardan WPF elementlari ierarxiyasigacha bo'lgan har qanday narsa bo'lishi mumkin. Bu sizga ma'lumotlarni bir joyga qo'yish va keyin uni turli joylarda ishlatish imkonini beradi, bu esa rivojlanish jarayonida foydali bo'lishi mumkin.
Ushbu funksionallik ko'pincha uslublar va shablonlar bilan ishlash uchun ishlatiladi, biz ularni keyinroq qo'llanmada muhokama qilamiz, ammo bu bobda ko'rsatilgandek, resurslar doirasi juda keng. Buni oddiy misol bilan ko'rsataman:
<Window x:Class="WpfTutorialSamples.WPF_Application.ResourceSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
Title="ResourceSample" Height="150" Width="350">
<Window.Resources>
<sys:String x:Key="strHelloWorld">Hello, world!</sys:String>
</Window.Resources>
<StackPanel Margin="10">
<TextBlock Text="{StaticResource strHelloWorld}" FontSize="56" />
<TextBlock>Just another "<TextBlock Text="{StaticResource strHelloWorld}" />" example, but with resources!</TextBlock>
</StackPanel>
</Window>
WPF-dagi manbalarda kalit (x:Key atributi) mavjud bo'lib, u StaticResource belgilash ifodasi bilan kalit yordamida ilovaning istalgan boshqa qismidagi manbalarga murojaat qilish imkonini beradi. Ushbu misolda men oddiygina qatorni resurslarda saqladim, keyinchalik men uni ikki xil TextBlockelementida ishlatganman .
Statik va boshqalar Dinamik manbalar
Yuqoridagi misollarda men resurslarga murojaat qilish uchun StaticResource belgilash kengaytmasidan foydalanganman. Biroq, DynamicResource shaklida alternativa mavjud.
Bu resurslarning asosiy farqi shundaki, statik resurslar (StaticResource) faqat bir marta, XAML fayli yuklangan vaqtda aniqlanadi. Agar keyinchalik dastur ishlayotgan vaqtda resurslar o'zgartirilsa, ular statik bo'lsa, bu o'zgarishlar resurslarda aks ettirilmaydi.
Boshqa tomondan - Dinamik resurslar. Ular kerak bo'lganda aniqlanishi va keyin ish vaqtida qayta belgilanishi mumkin. Buni statik qiymatga bog'lash va qiymatni kuzatib boradigan va qiymat o'zgarganda uni sizga qaytarib yuboradigan funktsiyaga bog'lash deb o'ylab ko'ring. Dinamik resurslar bu tarzda ishlamaydi, lekin men sizga qachon va nimadan foydalanish haqida o'ylash uchun ozgina ovqat berdim. Shuningdek, dinamik resurslar sizga ilovalarni ishlab chiqish vaqtida hali mavjud bo'lmagan resurslardan foydalanish imkonini beradi, masalan: siz ushbu resurslarni CodeBehind-dan dasturni ishga tushirish vaqtida qo'shasiz.
Boshqa turdagi resurslar
Satrni uzatish oddiy vazifa edi, lekin siz resurslar bilan ko'proq narsani qilishingiz mumkin. Men satrlarning to'liq qatorini va gradient fon rangini saqlayman. Bu sizga resurslar bilan nima qilish mumkinligini yaxshiroq tushunishga yordam beradi:
<Window x:Class="WpfTutorialSamples.WPF_Application.ExtendedResourceSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
Title="ExtendedResourceSample" Height="160" Width="300"
Background="{DynamicResource WindowBackgroundBrush}">
<Window.Resources>
<sys:String x:Key="ComboBoxTitle">Items:</sys:String>
<x:Array x:Key="ComboBoxItems" Type="sys:String">
<sys:String>Item #1</sys:String>
<sys:String>Item #2</sys:String>
<sys:String>Item #3</sys:String>
</x:Array>
<LinearGradientBrush x:Key="WindowBackgroundBrush">
<GradientStop Offset="0" Color="Silver"/>
<GradientStop Offset="1" Color="Gray"/>
</LinearGradientBrush>
</Window.Resources>
<StackPanel Margin="10">
<Label Content="{StaticResource ComboBoxTitle}" />
<ComboBox ItemsSource="{StaticResource ComboBoxItems}" />
</StackPanel>
</Window>
Biz yuqorida bir nechta qo'shimcha resurslarni qo'shdik, shuning uchun bizning Oynamiz endi satr, qatorlar qatori va gradient cho'tkasini o'z ichiga oladi. Yorliq uchun satr ishlatiladi, satrlar massivi ComboBox elementlari va gradient cho'tkasi qutining fonida ishlatiladi. Ko'rib turganingizdek, juda ko'p qiziqarli va turli xil narsalarni manba sifatida o'z ichiga olishi mumkin.
Mahalliy va amaliy manbalar
Endi biz resurslarni Oyna(window) darajasida joylashtiramiz, shunda biz ularni Oynaning istalgan joyidan ishlatishimiz mumkin.
Agar sizga faqat bitta tanlangan element uchun resurs kerak bo'lsa, uni butun oynaga emas, balki boshqaruvga manba qo'shish orqali mahalliy sifatida qilishingiz mumkin. Bu xuddi oyna uchun resurslar bilan bir xil ishlaydi, farq shundaki, ular siz resurs saqlagan element darajasidan "etishish" mumkinmi yoki yo'qmi.
<StackPanel Margin="10">
<StackPanel.Resources>
<sys:String x:Key="ComboBoxTitle">Items:</sys:String>
</StackPanel.Resources>
<Label Content="{StaticResource ComboBoxTitle}" />
</StackPanel>
Bunday holda, biz resursni StackPanel-ga qo'shdik va undan keyin uni asosiy element, Label darajasidan ishlatdik. StackPanel ichidagi boshqa elementlar, shuningdek, Yorliqning asosiy elementlari ham undan foydalanishi mumkin. Ammo StackPanel tashqarisidagi elementlar kiritilgan resurslarga kira olmaydi.
Agar siz turli xil oynalardan manbaga kirishingiz kerak bo'lsa, bu ham mumkinligini bilishingiz kerak. App.xaml resurslar bilan bir qatorda oynalarni (va boshqa turdagi elementlarni) o'z ichiga olishi mumkin. Ammo ushbu faylda resurslarni saqlaganingizda, ular loyihadagi barcha oynalar va UserControls uchun global miqyosda mavjud bo'ladi. Bu Windowsda resurslarni saqlash bilan bir xil ishlaydi:
<Application x:Class="WpfTutorialSamples.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
StartupUri="WPF application/ExtendedResourceSample.xaml">
<Application.Resources>
<sys:String x:Key="ComboBoxTitle">Items:</sys:String>
</Application.Resources>
</Application>
Foydalanish bir xil - WPF avtomatik ravishda element oynada saqlanadigan hududga, keyinroq esa App.xaml fayliga o'tadi - kerakli manbani topish:
<Label Content="{StaticResource ComboBoxTitle}" />
CodeBehind-dagi manbalar
Shunday qilib, biz belgilash kengaytmalari yordamida XAML dan barcha resurslarga to'g'ridan-to'g'ri kirishimiz mumkin. Biroq, CodeBehind-dan ham xuddi shunday qilishingiz mumkin, bu ba'zi holatlarda juda foydali bo'lishi mumkin. Oldingi misolda biz resurslarni turli joylarda qanday saqlashingiz mumkinligini ko'rdik, keyingi misol quyida bo'ladi. Biz CodeBehind-dan uchta turli manbaga kirishga harakat qilamiz, ularning har biri boshqa hududda saqlanadi:
App.xaml:
<Application x:Class="WpfTutorialSamples.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
StartupUri="WPF application/ResourcesFromCodeBehindSample.xaml">
<Application.Resources>
<sys:String x:Key="strApp">Hello, Application world!</sys:String>
</Application.Resources>
</Application>
Window:
<Window x:Class="WpfTutorialSamples.WPF_Application.ResourcesFromCodeBehindSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
Title="ResourcesFromCodeBehindSample" Height="175" Width="250">
<Window.Resources>
<sys:String x:Key="strWindow">Hello, Window world!</sys:String>
</Window.Resources>
<DockPanel Margin="10" Name="pnlMain">
<DockPanel.Resources>
<sys:String x:Key="strPanel">Hello, Panel world!</sys:String>
</DockPanel.Resources>
<WrapPanel DockPanel.Dock="Top" HorizontalAlignment="Center" Margin="10">
<Button Name="btnClickMe" Click="btnClickMe_Click">Click me!</Button>
</WrapPanel>
<ListBox Name="lbResult" />
</DockPanel>
</Window>
Code-behind:
using System;
using System.Windows;
namespace WpfTutorialSamples.WPF_Application
{
public partial class ResourcesFromCodeBehindSample : Window
{
public ResourcesFromCodeBehindSample()
{
InitializeComponent();
}
private void btnClickMe_Click(object sender, RoutedEventArgs e)
{
lbResult.Items.Add(pnlMain.FindResource("strPanel").ToString());
lbResult.Items.Add(this.FindResource("strWindow").ToString());
lbResult.Items.Add(Application.Current.FindResource("strApp").ToString());
}
}
}
Shunday qilib, siz ko'rib turganingizdek, biz uchta turli xil "Hello World!” xabarlarini joylashtirdik: bitta resurs App.xaml, biri oyna ichida va bitta asosiy konteynerga mahalliy. Interfeysda tugma va ListBox elementi mavjud.
CodeBehind-da biz yuqoridagi skrinshotda bo'lgani kabi ListBox-ga qatorlar qo'shilgan tugmani bosish hodisasini ko'rib chiqdik. Biz FindResource() usulidan foydalandik , u qidiruv natijasida ob'ektni qaytardi (ob'ekt topilmagan bo'lishi mumkin) va natijani ToString() usuli yordamida satrga aylantirdik.
E'tibor bering, biz FindResource() usulini turli sohalarda ishlatganmiz - avval konteynerda, keyin derazada va nihoyat joriy Application Ilova ob'ektida . Resursni qidirish mumkin bo'ladi, chunki biz qaerdan bilamiz, lekin yuqorida aytib o'tilganidek, agar manba topilmasa, qidiruv butun ierarxiya bo'ylab ko'tariladi. Shuning uchun biz ushbu usulni panelda uch marta ishlatishimiz mumkin. Bardan so'ng, qidiruv oynada davom etadi va agar u qidirayotgan manbani topa olmasa, keyinchalik dastur darajasiga ko'tariladi.
Teskari vaziyat uchun ham xuddi shunday bo'lishi mumkin emas - qidiruv ierarxiyadan pastga yo'naltirilmaydi. Boshqacha qilib aytadigan bo'lsak, agar manba element yoki oynada mahalliy sifatida aniqlangan bo'lsa, dastur darajasida qidirishni boshlay olmaysiz.