WPF İçinde Ağaçlar

Birçok teknolojide, öğeler ve bileşenler, geliştiricilerin bir uygulamanın işlenmesini veya davranışını etkilemek için ağaçtaki nesne düğümlerini doğrudan işlediği bir ağaç yapısında düzenlenir. Windows Presentation Foundation (WPF), program öğeleri arasındaki ilişkileri tanımlamak için çeşitli ağaç yapısı metaforları da kullanır. Çoğunlukla WPF geliştiricileri kodda bir uygulama oluşturabilir veya nesne ağacı metaforu hakkında kavramsal olarak düşünürken XAML'de uygulamanın bölümlerini tanımlayabilir, ancak XML DOM'da kullanabileceğiniz gibi bazı genel nesne ağacı işleme API'leri yerine belirli API'yi veya belirli işaretlemeleri çağıracak. WPF, LogicalTreeHelper bir ağaç metaforu görünümü sağlayan iki yardımcı sınıfı kullanıma sunar ve VisualTreeHelper. Görsel ağaç ve mantıksal ağaç terimleri WPF belgelerinde de kullanılır çünkü bu ağaçlar belirli temel WPF özelliklerinin davranışını anlamak için yararlıdır. Bu konu, görsel ağaç ve mantıksal ağacın neyi temsil yaptığını tanımlar, bu tür ağaçların genel bir nesne ağacı kavramıyla nasıl ilişkili olduğunu açıklar ve bunları tanıtır LogicalTreeHelperVisualTreeHelper.

WPF İçinde Ağaçlar

WPF'deki en eksiksiz ağaç yapısı nesne ağacıdır. XAML'de bir uygulama sayfası tanımlar ve ardından XAML'yi yüklerseniz, ağaç yapısı işaretlemedeki öğelerin iç içe ilişkilerine göre oluşturulur. Kodda bir uygulama veya uygulamanın bir bölümünü tanımlarsanız, ağaç yapısı belirli bir nesne için con çadır modu l uygulayan özellikler için özellik değerlerini nasıl atadığınıza bağlı olarak oluşturulur. WPF'de, nesne ağacının tamamının kavramsallaştırılıp genel API'sine raporlanabilmesinin iki yolu vardır: mantıksal ağaç ve görsel ağaç olarak. Mantıksal ağaç ve görsel ağaç arasındaki ayrımlar her zaman önemli değildir, ancak bazen bazı WPF alt sistemlerinde sorunlara neden olabilir ve işaretleme veya kodda yaptığınız seçimleri etkileyebilir.

Her zaman mantıksal ağacı veya görsel ağacı doğrudan işlemeseniz de, ağaçların etkileşim kurma kavramlarını anlamak WPF'yi bir teknoloji olarak anlamak için yararlıdır. WPF'yi bir tür ağaç metaforu olarak düşünmek, özellik devralma ve olay yönlendirmenin WPF'de nasıl çalıştığını anlamak için de çok önemlidir.

Dekont

Nesne ağacı gerçek bir API'den çok bir kavram olduğundan, kavramı düşünmenin başka bir yolu nesne grafıdır. Pratikte, çalışma zamanında nesneler arasında ağaç metaforunun parçalanacağı ilişkiler vardır. Bununla birlikte, özellikle XAML tanımlı kullanıcı arabiriminde ağaç metaforu, çoğu WPF belgesinin bu genel kavrama başvururken nesne ağacı terimini kullanacağı kadar ilgilidir.

Mantıksal Ağaç

WPF'de, bu öğeleri destekleyen nesnelerin özelliklerini ayarlayarak ui öğelerine içerik eklersiniz. Örneğin, bir denetimin özelliğini düzenleyerek denetime ListBoxItems öğe eklersiniz. Bunu yaparak, özellik değeri olan Items öğeleri içine ItemCollection yerleştirirsiniz. Benzer şekilde, bir DockPanelöğesine nesne eklemek için özellik değerini işlemeniz Children gerekir. Burada, nesnesine UIElementCollectionnesneler eklersiniz. Kod örneği için bkz . Nasıl yapılır: Dinamik Olarak Öğe Ekleme.

Genişletilebilir Uygulama İşaretlemeyi Dili'nde (XAML) liste öğelerini bir ListBox veya denetimlerine veya diğer kullanıcı arabirimi öğelerine DockPanelyerleştirdiğinizde, aşağıdaki örnekte olduğu gibi ve Children özelliklerini de açıkça veya örtük olarak kullanırsınızItems.

<DockPanel
  Name="ParentElement"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  >
  <!--implicit: <DockPanel.Children>-->
  <ListBox DockPanel.Dock="Top">
    <!--implicit: <ListBox.Items>-->
    <ListBoxItem>
      <TextBlock>Dog</TextBlock>
    </ListBoxItem>
    <ListBoxItem>
      <TextBlock>Cat</TextBlock>
    </ListBoxItem>
    <ListBoxItem>
      <TextBlock>Fish</TextBlock>
    </ListBoxItem>
  <!--implicit: </ListBox.Items>-->
  </ListBox>
  <Button Height="20" Width="100" DockPanel.Dock="Top">Buy a Pet</Button>
  <!--implicit: </DockPanel.Children>-->
</DockPanel>

Bu XAML'yi bir belge nesne modeli altında XML olarak işlemeniz gerekiyorsa ve örtük olarak açıklama eklenmiş etiketleri eklediyseniz (bu yasal olurdu), sonuçta elde edilen XML DOM ağacı ve diğer örtük öğeler için <ListBox.Items> öğeler içeriyor olurdu. Ancak işaretlemeyi okuduğunuzda ve nesnelere yazdığınızda XAML bu şekilde işlemez, sonuçta elde edilen nesne grafı tam anlamıyla içermez ListBox.Items. Ancak, XAML işlendiğinde ListBox başlatılan ancak boş olan ItemCollection adlı Items bir ItemCollectionözelliği vardırListBox. Ardından, için ListBox içerik olarak var olan her alt nesne öğesi öğesine ayrıştırıcı tarafından çağrılara ItemCollection.AddeklenirItemCollection. XAML'yi nesne ağacına işlemeye ilişkin bu örnek, oluşturulan nesne ağacının temelde mantıksal ağaç olduğu bir örnek gibi görünüyor.

Ancak mantıksal ağaç, XAML örtük söz dizimi öğelerinin dikkate alınmadığı durumlarda bile çalışma zamanında uygulama kullanıcı arabiriminiz için var olan nesne grafiğinin tamamı değildir. Bunun temel nedeni görseller ve şablonlardır. Örneğin, değerini Buttongöz önünde bulundurun. Mantıksal ağaç nesnesini ve dizesini ContentraporlarButton. Ancak, çalışma zamanı nesne ağacında bu düğmenin daha fazlası vardır. Özellikle, düğme yalnızca belirli Button bir denetim şablonu uygulandığından ekranda göründüğü gibi görünür. Uygulanan bir şablondan gelen görseller (görsel düğmesinin etrafındaki koyu grinin şablon tanımı Border gibi), çalışma zamanında mantıksal ağaca bakıyor olsanız bile (görünen kullanıcı arabiriminden bir giriş olayını işleme ve ardından mantıksal ağacı okuma gibi) mantıksal ağaçta raporlanmaz. Şablon görsellerini bulmak için bunun yerine görsel ağacı incelemeniz gerekir.

XAML söz diziminin oluşturulan nesne grafı ve XAML'de örtük söz dizimi ile nasıl eşleştiği hakkında daha fazla bilgi için bkz . Ayrıntılı XAML Söz Dizimi veya WPF'de XAML.

Mantıksal Ağacın Amacı

Mantıksal ağaç, con çadır modu ls öğesinin olası alt nesneleri üzerinde kolayca yinelenebilmesini ve böylece con çadır modu ls'nin genişletilebilir olmasını sağlar. Ayrıca mantıksal ağaç, mantıksal ağaçtaki tüm nesnelerin yüklendiği durumlar gibi belirli bildirimler için bir çerçeve sağlar. Temel olarak, mantıksal ağaç, çalışma zamanı nesne grafiğinin çerçeve düzeyinde görselleri dışlayan bir yaklaşık değeridir, ancak kendi çalışma zamanı uygulamanızın bileşimine göre birçok sorgulama işlemi için yeterlidir.

Buna ek olarak, hem statik hem de dinamik kaynak başvuruları, ilk istekte bulunan nesnedeki koleksiyonlar için Resources mantıksal ağaç üzerinden yukarı bakılarak ve ardından mantıksal ağaç devam ettirilerek ve her (veya FrameworkContentElement) içinde büyük olasılıkla bu anahtarı içeren bir değeri içeren başka Resources bir ResourceDictionarydeğer olup olmadığını denetleyerek FrameworkElement çözümlenir. Mantıksal ağaç, hem mantıksal ağaç hem de görsel ağaç mevcut olduğunda kaynak arama için kullanılır. Kaynak sözlükleri ve arama hakkında daha fazla bilgi için bkz . XAML Kaynakları.

Mantıksal Ağacın Bileşimi

Mantıksal ağaç WPF çerçeve düzeyinde tanımlanır; bu da mantıksal ağaç işlemleri için en uygun WPF temel öğesinin veya FrameworkElementFrameworkContentElementolduğu anlamına gelir. Ancak API'yi gerçekten kullanıp kullanmadığınız LogicalTreeHelper görebileceğiniz gibi mantıksal ağaç bazen veya FrameworkContentElementolmayan FrameworkElement düğümler içerir. Örneğin, mantıksal ağaç dize olan değerini TextBlockraporlarText.

Mantıksal Ağacı Geçersiz Kılma

Gelişmiş denetim yazarları, genel bir nesnenin veya con çadır modu l öğesinin mantıksal ağaç içindeki nesneleri nasıl eklediğini veya kaldırdığını tanımlayan birkaç API'yi geçersiz kılarak mantıksal ağacı geçersiz kılabilir. Mantıksal ağacı geçersiz kılma örneği için bkz . Mantıksal Ağacı Geçersiz Kılma.

Özellik Değeri Kalıtımı

Özellik değeri devralma, karma bir ağaç üzerinden çalışır. Özellik devralmayı etkinleştiren özelliği içeren Inherits gerçek meta veriler WPF çerçeve düzeyi FrameworkPropertyMetadata sınıfıdır. Bu nedenle, hem özgün değeri tutan üst öğe hem de bu değeri FrameworkElement devralan alt nesne veya FrameworkContentElementolmalıdır ve her ikisi de bir mantıksal ağacın parçası olmalıdır. Ancak, özellik devralmayı destekleyen mevcut WPF özellikleri için, özellik değeri devralma mantıksal ağaçta olmayan bir araya gelen nesne aracılığıyla devam edebilir. Temel olarak bu, şablon öğelerinin şablonlu örnekte veya hala sayfa düzeyi oluşturma düzeylerinde ve dolayısıyla mantıksal ağaçta daha yüksek düzeyde ayarlanmış devralınan özellik değerlerini kullanmasını sağlamak için geçerlidir. Özellik değeri devralma işleminin böyle bir sınırda tutarlı bir şekilde çalışması için devralan özelliğin ekli özellik olarak kaydedilmesi gerekir ve özellik devralma davranışıyla özel bir bağımlılık özelliği tanımlamayı planlıyorsanız bu deseni izlemeniz gerekir. Özellik devralma için kullanılan tam ağaç, çalışma zamanında bile yardımcı sınıf yardımcı programı yöntemi tarafından tam olarak tahmin edilemez. Daha fazla bilgi için bkz . Özellik Değeri Devralma.

Görsel Ağaç

Mantıksal ağaç kavramına ek olarak WPF'de görsel ağaç kavramı da vardır. Görsel ağaç, temel sınıf tarafından Visual gösterildiği gibi görsel nesnelerin yapısını açıklar. Bir denetim için şablon yazarken, bu denetim için geçerli olan görsel ağacı tanımlar veya yeniden tanımlarsınız. Görsel ağaç, performans ve iyileştirme nedenleriyle çizim üzerinde daha düşük düzeyde denetim sahibi olmak isteyen geliştiriciler için de ilgi çekicidir. Geleneksel WPF uygulama programlamasının bir parçası olarak görsel ağacının açığa çıkarmalarından biri, yönlendirilen bir olay için olay yollarının mantıksal ağaç değil çoğunlukla görsel ağaç boyunca seyahat etme olmasıdır. Denetim yazarı olmadığınız sürece yönlendirilmiş olay davranışının bu inceliği hemen görülmeyebilir. Olayları görsel ağaç üzerinden yönlendirmek, olayları işlemek veya olay ayarlayıcıları oluşturmak için görsel düzeyinde oluşturma uygulayan denetimleri etkinleştirir.

Ağaçlar, İçerik Öğeleri ve İçerik Konakları

İçerik öğeleri (öğesinden ContentElementtüretilen sınıflar) görsel ağacın parçası değildir; öğesinden Visual devralınır ve görsel gösterimi yoktur. Kullanıcı arabiriminde görünmesi için, hem ContentElement hem de mantıksal ağaç katılımcısı olan bir Visual içerik konasında barındırılması gerekir. Genellikle böyle bir nesne bir FrameworkElement'dir. İçerik ana bilgisayarının içerik için bir "tarayıcı" gibi olduğunu kavramsallaştırabilir ve bu içeriğin konağın denetleyebileceği ekran bölgesinde nasıl görüntüleneceğini seçebilirsiniz. İçerik barındırıldığında, içerik normalde görsel ağaçla ilişkili belirli ağaç işlemlerinde katılımcı yapılabilir. Genellikle konak sınıfı, barındırılan FrameworkElement içerik gerçek görsel ağacının parçası olmasa bile içerik mantıksal ağacının alt düğümleri aracılığıyla olay yoluna barındırılan ContentElement herhangi birini ekleyen uygulama kodunu içerir. Bu, bir ContentElement öğesinin kendisi dışındaki herhangi bir öğeye yönlendiren yönlendirilmiş bir olay kaynağı olabilmesi için gereklidir.

Ağaç Geçişi

sınıfı, LogicalTreeHelper mantıksal ağaç geçişi için , GetParentve FindLogicalNode yöntemlerini sağlarGetChildren. Çoğu durumda, var olan denetimlerin mantıksal ağacını dolaşmanız gerekmez, çünkü bu denetimler mantıksal alt öğelerini neredeyse her zaman , dizin oluşturucu gibi koleksiyon erişimini destekleyen ayrılmış bir koleksiyon özelliği olarak Addkullanıma sunar. Ağaç geçişi temel olarak, veya gibi ItemsControl hedeflenen denetim desenlerinden türetmemeyi seçen ve Panel koleksiyon özelliklerinin zaten tanımlandığı ve kendi koleksiyon özelliği desteğini sağlamayı amaçlayan denetim yazarları tarafından kullanılan bir senaryodur.

Görsel ağaç, görsel ağaç geçişi VisualTreeHelperiçin yardımcı sınıfını da destekler. Görsel ağaç denetime özgü özellikler aracılığıyla rahatça gösterilmez, bu nedenle VisualTreeHelper programlama senaryonuz için gerekliyse görsel ağaçtan geçiş yapmak için önerilen yol sınıfıdır. Daha fazla bilgi için bkz. WPF’de Grafik İşlemeye Genel Bakış.

Dekont

Bazen uygulanan bir şablonun görsel ağacını incelemek gerekir. Bu tekniği kullanırken dikkatli olmalısınız. Şablonu tanımladığınız bir denetim için görsel ağaçtan geçseniz bile, denetiminizin tüketicileri her zaman örnekte özelliğini ayarlayarak Template şablonu değiştirebilir ve hatta son kullanıcı sistem temasını değiştirerek uygulanan şablonu etkileyebilir.

Yönlendirilmiş Olaylar için "Ağaç" Olarak Rotalar

Daha önce belirtildiği gibi, belirli bir yönlendirilmiş olayın yolu, görsel ve mantıksal ağaç gösterimlerinin karması olan bir ağacın tek ve önceden belirlenmiş yolu boyunca ilerler. Olay rotası, tünel oluşturma veya köpüğün yönlendirilmiş olay olmasına bağlı olarak ağaç içindeki yukarı veya aşağı yönde ilerleyebilir. Olay yolu kavramının, gerçekten yönlendiren bir olay oluşturmakla bağımsız olarak olay rotasını "yürümek" için kullanılabilecek doğrudan destekleyici bir yardımcı sınıfı yoktur. yolunu temsil eden bir sınıf vardır, EventRouteancak bu sınıfın yöntemleri genellikle yalnızca iç kullanım içindir.

Kaynak Sözlükleri ve Ağaçlar

Bir sayfada tanımlanan tüm Resources kaynaklar için kaynak sözlüğü araması temel olarak mantıksal ağaçtan çapraz geçiş sağlar. Mantıksal ağaçta olmayan nesneler anahtarlı kaynaklara başvurabilir, ancak kaynak arama dizisi bu nesnenin mantıksal ağaca bağlandığı noktada başlar. WPF'de, yalnızca mantıksal ağaç düğümlerinin içeren bir Resources özelliği ResourceDictionaryolabilir, bu nedenle görsel ağaçtan geçiş yaparak anahtarlı kaynakları bir içinden aramanın bir ResourceDictionaryyararı yoktur.

Ancak kaynak arama işlemi, anlık mantıksal ağacın ötesine de yayılabilir. Uygulama işaretlemesi için, kaynak araması uygulama düzeyi kaynak sözlüklerine ve ardından statik özellikler veya anahtarlar olarak başvuruda bulunan tema desteğine ve sistem değerlerine doğru devam edebilir. Kaynak başvuruları dinamikse temaların kendileri de tema mantıksal ağacının dışındaki sistem değerlerine başvurabilir. Kaynak sözlükleri ve arama mantığı hakkında daha fazla bilgi için bkz . XAML Kaynakları.

Ayrıca bkz.