WPF İçinde Ağaçlar

Birçok teknolojilerde, öğeler ve bileşenler, geliştiricilerin bir uygulamanın işlenmesini veya davranışını etkilemek için ağaçta nesne düğümlerini doğrudan işleyebileceği bir ağaç yapısında düzenlenir. Windows Presentation Foundation (WPF) ayrıca, program öğeleri arasındaki ilişkileri tanımlamak için çeşitli ağaç yapısı metaphiler kullanır. Çoğu bölüm WPF geliştiricisi, kod içinde bir uygulama oluşturabilir veya nesne ağacı metaphor hakkında kavramsal olarak düşünürken XAML 'de uygulamanın bölümlerini tanımlayabilir, ancak belirli bir API 'yi çağırarak veya belirli bir biçimlendirmeyi kullanarak, örneğin, XML DOM 'da kullanabilirsiniz. WPF, ağaç benzetimini görünümü sağlayan iki yardımcı sınıfı sunar LogicalTreeHelper ve VisualTreeHelper . Şartlar görsel ağacı ve mantıksal ağaç, bazı temel WPF özelliklerinin davranışını anlamak için yararlı olduğundan, WPF belgelerinde de kullanılır. Bu konu, görsel ağaç ve mantıksal ağacın ne olduğunu tanımlar, bu ağaçların genel nesne ağacı kavramıyla ilişkisini açıklar ve tanıtır LogicalTreeHelperVisualTreeHelper .

WPF İçinde Ağaçlar

WPF 'deki en kapsamlı ağaç yapısı, nesne ağacıdır. XAML 'de bir uygulama sayfası tanımlayıp XAML yüklerseniz, ağaç yapısı, İşaretlemede öğelerin iç içe geçmiş ilişkilerine göre oluşturulur. Kod içinde uygulamanın bir uygulamasını veya bir bölümünü tanımlarsanız, ağaç yapısı, belirli bir nesne için içerik modelini uygulayan özellikler için özellik değerlerini nasıl atayacağınıza göre oluşturulur. Windows Presentation Foundation (WPF) ' de, tüm nesne ağacının kavramsalsel hale getirilmiş ve genel apı 'sine (mantıksal ağaç ve görsel ağaç olarak) rapor edilebilir iki yolu vardır. Mantıksal ağaç ve görsel ağaç arasındaki farklılıklar her zaman önemli değildir, ancak bazen belirli WPF alt sistemlerinde sorun oluşmasına ve biçimlendirme veya kod içinde yaptığınız seçimleri etkileyebilir.

Mantıksal ağacı ya da görsel ağacı her zaman doğrudan işlemeseniz bile, ağaçların teknolojiyi bir teknoloji olarak anlamak için nasıl etkileşim kurabileceğine ilişkin kavramları anlayın. WPF 'nin bir ağaç benzetimini veya bir tür olarak düşünmek, özellik devralmanın ve olay yönlendirmenin WPF 'de nasıl çalıştığını anlamak için de önemlidir.

Not

Nesne ağacı gerçek bir API 'nin bir kavramından daha fazla olduğundan, kavramı düşünmek için başka bir yöntem de bir nesne grafiği olarak belirlenir. Uygulamada, çalışma zamanında ağaç benzetimini 'ın parçalara kapbulunacağı nesneler arasında ilişkiler vardır. Bununla birlikte, özellikle xaml tanımlı kullanıcı arabirimi ile, ağaç benzetimini, bu genel kavrama başvururken en çok WPF belgelerinin nesne ağacını kullanması yeterli olacaktır.

Mantıksal ağaç

WPF içinde, bu öğeleri geri alan nesnelerin özelliklerini ayarlayarak UI öğelerine içerik eklersiniz. Örneğin, özelliğini düzenleyerek öğeleri bir denetime eklersiniz ListBoxItems . Bunu yaparak öğesi, ItemCollection özellik değeri olan öğesine yerleştirirsiniz Items . Benzer şekilde, bir öğesine nesne eklemek için DockPanel , Children özellik değerini işlersiniz. Burada, öğesine nesne ekliyoruz UIElementCollection . Kod örneği için bkz. nasıl yapılır: bir öğeyi dinamik olarak ekleme.

Extensible Application Markup Language (XAML) ' de, liste öğelerini bir ListBox veya denetimlerine veya bir içindeki diğer Kullanıcı Arabirimi öğelerine yerleştirdiğinizde, DockPanelItemsChildren Aşağıdaki örnekte olduğu gibi, ve özelliklerini açıkça veya örtük olarak da kullanırsınız.

<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şlemek olsaydıysanız ve öğeleri örtük olarak (yasal olacak şekilde) eklediyseniz, sonuçta elde edilen XML DOM ağacının öğesi <ListBox.Items> ve diğer örtük öğeler için dahil edilen öğeler vardır. Ancak XAML biçimlendirmeyi okurken ve nesnelere yazdığınızda bu şekilde işlem yapmaz, sonuçta elde edilen nesne grafiğinde tam olarak dahil değildir ListBox.Items . Ancak ListBoxItems , içeren adlı ItemCollection ve ItemCollection xaml işlendiğinde başlatılmış ancak boş olan adlı bir özelliğe sahiptir ListBox . Ardından, için içerik olarak var olan her bir alt nesne öğesi, ListBoxItemCollection ayrıştırıcının öğesine çağrıları tarafından eklenir ItemCollection.Add . XAML 'yi bir nesne ağacına işlemenin bu örneği, oluşturulan nesne ağacının temel olarak mantıksal ağaç olduğu bir örnektir.

Ancak, mantıksal ağaç, çalışma zamanında uygulama kullanıcı arabirimi için mevcut olan nesne grafiğinin tamamı değildir ve XAML örtülü sözdizimi öğeleri de buna eşit değildir. Bunun ana nedeni görseller ve şablonlarıdır. Örneğin, öğesini değerlendirin Button . Mantıksal ağaç, Button nesnesini ve ayrıca dizesini raporlar Content . Ancak çalışma zamanı nesne ağacında bu düğmenin daha fazlası vardır. Özellikle, düğme yalnızca belirli bir denetim şablonu uygulanmış olduğu için ekranda görüntülenir Button . BorderÇalışma zamanı sırasında mantıksal ağaca bakıyor olsanız bile (görünür kullanıcı arabiriminden bir giriş olayı işleme ve ardından mantıksal ağacı okuma gibi), uygulanan bir şablondan gelen görseller (örneğin, görsel düğme etrafında koyu gri), mantıksal ağaçta bildirilmemiştir. Şablon görsellerini bulmak için, bunun yerine görsel ağacı incelemeniz gerekir.

XAML sözdiziminin oluşturulan nesne grafiğine nasıl eşlendiği ve XAML 'de örtük sözdizimi hakkında daha fazla bilgi için bkz. WPF'de ayrıntılı veya xaml 'de XAML sözdizimi .

Mantıksal ağacın amacı

Mantıksal ağaç, içerik modellerinin olası alt nesnelerinin üzerinde kolayca yineleme yapabilmesi ve böylece içerik modellerinin Genişletilebilir olması için vardır. Ayrıca, mantıksal ağaç, mantıksal ağaçtaki tüm nesneler yüklenirken olduğu gibi belirli bildirimler için bir çerçeve sağlar. Temel olarak, mantıksal ağaç, görselleri dışlayan, ancak kendi çalıştırma zamanı uygulamanızın kompozisyonundan çok sayıda sorgulama işlemi için yeterli olan bir çalışma zamanı nesne grafiğinin bir yaklaşık sıdır.

Bunlara ek olarak, hem statik hem de dinamik kaynak başvuruları Resources , ilk istenen nesnedeki koleksiyonlar için mantıksal ağaca giderek ve ardından mantıksal ağacı devam ettirerek FrameworkElementFrameworkContentElementResources , bu anahtarı içeren bir değeri içeren başka bir değer için her bir (veya) kontrol ederek çözümlenir ResourceDictionary . Mantıksal ağaç, hem mantıksal ağaç hem de görsel ağaç varsa 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ımlanmıştır, bu da mantıksal ağaç işlemleri için en uygun WPF temel öğesinin veya olduğu anlamına gelir FrameworkElementFrameworkContentElement . Ancak, API 'yi gerçekten kullanıp kullandıysanız LogicalTreeHelper , mantıksal ağaç bazen veya olmayan düğümleri içerir FrameworkElementFrameworkContentElement . Örneğin, mantıksal ağaç Text ' a bir dize olan değerini bildirir TextBlock .

Mantıksal ağacı geçersiz kılma

Gelişmiş denetim yazarları, genel bir nesne veya içerik modelinin mantıksal ağaç içinde nesne ekleme veya kaldırma şeklini tanımlayan çeşitli API 'Leri geçersiz kılarak mantıksal ağacı geçersiz kılabilir. Mantıksal ağacı nasıl geçersiz kılabileceğiniz hakkında bir örnek için bkz. mantıksal ağacı geçersiz kılma.

Özellik Değeri Kalıtımı

Özellik değeri kalıtımı karma ağaç üzerinden çalışır. InheritsÖzellik devralmayı sağlayan özelliği içeren gerçek meta VERILER WPF framework düzeyi FrameworkPropertyMetadata sınıfıdır. Bu nedenle, hem özgün değeri tutan hem de bu değeri devralan alt nesnenin her ikisi de olmalıdır ve her ikisi FrameworkElementFrameworkContentElement 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 giren nesne aracılığıyla sürdürülebilir. Temel olarak bu, şablon öğelerinin sahip olduğu örnekte ya da daha yüksek sayfa düzeyi bileşim ve bu nedenle mantıksal ağaçta daha yüksek düzeylerde bulunan devralınan özellik değerlerini kullanması için geçerlidir. Özellik değeri kalıtımını bu tür bir sınır boyunca tutarlı bir şekilde çalışacak şekilde, devralan özellik iliştirilmiş bir özellik olarak kaydedilmelidir ve özellik devralma davranışıyla özel bir bağımlılık özelliği tanımlamak istiyorsanız bu düzeni izlemeniz gerekir. Özellik devralımı için kullanılan tam ağaç, çalışma zamanında bile bir yardımcı sınıf yardımcı programı yöntemi tarafından tamamen tahmin edilemez. Daha fazla bilgi için bkz. özellik değeri devralma.

Görsel ağaç

Mantıksal ağaç kavramının yanı sıra, WPF 'de görsel ağaç kavramı de vardır. Görsel ağaç, temel sınıf tarafından temsil edildiği gibi görsel nesnelerin yapısını açıklar Visual . Bir denetim için şablon yazdığınızda, bu denetim için geçerli olan görsel ağacı tanımlar veya yeniden tanımlamanız gerekir. Görsel ağaç Ayrıca, performans ve iyileştirme nedenleriyle çizim üzerinde daha düşük düzeyde denetim isteyen geliştiricilere de ilgi çekici. Geleneksel WPF uygulaması programlama kapsamında görsel ağacın bir parçası olarak, yönlendirilmiş bir olay için olay yollarının, büyük bir şekilde mantıksal ağacı değil, görsel ağaç boyunca seyahat etmesidir. Bu, bir denetim yazarı olmadığınız takdirde, yönlendirilmiş olay davranışının bu alt ttisi hemen görünür olmayabilir. Olayları görsel ağaç aracılığıyla yönlendirme, olayları işlemek veya olay ayarlayıcıları oluşturmak için görsel düzeyde kompozisyon uygulayan denetimleri sağlar.

Ağaçlar, Içerik öğeleri ve Içerik Konakları

İçerik öğeleri (öğesinden türetilen sınıflar ContentElement ) görsel ağacın bir parçası değildir; öğesinden devralınmaz Visual ve görsel temsiline sahip değildir. Her seferinde bir kullanıcı arabiriminde görünmesi için, bir, ContentElement hem a hem de Visual mantıksal ağaç katılımcısı olan bir içerik konağında barındırılmalıdır. Genellikle böyle bir nesnesi olur FrameworkElement . İçerik konağının içerik için bir "tarayıcı" gibi biraz benzediğini ve bu içeriğin ana bilgisayarın denetlediği ekran bölgesi içinde nasıl görüntüleneceğini tercih etmenizi sağlayabilirsiniz. İçerik barındırıldığı zaman, içerik, normal şekilde görsel ağaç ile ilişkili belirli ağaç işlemlerinde katılımcı hale getirilebilir. Genellikle FrameworkElement konak sınıfı, ContentElement barındırılan içerik doğru görsel ağacın bir parçası olmasa bile, içerik mantıksal ağacının alt düğümleri aracılığıyla olay rotasında barındırılan uygulama kodunu içerir. Bu, bir ' ın ContentElement kendisi dışında herhangi bir öğeye yönlendiren yönlendirilmiş bir olay kaynağı kullanabilmesi için gereklidir.

Ağaç geçişi

LogicalTreeHelperSınıfı GetChildren , GetParentFindLogicalNode mantıksal ağaç geçişi için, ve yöntemlerini sağlar. Çoğu durumda, var olan denetimlerin mantıksal ağacına geçiş yapmanız gerekmez, çünkü bu denetimler her zaman mantıksal alt öğelerini Add ,, Dizin Oluşturucu gibi koleksiyon erişimini destekleyen ayrılmış bir koleksiyon özelliği olarak kullanıma sunar. Ağaç geçişi temel olarak, gibi amaçlanan denetim desenlerinden türetilmeyen ItemsControl veya Panel koleksiyon özelliklerinin zaten tanımlandığı ve kendi koleksiyon özelliği desteğini sağlamak isteyen denetim yazarları tarafından kullanılan bir senaryodur.

Görsel ağaç Ayrıca görsel ağaç geçişi için yardımcı bir sınıf destekler VisualTreeHelper . Görsel ağaç denetimine özgü özelliklerle rahat bir şekilde gösterilmez VisualTreeHelper . bu nedenle, programlama senaryonuz için gerekliyse, görsel ağaca geçiş yapmak için önerilen yoldur. Daha fazla bilgi için bkz. WPF Grafik Işlemeye genel bakış.

Not

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

Yönlendirilmiş olaylar için "ağaç" olarak yollar

Daha önce belirtildiği gibi, belirli bir yönlendirilmiş olay rotası, görsel ve mantıksal ağaç temsillerinin karması olan bir ağacın tek ve önceden belirlenmiş bir yolu üzerinde dolaşır. Olay yolu, bir tünel oluşturma veya kabarcıklanma yönlendirilmiş olay olmasına bağlı olarak ağaç içindeki yukarı veya aşağı yönde hareket edebilir. Olay yolu kavramı, gerçekten yönlendiren bir olayı yükseltmeden bağımsız olarak, olay yolunu "göstermek" için kullanılabilecek doğrudan destekleyici yardımcı sınıfına sahip değildir. Yolu temsil eden bir sınıf vardır, EventRoute ancak 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ımlanmış tüm kaynak sözlüğü araması Resources , temel olarak mantıksal ağaca geçer. Mantıksal ağaçta olmayan nesneler, anahtarlı kaynaklara başvurabilir, ancak kaynak arama sırası nesnenin mantıksal ağaca bağlı olduğu noktada başlar. WPF 'de, yalnızca mantıksal ağaç düğümlerinin, içeren bir Resources özelliği olabilir ResourceDictionary , bu nedenle bir ' dan anahtarlı kaynakları arayan görsel ağaç üzerinde geçiş yapma avantajı yoktur ResourceDictionary .

Ancak, kaynak arama, anlık mantıksal ağacın ötesine da genişletebilir. Uygulama biçimlendirmesi için, kaynak arama daha sonra uygulama düzeyi kaynak sözlüklerine ve sonra statik özellikler veya anahtarlar olarak başvurulan Tema desteği ve sistem değerleri ile devam edebilir. Ayrıca, kaynak başvuruları dinamik ise Temalar mantıksal ağacının dışındaki sistem değerlerine de başvurabilir. Kaynak sözlükleri ve arama mantığı hakkında daha fazla bilgi için bkz. xaml kaynakları.

Ayrıca bkz.