Xamarin.Forms kaynak sözlükleri

Örnek indir Örneği indirin

ResourceDictionary, Bir uygulama tarafından kullanılan kaynaklar için bir depodur Xamarin.Forms . Bir ResourceDictionary ekleme ResourceDictionary, denetim şablonlarında, veri şablonlarında, renklerde ve dönüştürücülerde depolanan tipik kaynaklar.

XAML 'de, bir içinde depolanan kaynaklara, ResourceDictionaryStaticResource veya biçimlendirme uzantısı kullanılarak başvuruda bulunabilir ve uygulanabilir DynamicResource . C# ' de, kaynaklar bir ' de tanımlanabilir ve ResourceDictionary sonra dize tabanlı bir Dizin Oluşturucu kullanılarak öğelere başvurulur ve uygulanır. Ancak, ResourceDictionary paylaşılan nesneler alan veya özellik olarak depolanabileceği ve öncelikle bir sözlükten alınmaksızın doğrudan erişilebilen bir C# dilinde kullanmanın çok daha avantajına sahiptir.

XAML 'de kaynak oluşturma

Her VisualElement türetilen nesne, VisualElementResources kaynakları içerebilen bir Xamarin_Forms _VisualElement_Resources "Data-LinkType =" Absolute-path ">özelliğine sahiptir ResourceDictionary . Benzer şekilde, Application türetilmiş bir nesne, ApplicationResources kaynakları içerebilen bir Xamarin_Forms _VisualElement_Resources "Data-LinkType =" Absolute-path ">özelliğini içerir ResourceDictionary .

Bir Xamarin.Forms uygulama yalnızca ' den türetilen sınıfı içerir Application , ancak genellikle VisualElement Sayfalar, düzenler ve denetimler dahil olmak üzere, öğesinden türetilmiş birçok sınıftan yararlanır. Bu nesnelerden herhangi birinin Resources özelliği, ResourceDictionary kapsayan kaynaklar olarak ayarlanabilir. Kaynakların kullanılabileceği belirli bir etkilerin nereye yerleştirileceğini seçme ResourceDictionary :

  • İçindeki veya gibi bir ResourceDictionary görünüme eklenmiş olan kaynaklar ButtonLabel yalnızca belirli bir nesneye uygulanabilir.
  • ResourceDictionaryVeya gibi bir düzene eklenmiş StackLayout olan kaynaklar Grid , bu düzenin düzenine ve tüm alt öğelerine uygulanabilir.
  • ResourceDictionarySayfa düzeyinde tanımlı bir kaynak, sayfaya ve tüm alt öğelerine uygulanabilir.
  • ResourceDictionaryUygulama düzeyinde tanımlanan bir kaynak, uygulamanın tamamında uygulanabilir.

Örtük stiller hariç olmak üzere, kaynak sözlüğündeki her kaynak, özniteliğiyle tanımlanmış benzersiz bir dize anahtarına sahip olmalıdır x:Key .

Aşağıdaki XAML, ResourceDictionaryResourceDictionary dosyasındaki bir uygulama düzeyinde tanımlanan kaynakları gösterir:

<Application xmlns="http://xamarin.com/schemas/2014/forms"
             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>

        <!-- Implicit styles -->
        <Style TargetType="{x:Type NavigationPage}">
            <Setter Property="BarBackgroundColor"
                    Value="{StaticResource NavigationBarColor}" />
            <Setter Property="BarTextColor"
                    Value="{StaticResource NavigationBarTextColor}" />
        </Style>

        <Style TargetType="{x:Type ContentPage}"
               ApplyToDerivedTypes="True">
            <Setter Property="BackgroundColor"
                    Value="{StaticResource AppBackgroundColor}" />
        </Style>

    </Application.Resources>
</Application>

Bu örnekte, kaynak sözlüğü bir Thickness kaynağı, birden fazla Color kaynağı ve iki örtük Style kaynağı tanımlar. Sınıfı hakkında daha fazla bilgi için App bkz Xamarin.Forms App Class ..

Not

Tüm kaynakları açık Etiketler arasında yerleştirmek de geçerlidir ResourceDictionary . Ancak, Xamarin.Forms 3,0 olduğundan ResourceDictionary Etiketler gerekli değildir. Bunun yerine, ResourceDictionary nesne otomatik olarak oluşturulur ve kaynakları doğrudan Resources özellik öğesi etiketleri arasına ekleyebilirsiniz.

XAML 'de kaynakları tüketme

Her kaynak, x:Key içinde sözlük anahtarı haline gelen özniteliği kullanılarak belirtilen bir anahtara sahiptir ResourceDictionary . Anahtar, ResourceDictionaryStaticResource veya biçimlendirme uzantısıyla bir kaynağa başvuruda bulunmak için kullanılır DynamicResource .

StaticResourceBiçimlendirme uzantısı, DynamicResource her ikisi de bir kaynak sözlüğünden bir değere başvurmak için bir sözlük anahtarı kullanarak, biçimlendirme uzantısına benzerdir. Ancak, StaticResource Biçimlendirme Uzantısı tek bir sözlük araması gerçekleştirdiğinden, DynamicResource Biçimlendirme Uzantısı sözlük anahtarına bir bağlantı sağlar. Bu nedenle, anahtarla ilişkili sözlük girdisi değiştirilirse, değişiklik görsel öğesine uygulanır. Bu, çalışma zamanı kaynak değişikliklerinin bir uygulamada yapılmasını sağlar. Biçimlendirme uzantıları hakkında daha fazla bilgi için bkz. XAML biçimlendirme uzantıları.

Aşağıdaki XAML örneği, kaynakların nasıl kullanıldığını gösterir ve ayrıca bir içinde ek kaynaklar tanımlar StackLayout :

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="ResourceDictionaryDemo.HomePage"
             Title="Home Page">
    <StackLayout Margin="{StaticResource PageMargin}">
        <StackLayout.Resources>
            <!-- Implicit style -->
            <Style TargetType="Button">
                <Setter Property="FontSize" Value="Medium" />
                <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, ContentPage nesnesi uygulama düzeyi kaynak sözlüğünde tanımlanan örtülü stili tüketir. Nesnesi, StackLayoutPageMargin uygulama düzeyi kaynak sözlüğünde tanımlanan kaynağı tüketir, ancak Button nesne, kaynak sözlüğünde tanımlanan örtülü stili tüketir StackLayout . Bu, aşağıdaki ekran görüntüsünde gösterilen görünüme neden olur:

ResourceDictionary kaynaklarını kullanan ResourceDictionary

Önemli

Tek bir sayfaya özgü olan kaynaklar, uygulama düzeyinde bir kaynak sözlüğüne dahil edilmemelidir. bu nedenle, bu kaynaklar bir sayfa için gerektiğinde uygulama başlangıcında ayrıştırılacaktır. Daha fazla bilgi için bkz. Uygulama kaynağı sözlüğü boyutunu azaltma.

Kaynak arama davranışı

Aşağıdaki arama işlemi, StaticResource veya biçimlendirme uzantısıyla bir kaynağa başvurulursa oluşur DynamicResource :

  • İstenen anahtar, varsa, özelliğini ayarlayan öğesi için kaynak sözlüğünde denetlenir. İstenen anahtar bulunursa, değeri döndürülür ve arama işlemi sonlanır.
  • Bir eşleşme bulunmazsa, 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 sonlanır. Aksi takdirde, işlem kök öğeye ulaşılana kadar yukarı devam eder.
  • Kök öğesinde bir eşleşme bulunmazsa, uygulama düzeyi kaynak sözlüğü incelenir.
  • Bir eşleşme bulunamazsa, bir oluşturulur XamlParseException .

Bu nedenle, XAML ayrıştırıcısı bir StaticResource veya DynamicResource biçimlendirme uzantısıyla karşılaştığında, bulduğu ilk eşleştirmeyi kullanarak, görsel ağaç üzerinden hareket ederek eşleşen bir anahtar arar. Bu arama sayfada sonlanıyorsa ve anahtar yine de bulunmazsa, XAML ayrıştırıcısı ResourceDictionary nesnesine ekli olarak arar App . Anahtar hala bulunamazsa, bir özel durum oluşturulur.

Kaynakları geçersiz kıl

Kaynaklar anahtarları paylaştığında, görsel ağaçta daha düşük tanımlanmış kaynaklar, tanımlananlardan daha yüksek önceliğe sahip olur. Örneğin, AppBackgroundColor uygulama düzeyinde olarak bir kaynak ayarlamak, AliceBlue olarak ayarlanan bir sayfa düzeyi kaynak tarafından geçersiz kılınır AppBackgroundColorTeal . Benzer şekilde, bir sayfa düzeyi AppBackgroundColor kaynağı bir denetim düzeyi kaynağı tarafından geçersiz kılınır AppBackgroundColor .

Tek başına kaynak sözlükleri

Sınıfından türetilmiş bir sınıf ResourceDictionary de tek BAŞıNA xaml dosyasında olabilir. XAML dosyası daha sonra uygulamalar arasında paylaşılabilir.

Böyle bir dosya oluşturmak için, projeye yeni bir Içerik görünümü veya içerik sayfası öğesi ekleyin (yalnızca bir C# dosyası olan içerik görünümü veya içerik sayfası değil). Arka plan kod dosyasını silin ve XAML dosyasında taban sınıfının adını ContentView veya ContentPage olarak değiştirin ResourceDictionary . Ayrıca, x:Class özniteliği dosyanın kök etiketiyle kaldırın.

Aşağıdaki XAML örneği, ResourceDictionaryResourceDictionaryadlı adlandırılmış bir göstermektedir:

<ResourceDictionary xmlns="http://xamarin.com/schemas/2014/forms"
                    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
    <DataTemplate x:Key="PersonDataTemplate">
        <ViewCell>
            <Grid>
                <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, türünde bir ResourceDictionary nesne olan tek bir kaynak içerir DataTemplate . Myresourcedictionary. xaml , başka bir kaynak sözlüğünde birleştirilerek tüketilebilir.

Varsayılan olarak, bağlayıcı davranışı tüm derlemeleri bağla olarak ayarlandığında bağlayıcı, tek başına XAML dosyalarını yayın derlemelerinden kaldırır. Tek başına XAML dosyalarının bir yayın derlemesinde kalmasını sağlamak için:

  1. PreserveTek BAŞıNA xaml dosyalarını içeren derlemeye özel bir öznitelik ekleyin. Daha fazla bilgi için bkz. kodu koruma.

  2. PreserveDerleme düzeyinde özniteliği ayarlayın:

    [assembly:Preserve(AllMembers = true)]
    

Bağlama hakkında daha fazla bilgi için bkz. Xamarin. iOS uygulamalarını bağlama ve Android 'e bağlama.

Birleştirilmiş kaynak sözlükleri

Birleştirilmiş kaynak sözlükleri bir veya daha fazla ResourceDictionary nesneyi başka bir ile birleştirir ResourceDictionary .

Yerel kaynak sözlüklerini birleştirme

Yerel bir ResourceDictionary Dosya ResourceDictionaryResourceDictionaryResourceDictionary , Xamarin_Forms _ResourceDictionary_Source "Data-LinkType =" Absolute-path ">Source özelliği kaynaklarla xaml dosyasının dosya adı olarak ayarlanmış bir nesne oluşturularak başka bir şekilde birleştirilebilir:

<ContentPage ...>
    <ContentPage.Resources>
        <!-- Add more resources here -->
        <ResourceDictionary Source="MyResourceDictionary.xaml" />
        <!-- Add more resources here -->
    </ContentPage.Resources>
    ...
</ContentPage>

Bu sözdizimi sınıfı örneği oluşturmaz MyResourceDictionary . Bunun yerine, XAML dosyasına başvurur. Bu nedenle, Xamarin_Forms _ResourceDictionary_Source "Data-LinkType =" Absolute-path ">Source özelliğini ayarlarken, bir arka plan kod dosyası gerekli değildir ve x:Class öznitelik Source dosyasının kök etiketinden kaldırılabilir.

Önemli

Xamarin_Forms _ResourceDictionary_Source "Data-LinkType =" Absolute-path ">Source özelliği yalnızca XAML 'den ayarlanabilir.

Diğer derlemelerden kaynak sözlüklerini birleştirme

ResourceDictionaryAyrıca ResourceDictionaryResourceDictionary , ' ın "Data-LinkType =" absolute-path ">MergedDictionaries özelliğine _ResourceDictionary_MergedDictionaries ResourceDictionary Xamarin_Forms ekleyerek başka bir ile birleştirilebilir. Bu teknik, kaynak sözlüklerinin bulundukları derlemeden bağımsız olarak birleştirilmesini sağlar. Kaynak sözlüklerinden Dış derlemelerden birleştirme, bir ResourceDictionary derleme eyleminin, bir arka plan kod ResourceDictionarydosyası olmasını ve x:Class dosyanın kök etiketinde özniteliğini tanımlamanızı gerektirir.

Uyarı

ResourceDictionarySınıf Ayrıca bir Xamarin_Forms ResourceDictionary _ResourceDictionary_MergedWith "Data-LinkType =" Absolute-path ">özelliği tanımlar MergedWith . Ancak, bu özellik kullanımdan kaldırılmıştır ve artık kullanılmamalıdır.

Aşağıdaki kod örneğinde, MergedDictionaries bir sayfa düzeyinin "Data-LinkType =" absolute-path ">_ResourceDictionary_MergedDictionaries Xamarin_Forms eklenen iki kaynak sözlüğü gösterilmektedir ResourceDictionary :

<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:LightTheme />
                <!-- Add more resource dictionaries here -->
            </ResourceDictionary.MergedDictionaries>
            <!-- Add more resources here -->
        </ResourceDictionary>
    </ContentPage.Resources>
    ...
</ContentPage>

Bu örnekte, aynı derlemeden bir kaynak sözlüğü ve bir dış derlemeden bir kaynak sözlüğü, sayfa düzeyi kaynak sözlüğünde birleştirilir. Ayrıca, ResourceDictionaryResourceDictionary Bu etiketlerin dışında, "Data-LinkType =" Absolute-path ">MergedDictionaries özellik öğesi etiketleri ve diğer kaynakları _ResourceDictionary_MergedDictionaries Xamarin_Forms içindeki diğer nesneleri de ekleyebilirsiniz.

Önemli

MergedDictionariesBir içinde yalnızca bir Property-element etiketi olabilir ResourceDictionary , ancak ResourceDictionary gereken sayıda nesne ekleyebilirsiniz.

Birleştirilmiş ResourceDictionary kaynaklar aynı x:Key öznitelik değerlerini paylaşıyorsa, Xamarin.Forms aşağıdaki kaynak önceliğini kullanır:

  1. Kaynak sözlüğünde yerel kaynaklar.
  2. Koleksiyon aracılığıyla birleştirilmiş kaynak sözlüklerinde bulunan kaynaklar, bu, MergedDictionaries özellikte listelenirler MergedDictionaries .

Not

Bir uygulama birden çok, büyük kaynak sözlükleri içeriyorsa, kaynak sözlüklerinin aranması yoğun bir görev olabilir. Bu nedenle, gereksiz aramalardan kaçınmak için bir uygulamanın her sayfasının yalnızca sayfaya uygun kaynak sözlüklerini kullandığından emin olmak gerekir.

Channel 9 ve YouTube'da daha fazla Xamarin videosu bulun.