XAML kaynaklarına genel bakış (WPF .NET)Overview of XAML resources (WPF .NET)

Kaynak, uygulamanızdaki farklı yerlerde yeniden kullanılabilen bir nesnedir.A resource is an object that can be reused in different places in your app. Kaynak örnekleri, fırçalar ve stiller içerir.Examples of resources include brushes and styles. Bu genel bakışta Extensible Application Markup Language (XAML) içindeki kaynakların nasıl kullanılacağı açıklanmaktadır.This overview describes how to use resources in Extensible Application Markup Language (XAML). Ayrıca, kodu kullanarak kaynak oluşturup erişebilirsiniz.You can also create and access resources by using code.

Not

Bu makalede açıklanan XAML Kaynakları, genellikle içerik, veri veya katıştırılmış dosyalar gibi bir uygulamaya eklenen dosya olan uygulama kaynaklarından farklıdır.XAML resources described in this article are different from app resources which are generally files added to an app, such as content, data, or embedded files.

Önemli

.NET 5 (ve .NET Core) için masaüstü Kılavuzu belgeleri yapım aşamasındadır.The Desktop Guide documentation for .NET 5 (and .NET Core) is under construction.

XAML 'de kaynakları kullanmaUsing resources in XAML

Aşağıdaki örnek bir SolidColorBrush sayfanın kök öğesinde kaynak olarak bir kaynağı tanımlar.The following example defines a SolidColorBrush as a resource on the root element of a page. Örnek daha sonra kaynağa başvurur ve bir,, ve gibi çeşitli alt öğelerin özelliklerini ayarlamak için kullanır Ellipse TextBlock Button .The example then references the resource and uses it to set properties of several child elements, including an Ellipse, a TextBlock, and a Button.

<Page Name="root"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
  <Page.Resources>
    <SolidColorBrush x:Key="MyBrush" Color="Gold"/>
    <Style TargetType="Border" x:Key="PageBackground">
      <Setter Property="Background" Value="Blue"/>
    </Style>
    <Style TargetType="TextBlock" x:Key="TitleText">
      <Setter Property="Background" Value="Blue"/>
      <Setter Property="DockPanel.Dock" Value="Top"/>
      <Setter Property="FontSize" Value="18"/>
      <Setter Property="Foreground" Value="#4E87D4"/>
      <Setter Property="FontFamily" Value="Trebuchet MS"/>
      <Setter Property="Margin" Value="0,40,10,10"/>
    </Style>
    <Style TargetType="TextBlock" x:Key="Label">
      <Setter Property="DockPanel.Dock" Value="Right"/>
      <Setter Property="FontSize" Value="8"/>
      <Setter Property="Foreground" Value="{StaticResource MyBrush}"/>
      <Setter Property="FontFamily" Value="Arial"/>
      <Setter Property="FontWeight" Value="Bold"/>
      <Setter Property="Margin" Value="0,3,10,0"/>
    </Style>
  </Page.Resources>
  <StackPanel>
    <Border Style="{StaticResource PageBackground}">
      <DockPanel>
        <TextBlock Style="{StaticResource TitleText}">Title</TextBlock>
        <TextBlock Style="{StaticResource Label}">Label</TextBlock>
        <TextBlock DockPanel.Dock="Top" HorizontalAlignment="Left" FontSize="36" Foreground="{StaticResource MyBrush}" Text="Text" Margin="20" />
        <Button DockPanel.Dock="Top" HorizontalAlignment="Left" Height="30" Background="{StaticResource MyBrush}" Margin="40">Button</Button>
        <Ellipse DockPanel.Dock="Top" HorizontalAlignment="Left" Width="100" Height="100" Fill="{StaticResource MyBrush}" Margin="40" />
      </DockPanel>
    </Border>
  </StackPanel>
</Page>


Her çerçeve düzeyindeki öğe ( FrameworkElement veya FrameworkContentElement ) Resources , tanımlı kaynakları içeren bir tür olan bir özelliğine sahiptir ResourceDictionary .Every framework-level element (FrameworkElement or FrameworkContentElement) has a Resources property, which is a ResourceDictionary type that contains defined resources. Herhangi bir öğe üzerinde (örneğin,) kaynak tanımlayabilirsiniz Button .You can define resources on any element, such as a Button. Bununla birlikte, kaynaklar genellikle, örnekteki kök öğe üzerinde tanımlanmıştır Page .However, resources are most often defined on the root element, which is Page in the example.

Kaynak sözlüğündeki her kaynak benzersiz bir anahtara sahip olmalıdır.Each resource in a resource dictionary must have a unique key. Biçimlendirme içinde kaynakları tanımlarken, X:Key yönergesiaracılığıyla benzersiz anahtarı atarsınız.When you define resources in markup, you assign the unique key through the x:Key Directive. Genellikle, anahtar bir dizedir; Bununla birlikte, uygun biçimlendirme uzantılarını kullanarak da diğer nesne türlerine ayarlayabilirsiniz.Typically, the key is a string; however, you can also set it to other object types by using the appropriate markup extensions. Kaynaklar için dize olmayan anahtarlar, özellikle stiller, bileşen kaynakları ve veri stili için WPF 'deki belirli özellik alanlarında kullanılır.Non-string keys for resources are used by certain feature areas in WPF, notably for styles, component resources, and data styling.

Kaynağın anahtar adını belirten kaynak biçimlendirme uzantısı sözdizimi ile tanımlı bir kaynak kullanabilirsiniz.You can use a defined resource with the resource markup extension syntax that specifies the key name of the resource. Örneğin, kaynağı başka bir öğesindeki bir özelliğin değeri olarak kullanın.For example, use the resource as the value of a property on another element.

<Button Background="{StaticResource MyBrush}"/>
<Ellipse Fill="{StaticResource MyBrush}"/>

Yukarıdaki örnekte, XAML yükleyicisi {StaticResource MyBrush} Background özelliği üzerinde özelliğinin değerini işlediğinde Button , kaynak arama mantığı öncelikle öğenin kaynak sözlüğünü denetler Button .In the preceding example, when the XAML loader processes the value {StaticResource MyBrush} for the Background property on Button, the resource lookup logic first checks the resource dictionary for the Button element. ButtonKaynak anahtarının tanımına sahip değilse MyBrush (Bu örnekte değil; kaynak koleksiyonu boş ise), bir sonraki arama üst öğesini denetler Button , yani Page .If Button doesn't have a definition of the resource key MyBrush (in that example it doesn't; its resource collection is empty), the lookup next checks the parent element of Button, which is Page. Kök öğesinde bir kaynak tanımlarsanız, Page öğesinin mantıksal ağacındaki tüm öğeler Page buna erişebilir.If you define a resource on the Page root element, all the elements in the logical tree of the Page can access it. Aynı kaynağı, kaynağın temsil ettiği aynı türü kabul eden herhangi bir özelliğin değerini ayarlamak için yeniden kullanabilirsiniz.And you can reuse the same resource for setting the value of any property that accepts the same type that the resource represents. Önceki örnekte, aynı MyBrush kaynak iki farklı özellik ayarlıyor: Background öğesinin Button ve Fill bir Rectangle .In the previous example, the same MyBrush resource sets two different properties: the Background of a Button, and the Fill of a Rectangle.

Statik ve dinamik kaynaklarStatic and dynamic resources

Kaynağa statik veya dinamik olarak başvurulabilirler.A resource can be referenced as either static or dynamic. Başvurular, StaticResource Işaretleme uzantısı ya da DynamicResource işaretleme uzantısıkullanılarak oluşturulur.References are created by using either the StaticResource Markup Extension or the DynamicResource Markup Extension. Biçimlendirme uzantısı, biçimlendirme uzantısının öznitelik dizesini işlemesini ve nesneyi XAML yükleyicisine döndürmesini sağlayarak bir nesne başvurusu belirtmenize imkan tanıyan bir XAML özelliğidir.A markup extension is a XAML feature that lets you specify an object reference by having the markup extension process the attribute string and return the object to a XAML loader. Biçimlendirme Uzantısı davranışı hakkında daha fazla bilgi için bkz. Biçimlendirme uzantıları ve WPF XAML.For more information about markup extension behavior, see Markup Extensions and WPF XAML.

Biçimlendirme uzantısı kullandığınızda, genellikle bu belirli biçimlendirme uzantısı tarafından işlenen dize biçiminde bir veya daha fazla parametre sağlarsınız.When you use a markup extension, you typically provide one or more parameters in string form that are processed by that particular markup extension. StaticResource Işaretleme uzantısı , tüm kullanılabilir kaynak sözlüklerinde bu anahtarın değerine bakarak bir anahtarı işler.The StaticResource Markup Extension processes a key by looking up the value for that key in all available resource dictionaries. İşlem yükleme sırasında gerçekleşir, yükleme işleminin özellik değerini ataması gerekir.Processing happens during load, which is when the loading process needs to assign the property value. Bunun yerine DynamicResource Işaretleme uzantısı bir ifade oluşturarak bir anahtarı işler ve bu ifade, uygulamanın çalıştırılıncaya kadar değerlendirilmeden kalır ve bir değer sağlar.The DynamicResource Markup Extension instead processes a key by creating an expression, and that expression remains unevaluated until the app runs, at which time the expression is evaluated and provides a value.

Bir kaynağa başvurduğunuzda, bir statik kaynak başvurusu veya dinamik kaynak başvurusu kullanıp kullanmayacağınızı aşağıdaki önemli noktalar etkileyebilir:When you reference a resource, the following considerations can influence whether you use a static resource reference or a dynamic resource reference:

  • Uygulamanıza yönelik kaynakları nasıl oluşturacağınız (sayfada, uygulamada, gevşek XAML 'de veya yalnızca kaynak derlemesinde) genel tasarımı belirlerken, aşağıdakileri göz önünde bulundurun:When determining the overall design of how you create the resources for your app (per page, in the app, in loose XAML, or in a resource-only assembly), consider the following:

  • Uygulamanın işlevselliği.The app's functionality. Uygulama gereksinimlerinizin gerçek zamanlı bölümünde kaynakları güncelleştiriyor mu?Are updating resources in real-time part of your app requirements?

  • Bu kaynak başvuru türünün ilgili arama davranışı.The respective lookup behavior of that resource reference type.

  • Belirli bir özellik veya kaynak türü ve bu türlerin yerel davranışı.The particular property or resource type, and the native behavior of those types.

Statik kaynaklarStatic resources

Statik kaynak başvuruları aşağıdaki koşullarda en iyi şekilde çalışır:Static resource references work best for the following circumstances:

  • Uygulama tasarımınız, kaynaklarının çoğunu sayfa veya uygulama düzeyi kaynak sözlüklerine indirger.Your app design concentrates most of its resources into page or application-level resource dictionaries. Statik kaynak başvuruları, bir sayfayı yeniden yükleme gibi çalışma zamanı davranışlarına göre yeniden değerlendirilmez.Static resource references aren't reevaluated based on runtime behaviors, such as reloading a page. Bu nedenle, kaynak ve uygulama tasarımınıza göre gerekli olmadıklarında çok sayıda dinamik kaynak başvurusunun önünden kaçınmanın bazı performans avantajları olabilir.So there can be some performance benefit to avoiding large numbers of dynamic resource references when they aren't necessary based on your resource and app design.

  • Bir veya içinde olmayan bir özelliğin değerini ayarlıyoruz DependencyObject Freezable .You're setting the value of a property that isn't on a DependencyObject or a Freezable.

  • Bir DLL 'ye derlenecek ve uygulamanın parçası olarak paketlenebilecek veya uygulamalar arasında paylaşılan bir kaynak sözlüğü oluşturuyorsunuz.You're creating a resource dictionary that will be compiled into a DLL and packaged as part of the app or shared between apps.

  • Özel bir denetim için bir tema oluşturuyorsunuz ve Temalar içinde kullanılan kaynakları tanımlıyor.You're creating a theme for a custom control and are defining resources that are used within the themes. Bu durumda, genellikle dinamik kaynak başvuru arama davranışını istemezsiniz; Bunun yerine, aramanın öngörülebilir ve kendi temaya dahil olması için statik kaynak başvuru davranışını istersiniz.For this case, you typically do not want the dynamic resource reference lookup behavior; you instead want the static resource reference behavior so that the lookup is predictable and self-contained to the theme. Dinamik kaynak başvurusuyla, bir tema içindeki bir başvuru bile çalışma zamanına kadar değerlendirilmemiştir.With a dynamic resource reference, even a reference within a theme is left unevaluated until run-time. Ayrıca, tema uygulandığında, bazı yerel öğe, temanızın başvuruya çalıştığı bir anahtarı yeniden tanımlayacaktır ve yerel öğe, arama sırasında temanın kendisinden önce kalır.and there is a chance that when the theme is applied, some local element will redefine a key that your theme is trying to reference, and the local element will fall prior to the theme itself in the lookup. Bu durumda, temanız beklendiği gibi davranmaz.If that happens, your theme will not behave as expected.

  • Çok sayıda bağımlılık özelliğini ayarlamak için kaynaklar kullanıyorsunuz.You're using resources to set large numbers of dependency properties. Bağımlılık özellikleri, özellik sistemi tarafından etkinleştirilen şekilde etkili bir değer önbelleğe alma özelliğine sahiptir, bu nedenle yük zamanında değerlendirilebilen bir bağımlılık özelliği için bir değer sağlarsanız, bağımlılık özelliği yeniden değerlendirilen bir ifadeyi denetlemek zorunda değildir ve en son etkin değeri döndürebilir.Dependency properties have effective value caching as enabled by the property system, so if you provide a value for a dependency property that can be evaluated at load time, the dependency property doesn't have to check for a reevaluated expression and can return the last effective value. Bu teknik bir performans avantajı olabilir.This technique can be a performance benefit.

  • Tüm tüketiciler için temel alınan kaynağı değiştirmek veya X:Shared özniteliğinikullanarak her bir tüketici için ayrı yazılabilir örnekler saklamak istiyorsunuz.You want to change the underlying resource for all consumers, or you want to maintain separate writable instances for each consumer by using the x:Shared Attribute.

Statik kaynak arama davranışıStatic resource lookup behavior

Aşağıdaki, bir statik kaynağa bir özellik veya öğe tarafından başvurulduğunda otomatik olarak gerçekleşen arama işlemini açıklar:The following describes the lookup process that automatically happens when a static resource is referenced by a property or element:

  1. Arama işlemi, özelliği ayarlayan öğe tarafından tanımlanan kaynak sözlüğünde istenen anahtarı denetler.The lookup process checks for the requested key within the resource dictionary defined by the element that sets the property.

  2. Arama işlemi daha sonra mantıksal ağacı üst öğeye ve kaynak sözlüğüne yukarı doğru taşır.The lookup process then traverses the logical tree upward to the parent element and its resource dictionary. Bu işlem, kök öğeye ulaşılana kadar devam eder.This process continues until the root element is reached.

  3. Uygulama kaynakları denetlenir.App resources are checked. Uygulama kaynakları, Application WPF uygulamanız için nesne tarafından tanımlanan kaynak sözlüğünde yer alan kaynaklardır.App resources are those resources within the resource dictionary that is defined by the Application object for your WPF app.

Kaynak sözlüğü içinden statik kaynak başvurularının, kaynak başvurusundan önce zaten sözcüksel olarak tanımlanmış bir kaynağa başvurması gerekir.Static resource references from within a resource dictionary must reference a resource that has already been defined lexically before the resource reference. İleri başvurular statik kaynak başvurusuyla çözümlenemez.Forward references cannot be resolved by a static resource reference. Bu nedenle, kaynak sözlüğü yapınızı, kaynakların ilgili her kaynak sözlüğün başında veya sonunda tanımlandıkları şekilde tasarlayın.For this reason, design your resource dictionary structure such that resources are defined at or near the beginning of each respective resource dictionary.

Statik kaynak arama, temalara veya sistem kaynaklarına genişletebilir, ancak bu arama yalnızca XAML yükleyicisi isteği erteler olduğundan desteklenir.Static resource lookup can extend into themes or into system resources, but this lookup is supported only because the XAML loader defers the request. Erteleme, sayfa yüklenirken çalışma zamanı temasının uygulamaya düzgün şekilde uygulanması için gereklidir.The deferral is necessary so that the runtime theme at the time the page loads applies properly to the app. Bununla birlikte, tema Kullanıcı tarafından gerçek zamanlı olarak değiştirilmişse, bu tür başvurular yeniden değerlendirilmediği için, yalnızca temalarda bulunan veya sistem kaynakları olarak bilinen anahtarlara statik kaynak başvuruları önerilmez.However, static resource references to keys that are known to only exist in themes or as system resources aren't recommended, because such references aren't reevaluated if the theme is changed by the user in real time. Tema veya sistem kaynakları istediğinizde dinamik bir kaynak başvurusu daha güvenilirdir.A dynamic resource reference is more reliable when you request theme or system resources. Bir tema öğesinin kendisi başka bir kaynağı istemesi durumunda özel durum olur.The exception is when a theme element itself requests another resource. Bu başvurular, daha önce bahsedilen nedenlerle statik kaynak başvuruları olmalıdır.These references should be static resource references, for the reasons mentioned earlier.

Statik bir kaynak başvurusu bulunamazsa özel durum davranışı değişir.The exception behavior if a static resource reference isn't found varies. Kaynak ertelendikten sonra özel durum çalışma zamanında oluşur.If the resource was deferred, then the exception occurs at runtime. Kaynak ertelenmediğinde, özel durum yükleme zamanında oluşur.If the resource was not deferred, the exception occurs at load time.

Dinamik kaynaklarDynamic resources

Dinamik kaynaklar şu durumlarda en iyi şekilde çalışır:Dynamic resources work best when:

  • Kaynak değeri, sistem kaynakları dahil, aksi takdirde Kullanıcı tarafından ayarlanabilen kaynaklar da dahil olmak üzere, çalışma zamanına kadar bilinmeyen koşullara bağlıdır.The value of the resource, including system resources, or resources that are otherwise user settable, depends on conditions that aren't known until runtime. Örneğin,, veya tarafından kullanıma sunulan sistem özelliklerine başvuran ayarlayıcı değerleri oluşturabilirsiniz SystemColors SystemFonts SystemParameters .For example, you can create setter values that refer to system properties as exposed by SystemColors, SystemFonts, or SystemParameters. Bu değerler, son olarak Kullanıcı ve işletim sisteminin çalışma zamanı ortamından geldiğinden, gerçekten dinamiktir.These values are truly dynamic because they ultimately come from the runtime environment of the user and operating system. Ayrıca, sayfa düzeyi kaynak erişiminin değişikliği yakalaması gereken uygulama düzeyi temalara de sahip olabilirsiniz.You might also have application-level themes that can change, where page-level resource access must also capture the change.

  • Özel bir denetim için Tema stilleri oluşturuyor veya başvuruyoruz.You're creating or referencing theme styles for a custom control.

  • Bir uygulama ömrü boyunca bir uygulamasının içeriğini ayarlamayı amaçlamıştınız ResourceDictionary .You intend to adjust the contents of a ResourceDictionary during an app lifetime.

  • Bir ileri başvurunun gerekli olabileceği, bağımlılıkları olan karmaşık bir kaynak yapısına sahipsiniz.You have a complicated resource structure that has interdependencies, where a forward reference may be required. Statik kaynak başvuruları İleri başvuruları desteklemez, ancak kaynak çalışma zamanına kadar değerlendirilmek zorunda olmadığından ve ileri başvurular bu nedenle ilgili bir kavram olmadığından, dinamik kaynak başvuruları bunları destekler.Static resource references do not support forward references, but dynamic resource references do support them because the resource doesn't need to be evaluated until runtime, and forward references are therefore not a relevant concept.

  • Derleme veya çalışma kümesinin perspektifinden büyük bir kaynağa başvuruyorsunuz ve kaynak sayfa yüklendiğinde hemen kullanılamayabilir.You're referencing a resource that is large from the perspective of a compile or working set, and the resource might not be used immediately when the page loads. Statik kaynak başvuruları, sayfa yüklendiğinde XAML 'den her zaman yüklenir.Static resource references always load from XAML when the page loads. Ancak, dinamik bir kaynak başvurusu kullanılana kadar yüklenmez.However, a dynamic resource reference doesn't load until it's used.

  • Ayarlayıcı değerlerinin, Temalar veya diğer kullanıcı ayarlarından etkilenen diğer değerlerden gelebileceği bir stil oluşturuyorsunuz.You're creating a style where setter values might come from other values that are influenced by themes or other user settings.

  • Uygulama ömrü boyunca mantıksal ağaçta yeniden üst öğe olabilecek öğelere kaynak uygulayacağız.You're applying resources to elements that might be reparented in the logical tree during app lifetime. Üst öğeyi değiştirmek, kaynak arama kapsamını da büyük olasılıkla değiştirir, bu nedenle bir yeniden üst öğe olan kaynağın yeni kapsama göre yeniden değerlendirilmasını istiyorsanız, her zaman dinamik bir kaynak başvurusu kullanın.Changing the parent also potentially changes the resource lookup scope, so if you want the resource for a reparented element to be reevaluated based on the new scope, always use a dynamic resource reference.

Dinamik kaynak arama davranışıDynamic resource lookup behavior

Bir dinamik kaynak başvurusu için kaynak arama davranışı, veya öğesini çağırırsanız kodunuzda arama davranışına paraleldir FindResource SetResourceReference :Resource lookup behavior for a dynamic resource reference parallels the lookup behavior in your code if you call FindResource or SetResourceReference:

  1. Arama, özelliği ayarlayan öğe tarafından tanımlanan kaynak sözlüğünde istenen anahtarı denetler:The lookup checks for the requested key within the resource dictionary defined by the element that sets the property:

  2. Arama mantıksal ağacı üst öğeye ve kaynak sözlüğüne göre yukarı taşır.The lookup traverses the logical tree upward to the parent element and its resource dictionary. Bu işlem, kök öğeye ulaşılana kadar devam eder.This process continues until the root element is reached.

  3. Uygulama kaynakları denetlenir.App resources are checked. Uygulama kaynakları, Application WPF uygulamanız için nesne tarafından tanımlanan kaynak sözlüğünde yer alan kaynaklardır.App resources are those resources within the resource dictionary that are defined by the Application object for your WPF app.

  4. Tema kaynak sözlüğü, şu anda etkin olan tema için denetlenir.The theme resource dictionary is checked for the currently active theme. Tema çalışma zamanında değişirse değer yeniden değerlendirilecektir.If the theme changes at runtime, the value is reevaluated.

  5. Sistem kaynakları denetlenir.System resources are checked.

Özel durum davranışı (varsa) farklılık gösterir:Exception behavior (if any) varies:

  • Bir kaynak bir çağrı tarafından isteniyorsa FindResource ve bulunmazsa, bir özel durum oluşturulur.If a resource was requested by a FindResource call and was not found, an exception is thrown.

  • Bir kaynak bir çağrı tarafından isteniyorsa TryFindResource ve bulunmazsa, özel durum oluşturulmaz ve döndürülen değer null .If a resource was requested by a TryFindResource call and was not found, no exception is thrown, and the returned value is null. Ayarlanmakta olan özellik kabul null edilemediği takdirde, ayarlanmakta olan özelliğe bağlı olarak daha derin bir özel durum oluşturulması mümkün olur.If the property being set doesn't accept null, then it's still possible that a deeper exception will be thrown, depending on the individual property being set.

  • Bir kaynak XAML 'de dinamik bir kaynak başvurusu tarafından isteniyorsa ve bulunmazsa, davranış genel özellik sistemine bağlıdır.If a resource was requested by a dynamic resource reference in XAML and was not found, then the behavior depends on the general property system. Genel davranış, kaynağın bulunduğu düzeyde hiçbir özellik ayarı işlemi gerçekleşmesiz değildir.The general behavior is as if no property setting operation occurred at the level where the resource exists. Örneğin, tek bir düğme öğesinde değerlendirilemeyen bir kaynağı kullanarak arka planı ayarlamaya çalışırsanız, hiçbir değer kümesi sonucu yoktur ancak etkin değer hala Özellik sisteminde ve değer önceliğinde diğer katılımcılardan gelebilir.For instance, if you attempt to set the background on an individual button element using a resource that could not be evaluated, then no value set results, but the effective value can still come from other participants in the property system and value precedence. Örneğin, arka plan değeri yine de yerel olarak tanımlanmış bir düğme stilinden veya tema stilinden gelebilir.For instance, the background value might still come from a locally defined button style or from the theme style. Tema stilleriyle tanımlanmayan özellikler için, başarısız bir kaynak değerlendirmesinden sonra geçerli değer, özellik meta verilerindeki varsayılan değerden gelebilir.For properties that aren't defined by theme styles, the effective value after a failed resource evaluation might come from the default value in the property metadata.

KısıtlamalarRestrictions

Dinamik kaynak başvurularının bazı önemli kısıtlamaları vardır.Dynamic resource references have some notable restrictions. Aşağıdaki koşullardan en az biri doğru olmalıdır:At least one of the following conditions must be true:

Ayarlanan özellik bir DependencyProperty veya özelliği olmalıdır, çünkü özellik Freezable değişikliği (değiştirilen dinamik kaynak değeri) özellik sistemi tarafından onaylandığından, çoğu özellik değişikliği Kullanıcı arabirimine yayabilir.Because the property being set must be a DependencyProperty or Freezable property, most property changes can propagate to the UI because a property change (the changed dynamic resource value) is acknowledged by the property system. Çoğu denetim, bir değişiklik olduğunda bir denetimin başka bir yerleşimini zorlayan mantığı içerir DependencyProperty ve bu özellik düzeni etkileyebilir.Most controls include logic that will force another layout of a control if a DependencyProperty changes and that property might affect layout. Ancak, bir DynamicResource biçimlendirme uzantısına sahip olan tüm özelliklerin, Kullanıcı arabiriminde gerçek zamanlı güncelleştirmeler sağlama garantisi garanti edilir.However, not all properties that have a DynamicResource Markup Extension as their value are guaranteed to provide real time updates in the UI. Bu işlevsellik, özelliğe ve hatta uygulamanızın mantıksal yapısına bağlı olarak farklılık gösterebilir ve bu özellik de değişir.That functionality still might vary depending on the property, as well as depending on the type that owns the property, or even the logical structure of your app.

Stiller, veri şablonları ve örtük anahtarlarStyles, DataTemplates, and implicit keys

İçindeki tüm öğelerin bir ResourceDictionary anahtarı olmalıdır, ancak tüm kaynakların açık olması anlamına gelmez x:Key .Although all items in a ResourceDictionary must have a key, that doesn't mean that all resources must have an explicit x:Key. Birçok nesne türü, bir kaynak olarak tanımlandığında, anahtar değerinin başka bir özelliğin değerine bağlı olduğu örtük bir anahtarı destekler.Several object types support an implicit key when defined as a resource, where the key value is tied to the value of another property. Bu anahtar türü örtük anahtar olarak bilinir, ancak x:Key öznitelik açık bir anahtardır.This type of key is known as an implicit key, whereas an x:Key attribute is an explicit key. Açık bir anahtar belirterek herhangi bir örtük anahtarın üzerine yazabilirsiniz.You can overwrite any implicit key by specifying an explicit key.

Kaynak için önemli bir senaryo, bir tanımladığınızda Style .One important scenario for resources is when you define a Style. Aslında, Style Stiller kendiliğinden yeniden kullanım için tasarlanan bir kaynak sözlüğünde bir girdi olarak neredeyse her zaman tanımlanır.In fact, a Style is almost always defined as an entry in a resource dictionary, because styles are inherently intended for reuse. Stiller hakkında daha fazla bilgi için bkz. Stil oluşturma ve şablonoluşturma.For more information about styles, see Styling and Templating.

Denetimlerin stilleri hem ile oluşturulabilir hem de örtük bir anahtarla başvuruda bulunabilir.Styles for controls can be both created with and referenced with an implicit key. Bir denetimin varsayılan görünümünü tanımlayan Tema stilleri, bu örtülü anahtara bağımlıdır.The theme styles that define the default appearance of a control rely on this implicit key. Bunu isteme açısından örtük anahtar, Type denetimin kendisidir.From the standpoint of requesting it, the implicit key is the Type of the control itself. Kaynakları tanımlama açısından örtülü anahtar stilin ' dir TargetType .From the standpoint of defining the resources, the implicit key is the TargetType of the style. Bu nedenle, özel denetimler için Temalar oluşturuyorsanız veya mevcut Tema stilleriyle etkileşime geçen stiller oluşturuyorsanız, bunun için bir X:Key yönergesi belirtmeniz gerekmez Style .Therefore, if you're creating themes for custom controls or creating styles that interact with existing theme styles, you do not need to specify an x:Key Directive for that Style. Temalı stilleri kullanmak istiyorsanız, herhangi bir stil belirtmeniz gerekmez.And if you want to use the themed styles, you do not need to specify any style at all. Örneğin, aşağıdaki stil tanımı, Style kaynak bir anahtara sahip gibi görünmese de işe yarar:For instance, the following style definition works, even though the Style resource doesn't appear to have a key:

<Style TargetType="Button">
  <Setter Property="Background">
    <Setter.Value>
      <LinearGradientBrush>
        <GradientStop Offset="0.0" Color="AliceBlue"/>
        <GradientStop Offset="1.0" Color="Salmon"/>           
      </LinearGradientBrush>
    </Setter.Value>
  </Setter>  
  <Setter Property="FontSize" Value="18"/>
</Style>

Bu stilin gerçekten bir anahtarı vardır: örtük anahtar typeof(System.Windows.Controls.Button) .That style really does have a key: the implicit key typeof(System.Windows.Controls.Button). Biçimlendirme bölümünde TargetType doğrudan tür adı olarak belirtebilirsiniz (ya da isteğe bağlı olarak {X:Type...exe ' i kullanabilirsiniz)In markup, you can specify a TargetType directly as the type name (or you can optionally use {x:Type...} bir döndürür Type .to return a Type.

WPF tarafından kullanılan varsayılan tema stili mekanizmaları aracılığıyla, bu stil, kendi Button Button Style özelliğini veya stile belirli bir kaynak başvurusunu belirtmeyi denemese de, sayfanın çalışma zamanı stili olarak uygulanır.Through the default theme style mechanisms used by WPF, that style is applied as the runtime style of a Button on the page, even though the Button itself doesn't attempt to specify its Style property or a specific resource reference to the style. Sayfada tanımlanan stiliniz, tema sözlüğü stilinin sahip olduğu aynı anahtar kullanılarak, arama dizisinde, tema sözlüğü stilinden daha önce bulunur.Your style defined in the page is found earlier in the lookup sequence than the theme dictionary style, using the same key that the theme dictionary style has. <Button>Hello</Button>Sayfada herhangi bir yeri belirtebilirsiniz ve ile tanımladığınız stil TargetType Button Bu düğme için geçerlidir.You could just specify <Button>Hello</Button> anywhere in the page, and the style you defined with TargetType of Button would apply to that button. İsterseniz, biçimlendirmedeki açıklık için aynı tür değeri ile stili açıkça anahtar olarak girebilirsiniz TargetType , ancak bu isteğe bağlıdır.If you want, you can still explicitly key the style with the same type value as TargetType for clarity in your markup, but that is optional.

Varsa, stiller için örtülü anahtarlar bir denetim üzerinde uygulanmaz OverridesDefaultStyle true .Implicit keys for styles do not apply on a control if OverridesDefaultStyle is true. (Ayrıca, denetimin OverridesDefaultStyle bir örneğine açıkça değil, denetim sınıfı için yerel davranışın bir parçası olarak ayarlanmış olabileceğini unutmayın.) Ayrıca, türetilmiş sınıf senaryolarında örtük anahtarları desteklemek için, denetimin geçersiz kılması gerekir DefaultStyleKey (WPF kapsamında sunulan tüm mevcut denetimler bu geçersiz kılmayı içerir).(Also note that OverridesDefaultStyle might be set as part of native behavior for the control class, rather than explicitly on an instance of the control.) Also, in order to support implicit keys for derived class scenarios, the control must override DefaultStyleKey (all existing controls provided as part of WPF include this override). Stiller, Temalar ve denetim tasarımı hakkında daha fazla bilgi için bkz. Stillenebilir denetimler tasarlamak Için yönergeler.For more information about styles, themes, and control design, see Guidelines for Designing Stylable Controls.

DataTemplate Ayrıca örtülü bir anahtara sahiptir.DataTemplate also has an implicit key. Bir için örtük anahtar, DataTemplate DataType özellik değeridir.The implicit key for a DataTemplate is the DataType property value. DataType Ayrıca, açıkça {X:Type...exe}kullanmak yerine türün adı olarak belirtilebilir.DataType can also be specified as the name of the type rather than explicitly using {x:Type...}. Ayrıntılar için bkz. veri şablonu oluşturmaya genel bakış.For details, see Data Templating Overview.

Ayrıca bkz.See also