Bağımlılık özelliği değeri önceliği (WPF .NET)

Windows Presentation Foundation (WPF) özellik sisteminin çalışmaları bağımlılık özelliğinin değerini etkiler. Bu makalede WPF özellik sistemindeki farklı özellik tabanlı girişlerin önceliklerinin bağımlılık özelliğinin etkin değerini nasıl belirlediğini açıklar.

Önemli

.NET 7 ve .NET 6 için Masaüstü Kılavuzu belgeleri yapım aşamasındadır.

Ön koşullar

Makalede bağımlılık özellikleri hakkında temel bilgiler edindiğiniz ve Bağımlılık özelliklerine genel bakış makalesini okuduğunuz varsayılır. Bu makaledeki örnekleri takip etmek için Genişletilebilir Uygulama biçimlendirme dili (XAML) hakkında bilgi sahibi olmanız ve WPF uygulamalarının nasıl yazabileceğinizi bilmeniz yardımcı olur.

WPF özellik sistemi

WPF özellik sistemi, bağımlılık özelliklerinin değerini belirlemek için gerçek zamanlı özellik doğrulama, geç bağlama ve ilgili özellikler için özellik değişikliği bildirimleri gibi çeşitli faktörler kullanır. Bağımlılık özelliği değerlerini belirlemek için kullanılan sıra ve mantık karmaşık olsa da, bunun öğrenilmesi gereksiz özellik ayarlarından kaçınmanıza ve bağımlılık özelliği ayarlama girişiminin neden beklenen değerle sonuçlanmadığına karar vermenize yardımcı olabilir.

Birden çok yerde ayarlanan bağımlılık özellikleri

Aşağıdaki XAML örneği, düğmenin Background özelliğindeki üç farklı "küme" işleminin değerini nasıl etkileyebileceğini gösterir.

<StackPanel>
    <StackPanel.Resources>
        <ControlTemplate x:Key="ButtonTemplate" TargetType="{x:Type Button}">
            <Border Background="{TemplateBinding Background}" BorderThickness="{TemplateBinding BorderThickness}" 
                    BorderBrush="{TemplateBinding BorderBrush}">
                <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
            </Border>
        </ControlTemplate>
    </StackPanel.Resources>

    <Button Template="{StaticResource ButtonTemplate}" Background="Red">
        <Button.Style>
            <Style TargetType="{x:Type Button}">
                <Setter Property="Background" Value="Blue"/>
                <Style.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="Background" Value="Yellow" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
        Which color do you expect?
    </Button>
</StackPanel>

Örnekte özelliği Background yerel olarak olarak ayarlanmıştır Red. Ancak, düğmenin kapsamında bildirilen örtük stil, özelliğini olarak Blueayarlamaya Background çalışır. Fare düğmenin üzerindeyken, örtük stildeki tetikleyici özelliğini olarak Yellowayarlamaya Background çalışır. Zorlama ve animasyon dışında, yerel olarak ayarlanmış bir özellik değeri en yüksek önceliğe sahiptir, bu nedenle düğme fare üzerinde bile kırmızı olur. Ancak, düğmeden yerel olarak ayarlanan değeri kaldırırsanız, değerini stilden alır Background . Bir stilde tetikleyiciler önceliklidir, bu nedenle düğme fare üzerinde sarı, aksi takdirde mavi olur. Varsayılan şablon sabit kodlanmış bir fare geçişi Background değerine sahip olduğundan, örnek düğmenin varsayılan ControlTemplate değerinin yerini alır.

Bağımlılık özelliği öncelik listesi

Aşağıdaki liste, özellik sisteminin bağımlılık özelliklerine çalışma zamanı değerleri atarken kullandığı kesin öncelik sırasıdır. En yüksek öncelik önce listelenir.

  1. Özellik sistemi zorlaması. Zorlama hakkında daha fazla bilgi için bkz . Zorlama ve animasyonlar.

  2. Etkin animasyonlar veya Ayrı Tutma davranışına sahip animasyonlar. Pratik bir etkiye sahip olmak için, temel değer yerel olarak ayarlanmış olsa bile animasyon değerinin temel (animasyonsuz) değerden öncelikli olması gerekir. Daha fazla bilgi için bkz . Zorlama ve animasyonlar.

  3. Yerel değerler. XAML'de bir öznitelik veya özellik öğesi ayarlamaya veya belirli bir örneğin özelliğini kullanarak API'ye SetValue yapılan bir çağrıya eşit olan bir "sarmalayıcı" özelliği aracılığıyla yerel bir değer ayarlayabilirsiniz. Bağlama veya kaynak aracılığıyla ayarlanan yerel bir değer, doğrudan ayarlanmış bir değerle aynı önceliğe sahip olur.

  4. TemplatedParent şablonu özellik değerleri. Bir öğe, bir TemplatedParent şablon (ControlTemplate veya DataTemplate) tarafından oluşturulmuşsa öğesine sahiptir. Daha fazla bilgi için bkz . TemplatedParent. tarafından belirtilen şablonda TemplatedParentöncelik sırası:

    1. Tetikleyiciler.

    2. Özellik kümeleri, genellikle XAML öznitelikleri aracılığıyla.

  5. Örtük stiller. Yalnızca özelliği için Style geçerlidir. Style değer, öğe türüyle eşleşen bir değere sahip herhangi bir TargetType stil kaynağıdır. Stil kaynağının sayfa veya uygulama içinde mevcut olması gerekir. Örtük stil kaynağının aranması, Temalar'daki stil kaynaklarına genişletilmez.

  6. Stil tetikleyicileri. Stil tetikleyicisi, açık veya örtük bir stil içindeki tetikleyicidir. Stil, sayfa veya uygulama içinde bulunmalıdır. Varsayılan stillerdeki tetikleyicilerin önceliği daha düşüktür.

  7. Şablon tetikleyicileri. Şablon tetikleyicisi, doğrudan uygulanan bir şablondan veya stil içindeki bir şablondan gelen bir tetikleyicidir. Stil, sayfa veya uygulama içinde bulunmalıdır.

  8. Stil ayarlayıcı değerleri. Stil ayarlayıcısı değeri, stil içindeki bir Setter tarafından uygulanan bir değerdir. Stil, sayfa veya uygulama içinde bulunmalıdır.

  9. Tema stilleri olarak da bilinen varsayılan stiller. Daha fazla bilgi için bkz . Varsayılan (Tema) stilleri. Varsayılan stilde öncelik sırası:

    1. Etkin tetikleyiciler.

    2. Ayarlayıcı.

  10. Devralma. Bir alt öğenin bazı bağımlılık özellikleri, değerlerini üst öğeden devralır. Bu nedenle, uygulama genelindeki her öğede özellik değerleri ayarlamak gerekli olmayabilir. Daha fazla bilgi için bkz . Özellik değeri devralma.

  11. Bağımlılık özelliği meta verilerinden varsayılan değer Bağımlılık özelliği, bu özelliğin özellik sistem kaydı sırasında ayarlanmış bir varsayılan değere sahip olabilir. Bağımlılık özelliğini devralan türetilmiş sınıflar, bağımlılık özelliği meta verilerini (varsayılan değer dahil) tür bazında geçersiz kılabilir. Daha fazla bilgi için bkz . Bağımlılık özelliği meta verileri. Devralınan bir özellik için üst öğenin varsayılan değeri, alt öğenin varsayılan değerinden önceliklidir. Bu nedenle, devralınabilir bir özellik ayarlanmazsa, alt öğenin varsayılan değeri yerine kök veya üst öğenin varsayılan değeri kullanılır.

Templatedparent

TemplatedParent öncelik, doğrudan standart uygulama işaretlemesinde bildirilen öğelerin özelliklerine uygulanmaz. Kavram TemplatedParent yalnızca bir şablonun uygulanmasıyla ortaya çıkan bir görsel ağaç içindeki alt öğeler için mevcuttur. Özellik sistemi tarafından belirtilen TemplatedParent şablonda bir öğenin özellik değerlerini ararken, öğesini oluşturan şablonu arar. Şablondaki TemplatedParent özellik değerleri genellikle öğe üzerinde yerel olarak ayarlanmış değerlermiş gibi davranır, ancak şablonlar paylaşılma olasılığı olduğundan gerçek yerel değerlerden daha az önceliklidir. Daha fazla bilgi için bkz. TemplatedParent.

Style özelliği

Aynı öncelik sırası, özelliği dışında Style tüm bağımlılık özellikleri için geçerlidir. Style özelliği, kendi stilinde oluşturulamadığı için benzersizdir. Özelliği zorlamak veya animasyonunu oluşturmak Style önerilmez (ve özelliğin animasyonunu Style oluşturmak için özel bir animasyon sınıfı gerekir). Sonuç olarak, tüm öncelik öğeleri geçerli değildir. Özelliğini ayarlamanın Style yalnızca üç yolu vardır:

  • Açık stil. Bir Style öğenin özelliği doğrudan ayarlanır. Özellik Style değeri, yerel bir değermiş gibi davranır ve öncelik listesindeki 3. öğeyle aynı önceliğe sahiptir. Çoğu senaryoda, açık stiller satır içinde tanımlanmamıştır ve bunun yerine kaynak olarak açıkça başvurulur, örneğin Style="{StaticResource myResourceKey}".

  • Örtük stil. Bir Style öğenin özelliği doğrudan ayarlanmadı. Bunun yerine, bir stil sayfa veya uygulama içinde bir düzeyde mevcut olduğunda uygulanır ve stilin uygulandığı öğe türüyle eşleşen bir kaynak anahtarına sahiptir, örneğin <Style TargetType="x:Type Button">. Türün tam olarak eşleşmesi gerekir, örneğin <Style TargetType="x:Type Button"> türünden Buttontüretilmiş olsa MyButton bile türüne MyButton uygulanmaz. Özellik Style değeri, öncelik listesindeki 5. öğeyle aynı önceliğe sahiptir. Örtük stil değeri, yöntemi çağrılarak DependencyPropertyHelper.GetValueSource , özelliği geçirilerek Style ve ImplicitStyleReference sonuçların denetlenerek algılanabilir.

  • Tema stili olarak da bilinen varsayılan stil. Bir Style öğenin özelliği doğrudan ayarlanmadı. Bunun yerine, WPF sunu altyapısı tarafından çalışma zamanı teması değerlendirmesinden gelir. Çalışma zamanından Style önce özellik değeri olur null. Özellik Style değeri, öncelik listesindeki 9. öğeyle aynı önceliğe sahiptir.

Varsayılan (Tema) stilleri

WPF ile birlikte gelen her denetimin temaya göre değişebilen varsayılan bir stili vardır. Bu nedenle varsayılan stil bazen tema stili olarak adlandırılır.

ControlTemplate, bir denetim için varsayılan stilde yer alan önemli bir öğedir. ControlTemplate , stilin özelliği için bir ayarlayıcı değeridir Template . Varsayılan stiller şablon içermiyorsa, özel bir stilin parçası olarak özel şablonu olmayan bir denetim görsel görünüme sahip olmaz. Bir şablon bir denetimin görsel görünümünü tanımlamakla birlikte, şablonun görsel ağacındaki özelliklerle ilgili denetim sınıfı arasındaki bağlantıları da tanımlar. Her denetim, şablonu değiştirmeden denetimin görsel görünümünü etkileyebilecek bir özellik kümesi sunar. Örneğin, bir bileşen olan ScrollBar denetimin Thumb varsayılan görsel görünümünü göz önünde bulundurun.

Denetimin Thumb belirli özelleştirilebilir özellikleri vardır. Denetimin Thumb varsayılan şablonu, eğimli bir görünüm oluşturmak için birkaç iç içe Border bileşen içeren temel bir yapı veya görsel ağaç oluşturur. Şablon içinde, sınıf tarafından Thumb özelleştirilebilir olması amaçlanan özellikler TemplateBinding aracılığıyla kullanıma sunulur. Denetimin varsayılan şablonu, Thumb veya BorderThicknessgibi Background özelliklerle bir şablon bağlamasını paylaşan çeşitli kenarlık özelliklerine sahiptir. Ancak, özellikler veya görsel düzenlemelerin değerleri şablonda sabit kodlanmışsa veya doğrudan temadan gelen değerlere bağlıysa, yalnızca şablonun tamamını değiştirerek bu değerleri değiştirebilirsiniz. Genellikle, bir özellik şablonlu bir üst öğeden geliyorsa ve tarafından TemplateBindinggösterilmemişse, özellik değerini hedeflemenin uygun bir yolu olmadığından stiller tarafından değiştirilemez. Ancak bu özellik, uygulanan şablondaki özellik değeri devralma özelliğinden veya varsayılan değerden etkilenebilir.

Varsayılan stiller tanımlarında bir TargetType belirtir. Çalışma zamanı tema değerlendirmesi, varsayılan stilin bir denetimin özelliğiyle DefaultStyleKey eşleşirTargetType. Buna karşılık, örtük stiller için arama davranışı denetimin gerçek türünü kullanır. değeri DefaultStyleKey türetilmiş sınıflar tarafından devralınır, bu nedenle başka bir şekilde ilişkili stile sahip olmayan türetilmiş öğeler varsayılan görsel görünüme sahip olur. Örneğin, öğesinden MyButtonButtontüretilirseniz MyButton varsayılan şablonu Buttondevralır. Türetilmiş sınıflar, bağımlılık özelliği meta verilerinde varsayılan değerini DefaultStyleKey geçersiz kılabilir. Bu nedenle, için MyButtonfarklı bir görsel gösterim istiyorsanız, üzerinde MyButtoniçin DefaultStyleKey bağımlılık özelliği meta verilerini geçersiz kılabilir ve ardından denetiminizle birlikte paketleyebileceğiniz bir şablon da dahil olmak üzere ilgili varsayılan stili tanımlayabilirsinizMyButton. Daha fazla bilgi için bkz . Denetim yazmaya genel bakış.

Dinamik kaynak

Dinamik kaynak başvuruları ve bağlama işlemleri, ayarlandıkları konumdan önceliğe sahiptir. Örneğin, yerel bir değere uygulanan dinamik kaynak, öncelik listesindeki 3. öğeyle aynı önceliğe sahiptir. Başka bir örnek olarak, varsayılan stildeki bir özellik ayarlayıcısına uygulanan dinamik kaynak bağlaması, öncelik listesindeki 9. öğeyle aynı önceliğe sahiptir. Dinamik kaynak başvurularının ve bağlamanın uygulamanın çalışma zamanı durumundan değerler alması gerektiğinden, belirli bir özelliğin özellik değeri önceliğini belirleme işlemi çalışma zamanına genişletir.

Dinamik kaynak başvuruları teknik olarak özellik sisteminin bir parçası değildir ve öncelik listesiyle etkileşim kuran kendi arama sıralarına sahiptir. Temel olarak, dinamik kaynak başvurularının önceliği şudur: öğeden sayfa köküne, uygulamaya, temaya ve ardından sisteme. Daha fazla bilgi için bkz . XAML Kaynakları.

Dinamik kaynak başvuruları ve bağlamaları, ayarlandıkları konumdan önceliğe sahip olsa da, değer ertelenmiş olur. Bunun bir sonucu, yerel bir değere dinamik bir kaynak veya bağlama ayarlarsanız, yerel değerde yapılan herhangi bir değişikliğin dinamik kaynağın veya bağlamanın tamamen yerini alır. Yerel olarak ayarlanan değeri temizlemek için yöntemini çağırsanız ClearValue bile, dinamik kaynak veya bağlama geri yüklenmez. Aslında, dinamik kaynağı veya bağlaması olan bir özelliği çağırırsanız ClearValue (sabit yerel değer olmadan), dinamik kaynak veya bağlama temizlenir.

SetCurrentValue

SetCurrentValue yöntemi bir özelliği ayarlamanın başka bir yoludur, ancak öncelik listesinde yer almamaktadır. SetCurrentValue önceki bir değerin kaynağının üzerine yazmadan özelliğin değerini değiştirmenize olanak tanır. Örneğin, bir özellik bir tetikleyici tarafından ayarlanırsa ve ardından kullanarak SetCurrentValuebaşka bir değer atarsanız, sonraki tetikleyici eylemi özelliği tetikleyici değerine geri ayarlar. Bu değere yerel bir değerin öncelik düzeyini vermeden bir özellik değeri ayarlamak istediğinizde kullanabilirsiniz SetCurrentValue . Benzer şekilde, bir özelliğin değerini bağlamanın üzerine yazmadan değiştirmek için de kullanabilirsiniz SetCurrentValue .

Zorlama ve animasyon

Hem zorlama hem de animasyon temel değer üzerinde işlem yapar. Temel değer, öğe 2'ye ulaşılana kadar öncelik listesi üzerinden yukarı doğru değerlendirilerek belirlenen, en yüksek önceliğe sahip bağımlılık özelliği değeridir.

Animasyon belirli davranışlar için hem hem de FromTo özellik değerlerini belirtmezse veya tamamlandığında animasyon kasıtlı olarak temel değere geri dönüyorsa, temel değer animasyonlu değeri etkileyebilir. Bunu uygulamada görmek için Hedef Değerler örnek uygulamasını çalıştırın. Örnekte dikdörtgen yüksekliği için herhangi bir From değerden farklı ilk yerel değerleri ayarlamayı deneyin. Örnek animasyonlar, temel değer yerine değeri kullanarak From hemen başlar. bir animasyon tamamlandıktan sonra olarak FillBehaviorbelirterek Stop bir özellik değerini temel değerine sıfırlar. Normal öncelik, animasyon sona erdikten sonra temel değer belirleme için kullanılır.

Tek bir özelliğe birden çok animasyon uygulanabilir ve her animasyon farklı bir önceliğe sahiptir. Animasyonu en yüksek önceliğe sahip uygulamak yerine WPF sunu altyapısı, animasyonların nasıl tanımlandığına ve animasyonlu değerlerin türüne bağlı olarak animasyon değerlerini birleştirebilir. Daha fazla bilgi için bkz. Animasyona genel bakış.

Zorlama, öncelik listesinin en üstünde yer alır. Çalışan bir animasyon bile değer zorlamasına tabidir. WPF'deki bazı mevcut bağımlılık özellikleri yerleşik zorlamaya sahiptir. Özel bağımlılık özellikleri için, bir özellik oluştururken meta verilerin bir parçası olarak geçirdiğiniz bir CoerceValueCallback yazarak zorlama davranışını tanımlayabilirsiniz. Ayrıca, türetilmiş bir sınıfta bu özelliğin meta verilerini geçersiz kılarak mevcut özelliklerin zorlama davranışını geçersiz kılabilirsiniz. Zorlama, temel değerle, zorlama üzerindeki kısıtlamaların o sırada mevcut olduğu gibi uygulanacağı, ancak temel değerin hala korunacağı şekilde etkileşim kurar. Sonuç olarak, zorlamadaki kısıtlamalar daha sonra kaldırılırsa, zorlama temel değere mümkün olan en yakın değeri döndürür ve potansiyel olarak tüm kısıtlamalar kaldırıldığında bir özellik üzerindeki zorlama etkisi sona erer. Zorlama davranışı hakkında daha fazla bilgi için bkz . Bağımlılık özelliği geri çağırmaları ve doğrulama.

Tetikleyici davranışları

Denetimler genellikle tetikleyici davranışlarını varsayılan stillerinin bir parçası olarak tanımlar. Denetimlerde yerel özelliklerin ayarlanması, tetikleyicilerin kullanıcı odaklı olaylara (görsel veya davranışsal) yanıt vermesini önleyerek bu tetikleyicilerle çakışabilir. Özellik tetikleyicisinin yaygın kullanımlarından biri, veya IsEnabledgibi IsSelected durum özelliklerini denetlemektir. Örneğin, varsayılan olarak, bir Button devre dışı bırakıldığında, tema stili tetikleyicisi (IsEnabled is false) değeri gri görünmesini sağlayacak Button şekilde ayarlarForeground. Yerel Foreground bir değer ayarladıysanız, yüksek öncelik yerel özellik değeri devre dışı bırakıldığında Button bile tema stili Foreground değerini geçersiz kılacaktır. Bir denetim için tema düzeyi tetikleyici davranışlarını geçersiz kılan özellik değerlerini ayarlarken, söz konusu denetim için hedeflenen kullanıcı deneyimine gereksiz şekilde müdahale etmemeye dikkat edin.

ClearValue

yöntemi, ClearValue bir öğenin bağımlılık özelliğinin yerel olarak uygulanan tüm değerlerini temizler. Ancak çağrı ClearValue , özellik kaydı sırasında meta verilerde oluşturulan varsayılan değerin yeni etkin değer olduğunu garanti etmez. Öncelik listesindeki diğer tüm katılımcılar hala etkindir ve yalnızca yerel olarak ayarlanan değer kaldırılır. Örneğin, tema stili olan bir özelliği çağırırsanız ClearValue , tema stili değeri meta veri tabanlı varsayılan değer yerine yeni değer olarak uygulanır. Kayıtlı meta veri varsayılan değerine bir özellik değeri ayarlamak istiyorsanız, bağımlılık özelliği meta verilerini sorgulayarak varsayılan meta veri değerini alın ve çağrısıyla SetValueözellik değerini yerel olarak ayarlayın.

Ayrıca bkz.