Kaynak sözlükleri
.NET Çok Platformlu Uygulama Kullanıcı Arabirimi (.NET MAUI), ResourceDictionary .NET MAUI uygulaması tarafından kullanılan kaynaklar için bir depodur. Bir içinde ResourceDictionary depolanan tipik kaynaklar stiller, denetim şablonları, veri şablonları, dönüştürücüler ve renklerdir.
içinde ResourceDictionary depolanan XAML kaynaklarına başvurulabilir ve veya DynamicResource
işaretleme uzantısı kullanılarak öğelere StaticResource
uygulanabilir. C# dilinde kaynaklar da bir ResourceDictionary içinde tanımlanabilir ve ardından dize tabanlı dizin oluşturucu kullanılarak öğelere başvurulup uygulanabilir.
Bahşiş
Visual Studio'da, arka planda kod dosyası tarafından yedeklenen XAML tabanlı ResourceDictionary bir dosya .NET MAUI ResourceDictionary (XAML) öğe şablonu tarafından projenize eklenebilir.
Kaynak oluşturma
Türetilen her VisualElement nesnenin, kaynak içerebilen bir ResourceDictionary özelliği vardırResources
. Benzer şekilde, türetilmiş bir Application
Resources
nesnenin, kaynak içerebilen bir ResourceDictionary özelliği vardır.
.NET MAUI uygulaması yalnızca öğesinden Application
türetilen tek bir sınıf içerebilir, ancak genellikle sayfalar, düzenler ve görünümler dahil olmak üzere öğesinden VisualElementtüretilen birçok sınıfı kullanır. Bu nesnelerden herhangi birinin özelliği, içeren kaynaklar ResourceDictionary olarak ayarlanmış olabilirResources
. Kaynakların kullanılabilmesi için belirli ResourceDictionary bir etkinin nereye koyulacağını seçme:
- veya Labelgibi Button bir ResourceDictionary görünüme eklenmiş olan bir içindeki kaynaklar yalnızca belirli bir nesneye uygulanabilir.
- Veya Gridgibi StackLayout bir ResourceDictionary düzene eklenmiş bir düzendeki kaynaklar düzene ve bu düzenin tüm alt öğelerine uygulanabilir.
- Sayfa düzeyinde tanımlanan bir ResourceDictionary içindeki kaynaklar sayfaya ve tüm alt öğelerine uygulanabilir.
- Uygulama düzeyinde tanımlanan bir ResourceDictionary içindeki kaynaklar uygulama genelinde uygulanabilir.
Örtük stiller dışında, kaynak sözlüğündeki her kaynağın özniteliğiyle x:Key
tanımlanan benzersiz bir dize anahtarı olmalıdır.
Aşağıdaki XAML, App.xaml dosyasında bir uygulama düzeyinde ResourceDictionarytanımlanan kaynakları gösterir:
<Application xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="ResourceDictionaryDemo.App">
<Application.Resources>
<Thickness x:Key="PageMargin">20</Thickness>
<!-- Colors -->
<Color x:Key="AppBackgroundColor">AliceBlue</Color>
<Color x:Key="NavigationBarColor">#1976D2</Color>
<Color x:Key="NavigationBarTextColor">White</Color>
<Color x:Key="NormalTextColor">Black</Color>
<!-- Images -->
<x:String x:Key="BackgroundImage">background</x:String>
<x:String x:Key="MenuIcon">menu.png</x:String>
<x:String x:Key="SearchIcon">search.png</x:String>
<!-- Implicit styles -->
<Style TargetType="NavigationPage">
<Setter Property="BarBackgroundColor"
Value="{StaticResource NavigationBarColor}" />
<Setter Property="BarTextColor"
Value="{StaticResource NavigationBarTextColor}" />
</Style>
<Style TargetType="ContentPage"
ApplyToDerivedTypes="True">
<Setter Property="BackgroundColor"
Value="{StaticResource AppBackgroundColor}" />
</Style>
</Application.Resources>
</Application>
Bu örnekte kaynak sözlüğü bir Thickness
kaynağı, birden çok Color kaynağı ve iki örtük Style kaynağı tanımlar.
Önemli
Doğrudan özellik öğesi etiketleri arasına Resources
kaynak eklemek otomatik olarak bir ResourceDictionary nesne oluşturur. Ancak, tüm kaynakları isteğe bağlı ResourceDictionary etiketler arasına yerleştirmek de geçerlidir.
Kaynakları kullanma
Her kaynağın özniteliği kullanılarak x:Key
belirtilen bir anahtarı vardır ve bu, içinde ResourceDictionarykendi sözlük anahtarı olur. anahtarı, veya DynamicResource
XAML işaretleme uzantısı ile StaticResource
kaynağından ResourceDictionary bir kaynağa başvurmak için kullanılır.
İşaretlemeyi StaticResource
uzantısı, kaynak sözlüğündeki DynamicResource
bir değere başvurmak için sözlük anahtarı kullanan işaretleme uzantısına benzer. Ancak, işaretleme uzantısı tek bir sözlük araması gerçekleştirirken StaticResource
, DynamicResource
işaretleme uzantısı sözlük anahtarına bir bağlantı tutar. Bu nedenle, anahtarla ilişkili sözlük girdisi değiştirilirse, değişiklik görsel öğesine uygulanır. Bu, bir uygulamada çalışma zamanı kaynak değişikliklerinin yapılmasını sağlar. biçimlendirme uzantıları hakkında daha fazla bilgi için bkz . XAML işaretleme uzantıları.
Aşağıdaki XAML örneğinde kaynakların nasıl tüketilip bir içinde StackLayoutek kaynak tanımlanacağı gösterilmektedir:
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="ResourceDictionaryDemo.MainPage"
Title="Main page">
<StackLayout Margin="{StaticResource PageMargin}"
Spacing="6">
<StackLayout.Resources>
<!-- Implicit style -->
<Style TargetType="Button">
<Setter Property="FontSize" Value="14" />
<Setter Property="BackgroundColor" Value="#1976D2" />
<Setter Property="TextColor" Value="White" />
<Setter Property="CornerRadius" Value="5" />
</Style>
</StackLayout.Resources>
<Label Text="This app demonstrates consuming resources that have been defined in resource dictionaries." />
<Button Text="Navigate"
Clicked="OnNavigateButtonClicked" />
</StackLayout>
</ContentPage>
Bu örnekte nesnesi, ContentPage uygulama düzeyi kaynak sözlüğünde tanımlanan örtük stili tüketir. StackLayout nesnesi, uygulama düzeyi kaynak sözlüğünde tanımlanan kaynağı kullanırkenPageMargin
, Button nesne ise kaynak sözlüğünde StackLayout tanımlanan örtük stili tüketir. Bu, aşağıdaki ekran görüntüsünde gösterilen görünüme neden olur:
Önemli
Tek bir sayfaya özgü kaynaklar uygulama düzeyi kaynak sözlüğüne dahil edilmemelidir, çünkü bu tür kaynaklar bir sayfanın gerektirdiği durumlarda değil uygulama başlangıcında ayrıştırılır. Daha fazla bilgi için bkz . Uygulama kaynak sözlüğü boyutunu küçültme.
Kaynak arama davranışı
Veya işaretleme uzantısıyla StaticResource
DynamicResource
bir kaynağa başvurulduğunda aşağıdaki arama işlemi gerçekleşir:
- İstenen anahtar, varsa, özelliği ayarlayan öğe için kaynak sözlüğünde denetlendi. İstenen anahtar bulunursa değeri döndürülür ve arama işlemi sonlandırılır.
- Eşleşme bulunamazsa, arama işlemi görsel ağacı yukarı doğru arar ve her üst öğenin kaynak sözlüğünü denetler. İstenen anahtar bulunursa değeri döndürülür ve arama işlemi sonlandırılır. Aksi takdirde, kök öğeye ulaşılana kadar işlem yukarı doğru devam eder.
- Kök öğesinde eşleşme bulunamazsa, uygulama düzeyi kaynak sözlüğü incelenmiş olur.
- Eşleşme hala bulunamazsa, bir
XamlParseException
oluşturulur.
Bu nedenle, XAML ayrıştırıcısı bir StaticResource
veya DynamicResource
işaretleme uzantısıyla karşılaştığında, bulduğu ilk eşleşmeyi kullanarak görsel ağaçta yukarı doğru ilerleyerek eşleşen bir anahtar arar. Bu arama sayfada sona erer ve anahtar hala bulunamazsa, XAML ayrıştırıcısı nesneye eklenen öğesini ResourceDictionaryApp
arar. Anahtar hala bulunamazsa bir özel durum oluşturulur.
Kaynakları geçersiz kılma
Kaynaklar anahtarları paylaştığında, görsel ağaçta daha altta tanımlanan kaynaklar daha yüksek tanımlı kaynaklara göre öncelikli olur. Örneğin, bir AppBackgroundColor
kaynağın AliceBlue
uygulama düzeyinde olarak ayarlanması, olarak ayarlanmış Teal
bir sayfa düzeyi AppBackgroundColor
kaynağı tarafından geçersiz kılınacaktır. Benzer şekilde, sayfa düzeyi AppBackgroundColor
kaynağı bir düzen veya görünüm düzeyi AppBackgroundColor
kaynağı tarafından geçersiz kılınacaktır.
Tek başına kaynak sözlükleri
Bir ResourceDictionary , arka planda kod dosyası tarafından desteklenmeyen tek başına bir XAML dosyası olarak da oluşturulabilir. Tek başına ResourceDictionaryoluşturmak için projeye .NET MAUI ResourceDictionary (XAML) öğesi şablonuyla yeni ResourceDictionary bir dosya ekleyin ve arka planda kod dosyasını silin. Ardından, XAML dosyasında özniteliğini dosyanın başlangıcına yakın olan etiketten ResourceDictionary kaldırınx:Class
. Ayrıca, XAML'nin derlendiğinden emin olmak için XML üst bilgisinin arkasına ekleyin <?xaml-comp compile="true" ?>
.
Dekont
Tek başına ResourceDictionary bir MauiXaml derleme eylemine sahip olmalıdır.
Aşağıdaki XAML örneği MyResourceDictionary.xaml adlı tek başına ResourceDictionary bir örneği gösterir:
<?xml version="1.0" encoding="UTF-8" ?>
<?xaml-comp compile="true" ?>
<ResourceDictionary xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
<DataTemplate x:Key="PersonDataTemplate">
<ViewCell>
<Grid RowSpacing="6"
ColumnSpacing="6">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.5*" />
<ColumnDefinition Width="0.2*" />
<ColumnDefinition Width="0.3*" />
</Grid.ColumnDefinitions>
<Label Text="{Binding Name}"
TextColor="{StaticResource NormalTextColor}"
FontAttributes="Bold" />
<Label Grid.Column="1"
Text="{Binding Age}"
TextColor="{StaticResource NormalTextColor}" />
<Label Grid.Column="2"
Text="{Binding Location}"
TextColor="{StaticResource NormalTextColor}"
HorizontalTextAlignment="End" />
</Grid>
</ViewCell>
</DataTemplate>
</ResourceDictionary>
Bu örnekte, ResourceDictionary türünde DataTemplatebir nesne olan tek bir kaynak içerir. MyResourceDictionary.xaml , başka bir kaynak sözlüğünde birleştirilerek kullanılabilir.
Kaynak sözlüklerini birleştirme
Kaynak sözlükleri, bir veya daha fazla ResourceDictionary nesne başka bir ile birleştirilerek birleştirilebilir ResourceDictionary.
Yerel kaynak sözlüklerini birleştirme
Yerel ResourceDictionary bir dosya, özelliği XAML dosyasının dosya adına ayarlanmış bir nesne Source
oluşturularak başka ResourceDictionary bir ResourceDictionary dosyayla birleştirilebilir:
<ContentPage ...>
<ContentPage.Resources>
<!-- Add more resources here -->
<ResourceDictionary Source="MyResourceDictionary.xaml" />
<!-- Add more resources here -->
</ContentPage.Resources>
...
</ContentPage>
Bu söz dizimi sınıfın örneğini MyResourceDictionary
oluşturmaz. Bunun yerine XAML dosyasına başvurur. Bu nedenle özelliği ayarlarken Source
arka plan kod dosyası gerekmez ve x:Class
özniteliği MyResourceDictionary.xaml dosyasının kök etiketinden kaldırılabilir.
Önemli
ResourceDictionary.Source
özelliği yalnızca XAML'den ayarlanabilir.
Diğer derlemelerden kaynak sözlüklerini birleştirme
AResourceDictionary, özelliğine ResourceDictionaryeklenerek başka bir ResourceDictionary taneyle MergedDictionaries
de birleştirilebilir. Bu teknik, bulundukları derlemeden bağımsız olarak kaynak sözlüklerinin birleştirilmesini sağlar. Dış derlemelerden kaynak sözlüklerinin birleştirilmesi için, bir derleme eyleminin ResourceDictionary MauiXaml olarak ayarlanması, arka plan kod dosyası olması ve özniteliğinin dosyanın kök etiketinde tanımlanması x:Class
gerekir.
Uyarı
ResourceDictionary sınıfı da bir MergedWith
özellik tanımlar. Ancak, bu özellik kullanım dışı bırakıldı ve artık kullanılmamalıdır.
Aşağıdaki kod örneği, bir sayfa düzeyi ResourceDictionarykoleksiyonuna MergedDictionaries
eklenen iki kaynak sözlüklerini gösterir:
<ContentPage ...
xmlns:local="clr-namespace:ResourceDictionaryDemo"
xmlns:theme="clr-namespace:MyThemes;assembly=MyThemes">
<ContentPage.Resources>
<ResourceDictionary>
<!-- Add more resources here -->
<ResourceDictionary.MergedDictionaries>
<!-- Add more resource dictionaries here -->
<local:MyResourceDictionary />
<theme:DefaultTheme />
<!-- Add more resource dictionaries here -->
</ResourceDictionary.MergedDictionaries>
<!-- Add more resources here -->
</ResourceDictionary>
</ContentPage.Resources>
...
</ContentPage>
Bu örnekte, aynı derlemedeki bir kaynak sözlüğü ve bir dış derlemeden kaynak sözlüğü sayfa düzeyinde kaynak sözlüğüyle birleştirilir. Buna ek olarak, özellik öğesi etiketlerinin MergedDictionaries
içindeki diğer ResourceDictionary nesneleri ve bu etiketlerin dışındaki diğer kaynakları da ekleyebilirsiniz.
Önemli
içinde yalnızca bir MergedDictionaries
ResourceDictionaryözellik öğesi etiketi olabilir, ancak bu etikete gerektiği kadar ResourceDictionary nesne yerleştirebilirsiniz.
Birleştirilmiş ResourceDictionary kaynaklar özdeş x:Key
öznitelik değerlerini paylaştığında, .NET MAUI aşağıdaki kaynak önceliğini kullanır:
- Kaynak sözlüğünde yerel kaynaklar.
- Koleksiyon aracılığıyla
MergedDictionaries
birleştirilen kaynak sözlüklerinde yer alan kaynaklar, özelliğindeMergedDictionaries
ters sırada listelenir.
Bahşiş
Bir uygulama birden çok, büyük kaynak sözlükleri içeriyorsa kaynak sözlüklerini aramak işlem açısından yoğun bir görev olabilir. Bu nedenle, gereksiz aramalardan kaçınmak için, bir uygulamadaki her sayfanın yalnızca sayfaya uygun kaynak sözlükleri kullandığından emin olmanız gerekir.
Koddan XAML tabanlı kaynak sözlüğü kullanma
XAML'de tanımlanan kaynak sözlükleri, arka planda kod dosyası tarafından desteklenmeleri koşuluyla ResourceDictionary kodda kullanılabilir. Visual Studio'da arka planda kod dosyaları tarafından desteklenen XAML tabanlı ResourceDictionary dosyalar .NET MAUI ResourceDictionary (XAML) öğe şablonu tarafından projenize eklenebilir:
Arka planda kod dosyaları tarafından desteklenen XAML tabanlı kaynak sözlükleri daha sonra C# dilinden kaynak sözlüğü koleksiyonuna MergedDictionaries eklenerek kullanılabilir:
Resources.MergedDictionaries.Add(new MyMauiApp.Resources.Styles.MyColors());
Resources.MergedDictionaries.Add(new MyMauiApp.Resources.Styles.MyStyles());
Koddan anahtara göre kaynaklara erişme
Kaynak sözlüğündeki kaynaklara diğer sözlükler gibi koddan erişebilirsiniz.
Aşağıdaki örnekte, bir sayfanın kaynak sözlüğünden bir kaynağın nasıl alınacağı ve uygulanacağı gösterilmektedir:
// Retrieve the Primary color value which is in the page's resource dictionary
var hasValue = Resources.TryGetValue("Primary", out object primaryColor);
if (hasValue)
{
myLabel.TextColor = (Color)primaryColor;
}
Bu, koddan kaynak alamıyorsa .NET MAUI'nin KeyNotFoundException
oluşturmamasını sağlayan önerilen yaklaşımdır. Birleştirilmiş kaynak sözlüğü bir XAML dosyasında tanımlanan kaynaklardan ve satır içi kaynaklardan oluştuğunda bu durum oluşabilir. Daha fazla bilgi için bkz . GitHub sorunu #11214.
Dekont
Koddan uygulama genelindeki kaynakları almak için kaynak sözlüğüne erişin App.Current.Resources
.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin