WPF Grafik İşlemeye Genel Bakış

Bu konu, WPF görsel katmanına genel bir bakış sağlar. WPF modelinde işleme desteği Visual için sınıfının rolüne odaklanır.

Görsel Nesnenin Rolü

sınıfı, Visual her nesnenin türeyen temel FrameworkElement soyutlamadır. Ayrıca WPF'de yeni denetimler yazmak için giriş noktası olarak da görev eder ve birçok şekilde Win32 uygulama modelinde pencere tanıtıcısı (HWND) olarak düşünebilirsiniz.

nesnesi, Visual birincil rolü işleme desteği sağlamak olan çekirdek bir WPF nesnesidir. ve gibi kullanıcı arabirimi Button denetimleri sınıfından türeterek işleme verilerini TextBox kalıcı olarak kullanmak için Visual kullanır. nesnesi Visual aşağıdakiler için destek sağlar:

  • Çıktı görüntüsü: Bir görselin kalıcı, serileştirilmiş çizim içeriğini işleme.

  • Dönüşümler: Görselde dönüşüm gerçekleştirme.

  • Kırpma: Bir görsel için kırpma bölgesi desteği sağlama.

  • Isabet testi: Bir koordinat veya geometrinin görselin sınırları içinde olup olmadığını belirleme.

  • Sınırlayıcı kutu hesaplamaları: Görselin sınırlayıcı dikdörtgenini belirleme.

Ancak Visual nesnesi, aşağıdakiler gibi işleme dışı özellikler için destek içermez:

  • Olay işleme

  • Layout

  • Stiller

  • Veri bağlama

  • Genelleştirme

Visual , alt sınıfların türetilmelidir bir genel soyut sınıf olarak ortaya çıkar. Aşağıdaki çizimde WPF'de ortaya çıkaran görsel nesnelerin hiyerarşisi gösterilmiştir.

Diagram of classes derived from the Visual object

DrawingVisual Sınıfı

, DrawingVisual şekilleri, resimleri veya metinleri işlemek için kullanılan basit bir çizim sınıfıdır. Bu sınıf basit olarak kabul edilir çünkü çalışma zamanı performansını geliştiren düzen veya olay işlemesi sağlamaz. Bu nedenle, çizimler arka planlar ve küçük resim için idealdir. DrawingVisual, özel bir görsel nesnesi oluşturmak için kullanılabilir. Daha fazla bilgi için bkz. DrawingVisual Nesnelerini Kullanma.

Viewport3DVisual Sınıfı

, Viewport3DVisual 2D ile nesneler arasında bir Visual köprü Visual3D sağlar. sınıfı, Visual3D tüm 3D görsel öğeler için temel sınıftır. Viewport3DVisual, bir değer ve değer Camera tanımlamanız Viewport gerekir. Kamera, sahneyi görüntülemeye olanak sağlar. Görünüm açısı, projeksiyonu 2D yüzeyine eşlenin. WPF'de 3B hakkında daha fazla bilgi için bkz. 3B Grafiklere Genel Bakış.

ContainerVisual Sınıfı

sınıfı, ContainerVisual bir nesne koleksiyonu için kapsayıcı olarak Visual kullanılır. sınıfı DrawingVisual sınıfından ContainerVisual türeterek görsel nesneler koleksiyonu içermeye olanak sağlar.

Görsel Nesnelerde İçerik Çizme

Bir Visual nesne, işleme verilerini vektör grafik yönerge Visual Yönerge listesinde yer alan her öğe, alt düzey bir grafik verileri ve ilişkili kaynak kümelerini serileştirilmiş biçimde temsil eder. Çizim içeriği içeren dört farklı işleme verisi türü vardır.

İçerik türü çizme Açıklama
Vektör grafikleri Vektör grafik verilerini ve ilişkili ve bilgileri Brush temsil Pen eder.
Görüntü tarafından tanımlanan bir bölge içindeki görüntüyü temsil Rect eder.
Glif Belirtilen yazı tipi kaynağından bir karakter dizisi olan bir GlyphRun nesnesini işleyici bir çizimi temsil eder. Metin bu şekilde temsil edilen bir metindir.
Video Video işleyici bir çizimi temsil eder.

, DrawingContext görsel içerikle doldurmak Visual için bir sağlar. Bir nesnenin draw komutlarını kullanırken, daha sonra grafik sistemi tarafından kullanılacak bir dizi işleme verisi depolarsınız; ekrana gerçek zamanlı olarak DrawingContext çizmezsiniz.

gibi bir WPF denetimi oluşturma, denetim kendisini çizmek için örtülü Button olarak işleme verileri üretir. Örneğin, özelliğinin Content ayarı Button denetimin bir glyph işleme gösterimini depolamaya neden olur.

, Visual içeriğini bir içinde yer alan bir veya daha fazla nesne olarak DrawingDrawingGroup tanımlar. Ayrıca DrawingGroup opaklık maskelerini, dönüşümleri, bit eşlem etkilerini ve içeriğine uygulanan diğer işlemleri açıklar. DrawingGroup işlemler, içerik işlenirken şu sırayla uygulanır: OpacityMask , , , , , ve ardından OpacityBitmapEffectClipGeometryGuidelineSetTransform .

Aşağıdaki çizimde işleme sırası sırasında DrawingGroup işlemlerin uygulanma sırası gösterilmiştir.

DrawingGroup order of operations
DrawingGroup işlemlerinin sırası

Daha fazla bilgi için bkz. Çizim Nesnelerine Genel Bakış.

Görsel Katmanda İçerik Çizme

Bir örneğini doğrudan hiçbir zaman doğrudan örneğiz; ancak, ve gibi belirli yöntemlerden bir çizim DrawingContext bağlamı DrawingGroup.OpenDrawingVisual.RenderOpen edinebilirsiniz. Aşağıdaki örnek, bir DrawingContext 'den alır DrawingVisual ve dikdörtgen çizmek için bunu kullanır.

// Create a DrawingVisual that contains a rectangle.
private DrawingVisual CreateDrawingVisualRectangle()
{
    DrawingVisual drawingVisual = new DrawingVisual();

    // Retrieve the DrawingContext in order to create new drawing content.
    DrawingContext drawingContext = drawingVisual.RenderOpen();

    // Create a rectangle and draw it in the DrawingContext.
    Rect rect = new Rect(new System.Windows.Point(160, 100), new System.Windows.Size(320, 80));
    drawingContext.DrawRectangle(System.Windows.Media.Brushes.LightBlue, (System.Windows.Media.Pen)null, rect);

    // Persist the drawing content.
    drawingContext.Close();

    return drawingVisual;
}
' Create a DrawingVisual that contains a rectangle.
Private Function CreateDrawingVisualRectangle() As DrawingVisual
    Dim drawingVisual As New DrawingVisual()

    ' Retrieve the DrawingContext in order to create new drawing content.
    Dim drawingContext As DrawingContext = drawingVisual.RenderOpen()

    ' Create a rectangle and draw it in the DrawingContext.
    Dim rect As New Rect(New Point(160, 100), New Size(320, 80))
    drawingContext.DrawRectangle(Brushes.LightBlue, CType(Nothing, Pen), rect)

    ' Persist the drawing content.
    drawingContext.Close()

    Return drawingVisual
End Function

Görsel Katmanda Çizim İçeriğini Numaralar

Diğer kullanımlarına ek olarak, Drawing nesneler bir içeriğinin numaralandırı için bir nesne modeli de Visual sağlar.

Not

Görselin içeriğini numaraya alırken, işleme verilerinin temel gösterimini vektör grafik yönerge listesi olarak değil, nesneleri Drawing alıyor oluruz.

Aşağıdaki örnek, GetDrawing değerini almak ve DrawingGroup bunu Visual numaralara almak için yöntemini kullanır.

public void RetrieveDrawing(Visual v)
{
    DrawingGroup drawingGroup = VisualTreeHelper.GetDrawing(v);
    EnumDrawingGroup(drawingGroup);
}

// Enumerate the drawings in the DrawingGroup.
public void EnumDrawingGroup(DrawingGroup drawingGroup)
{
    DrawingCollection dc = drawingGroup.Children;

    // Enumerate the drawings in the DrawingCollection.
    foreach (Drawing drawing in dc)
    {
        // If the drawing is a DrawingGroup, call the function recursively.
        if (drawing is DrawingGroup group)
        {
            EnumDrawingGroup(group);
        }
        else if (drawing is GeometryDrawing)
        {
            // Perform action based on drawing type.
        }
        else if (drawing is ImageDrawing)
        {
            // Perform action based on drawing type.
        }
        else if (drawing is GlyphRunDrawing)
        {
            // Perform action based on drawing type.
        }
        else if (drawing is VideoDrawing)
        {
            // Perform action based on drawing type.
        }
    }
}

Görsel Nesneler Denetimleri Derlemek için Nasıl Kullanılır?

WPF'de nesnelerin çoğu diğer görsel nesnelerden oluşur, yani alt nesnelerin farklı hiyerarşilerini içerebilirler. WPF'de denetimler gibi kullanıcı arabirimi öğelerinin çoğu, farklı işleme öğeleri türlerini temsil eden birden çok görsel nesneden oluşur. Örneğin, denetim Button , ve dahil olmak üzere bir dizi başka nesne ClassicBorderDecoratorContentPresenterTextBlock içerebilir.

Aşağıdaki kod, işaretlemede Button tanımlanan bir denetimi gösterir.

<Button Click="OnClick">OK</Button>

Varsayılan denetimi oluşturan görsel nesneleri numaralandırıyor olsaydınız, aşağıda gösterilen görsel nesnelerin Button hiyerarşisini bulursanız:

Diagram of visual tree hierarchy

Denetim, ButtonClassicBorderDecorator sırasıyla bir öğesi içeren bir öğesi ContentPresenter içerir. ClassicBorderDecoratoröğesi için kenarlık ve arka plan çizmekle Button sorumludur. ContentPresenteröğesi, içeriğini görüntülemekle Button sorumludur. Bu durumda, metin görüntüleniyor, öğesi ContentPresenter bir öğesi TextBlock içerir. Denetimin bir kullanması, içeriğin veya gibi bir geometrisi gibi diğer öğelerle Button temsil edilen bir anlamına ContentPresenterImageEllipseGeometry gelir.

Denetim Şablonları

Bir denetimin denetim hiyerarşisine genişletilmesi için önemli olan ControlTemplate anahtarıdır. Denetim şablonu, bir denetim için varsayılan görsel hiyerarşisini belirtir. Bir denetime açıkça başvurarak görsel hiyerarşisini örtülü olarak başvurabilirsiniz. Denetim için özelleştirilmiş bir görsel görünüm oluşturmak üzere denetim şablonunun varsayılan değerlerini geçersiz kılabilirsiniz. Örneğin, denetimin arka plan renk değerini, düz renk değeri yerine doğrusal Button gradyan renk değeri kullanması için değiştirebilirsiniz. Daha fazla bilgi için bkz. Düğme Stilleri ve Şablonları.

Denetim gibi bir kullanıcı arabirimi öğesi, bir denetimin tüm işleme tanımını açıklayan çeşitli vektör Button grafik yönerge listeleri içerir. Aşağıdaki kod, işaretlemede Button tanımlanan bir denetimi gösterir.

<Button Click="OnClick">
  <Image Source="images\greenlight.jpg"></Image>
</Button>

Denetimi oluşturan görsel nesneleri ve vektör grafik yönerge listelerini numaralandırıyor olsaydık, aşağıda gösterilen Button nesnelerin hiyerarşisini bulabilirsiniz:

Diagram of visual tree and rendering data

Denetim, ButtonClassicBorderDecorator sırasıyla bir öğesi içeren bir öğesi ContentPresenter içerir. ClassicBorderDecoratoröğesi, bir düğmenin kenarlığı ve arka planını tüm ayrık grafik öğelerini çizmekle sorumludur. ContentPresenteröğesi, içeriğini görüntülemekle Button sorumludur. Bu durumda, bir görüntü görüntüleyesiniz, ContentPresenter öğesi bir öğesi Image içerir.

Görsel nesnelerin hiyerarşisi ve vektör grafiği yönerge listeleri hakkında dikkat gereken birkaç nokta vardır:

  • Hiyerarşide sıralama, çizim bilgilerini işleme sıralarını temsil eder. Kök görsel öğesinden, alt öğeler, soldan sağa ve yukarıdan aşağıya doğru yapılır. Bir öğenin görsel alt öğeleri varsa, bunlar öğenin eşdüzey öğelerinden önce çapraz yapılır.

  • Hiyerarşisindeki yaprak olmayan düğüm öğeleri ContentPresenter (gibi) alt öğeleri içermek için kullanılır; yönerge listeleri içermez.

  • Görsel bir öğe hem vektör grafik yönerge listesi hem de görsel alt öğeler içeriyorsa, üst görsel öğe içindeki yönerge listesi, görsel alt nesnelerinde çizimlerden önce işlenir.

  • Vektör grafik Yönerge listesindeki öğeler soldan sağa işlenir.

Görsel ağaç

Görsel ağaç, bir uygulamanın kullanıcı arabiriminde kullanılan tüm görsel öğeleri içerir. Görsel bir öğe kalıcı çizim bilgilerini içerdiğinden, ekran cihazına çıktıyı oluşturmak için gereken tüm işleme bilgilerini içeren görsel ağacı bir sahne grafiği olarak düşünebilirsiniz. Bu ağaç, kodda veya biçimlendirme içinde olsun, uygulama tarafından doğrudan oluşturulan tüm görsel öğelerin birikmesi olur. Görsel ağaç Ayrıca denetimler ve veri nesneleri gibi öğelerin şablon genişlemesiyle oluşturulan tüm görsel öğeleri içerir.

Aşağıdaki kod, StackPanel Biçimlendirme bölümünde tanımlanan bir öğeyi gösterir.

<StackPanel>
  <Label>User name:</Label>
  <TextBox />
  <Button Click="OnClick">OK</Button>
</StackPanel>

Biçimlendirme örneğinde öğeyi oluşturan görsel nesneleri numaralandırdıysanız StackPanel , aşağıda gösterilen görsel nesne hiyerarşisini bulacaksınız:

Diagram of visual tree hierarchy

İşleme sırası

Görsel ağaç, WPF görsel ve çizim nesnelerinin işleme sırasını belirler. Çapraz geçiş sırası, görsel ağaçtaki en üstteki düğüm olan kök görsele başlar. Kök görselin alt öğeleri, soldan sağa doğru yapılır. Görselde alt öğe varsa, alt öğeleri görselin eşdüzey öğelerinin önüne eklenir. Bu, bir alt görselin içeriğinin, görselin kendi içeriğinin önünde işlendiği anlamına gelir.

Diagram of the visual tree rendering order

Kök görsel

Kök görsel , görsel ağaç hiyerarşisindeki en üstteki öğedir. Çoğu uygulamada, kök görselin temel sınıfı ya da olur WindowNavigationWindow . Ancak, bir Win32 uygulamasında görsel nesneler barındırıyorsanız, kök görsel, Win32 penceresinde barındırmakta olduğunuz en üstteki görseldir. Daha fazla bilgi için bkz. öğretici: Win32 uygulamasında görsel nesneler barındırma.

Mantıksal ağaç ile ilişki

WPF 'deki mantıksal ağaç, çalışma zamanında bir uygulamanın öğelerini temsil eder. Bu ağacı doğrudan işlemeseniz de, uygulamanın bu görünümü Özellik devralmayı ve olay yönlendirmeyi anlamak için kullanışlıdır. Görsel ağacın aksine, mantıksal ağaç gibi görsel olmayan veri nesnelerini temsil edebilir ListItem . Birçok durumda, mantıksal ağaç uygulamanın biçimlendirme tanımlarına çok yakın şekilde eşlenir. Aşağıdaki kod, DockPanel Biçimlendirme bölümünde tanımlanan bir öğeyi gösterir.

<DockPanel>
  <ListBox>
    <ListBoxItem>Dog</ListBoxItem>
    <ListBoxItem>Cat</ListBoxItem>
    <ListBoxItem>Fish</ListBoxItem>
  </ListBox>
  <Button Click="OnClick">OK</Button>
</DockPanel>

Biçimlendirme örneğinde öğeyi oluşturan mantıksal nesneleri numaralandırdıysanız DockPanel , aşağıda gösterildiği gibi mantıksal nesnelerin hiyerarşisini bulabilirsiniz:

Tree diagram
Mantıksal ağaç diyagramı

Hem görsel ağaç hem de mantıksal ağaç, geçerli uygulama öğesi kümesiyle eşitlenir ve öğelerin eklenmesini, silinmesini veya değiştirilmesini yansıtır. Ancak, ağaçlar uygulamanın farklı görünümlerini sunar. Görsel ağacın aksine, mantıksal ağaç bir denetimin öğesini genişletmez ContentPresenter . Bu, bir mantıksal ağaç ile aynı nesne kümesi için bir görsel ağaç arasında doğrudan bire bir yazışmalar olmadığı anlamına gelir. Aslında, LogicalTreeHelper nesnesinin yöntemini ve bir parametre ile aynı öğeyi kullanan VisualTreeHelper nesnesinin yöntemini çağırmak farklı sonuçlar verir.

Mantıksal ağaç hakkında daha fazla bilgi için bkz. WPF Içindeki ağaçlar.

XamlPad ile görsel ağacı görüntüleme

XamlPad, bu, tanımlı XAML içeriğine karşılık gelen görsel ağacı görüntüleme ve keşfetme için bir seçenek sunar. Görsel ağacı görüntülemek için menü çubuğunda görsel ağacı göster düğmesine tıklayın. Aşağıda, XAML içeriğinin, XamlPad 'in görsel ağaç Gezgini panelindeki görsel ağaç düğümlerine genişletilmesi gösterilmektedir:

Visual Tree Explorer panel in XamlPad

Label, TextBox Ve Button denetimlerinin her birinin, XamlPad 'In Label panelinde ayrı bir görsel nesne hiyerarşisi görüntülemesine dikkat edin. Bunun nedeni WPF denetimlerinin bu ControlTemplate denetimin görsel ağacını içeren bir ' dır. Açıkça bir denetime başvurmanız durumunda, kendi görsel hiyerarşisine örtülü olarak başvurmanız gerekir.

Görsel performansı profil oluşturma

WPF, uygulamanızın çalışma zamanı davranışını çözümlemenize ve uygulayabileceğiniz performans iyileştirmeleri türlerini belirlemenize olanak tanıyan bir dizi performans profil araçları sağlar. Görsel profil Oluşturucu Aracı, doğrudan uygulamanın görsel ağacına eşleyerek performans verilerinin zengin, grafik bir görünümünü sağlar. Bu ekran görüntüsünde, Visual Profiler 'ın CPU kullanımı bölümü, nesnenin işleme ve düzen gibi WPF hizmetleri kullanımının kesin bir dökümünü sağlar.

Visual Profiler display output
Görsel profil oluşturucu görüntüleme çıktısı

Görsel Işleme davranışı

WPF, görsel nesnelerin işleme davranışını etkileyen çeşitli özellikler sunar: tutulan mod grafikleri, vektör grafikleri ve cihazdan bağımsız grafikler.

Tutulan mod grafikleri

Görsel nesnenin rolünü anlamak için anahtarlardan biri, anlık mod ve tutulan mod grafik sistemleri arasındaki farkı anlamaktır. gdı veya GDI+ temel alan standart bir Win32 uygulaması, anlık mod grafik sistemini kullanır. Bu, uygulamanın yeniden boyutlandırılması gibi bir eylem ya da görsel görünümünü değiştiren bir nesne nedeniyle, istemci alanının geçersiz kılınmasından dolayı uygulamanın sorumlu olduğu anlamına gelir.

Diagram of Win32 rendering sequence

Buna karşılık WPF, korunan bir mod sistemi kullanır. Bu, görsel görünümü olan uygulama nesnelerinin seri hale getirilmiş bir çizim verisi kümesini tanımlayan anlamına gelir. Çizim verileri tanımlandıktan sonra, sistem, uygulama nesnelerini işlemeye yönelik tüm yeniden çizme isteklerine yanıt vermemeye başladıktan sonra sorumludur. Çalışma zamanında bile, uygulama nesnelerini değiştirebilir veya oluşturabilir ve yine de boyama isteklerine yanıt vermek için sisteme güvenebilirsiniz. Korunan modda bir grafik sisteminde bulunan güç, çizim bilgilerinin her zaman uygulama tarafından serileştirilmiş bir durumda kalıcı olması, ancak sorumluluğu sisteme işlemesi. Aşağıdaki diyagramda, uygulamanın Paint isteklerine yanıt vermek için WPF 'in nasıl kullanıldığı gösterilmektedir.

Diagram of WPF rendering sequence

Akıllı yeniden çizim

Korunan mod grafiklerini kullanmanın en büyük avantajlarından biri, WPF 'in uygulamada yeniden çizilmesi gerekenleri verimli bir şekilde iyileştirebilmelerinden biridir. Değişen opaklık düzeylerine sahip karmaşık bir sahneye sahip olsanız bile, yeniden çizmeyi iyileştirmek için genellikle özel amaçlı kod yazmanız gerekmez. Bunu, güncelleştirme bölgesindeki yeniden çizim miktarını en aza indirerek uygulamanızı iyileştirmek için harika bir çaba harcayabileceğiniz Win32 programlama ile karşılaştırın. Win32 uygulamalarında yeniden çizmeyi en iyi duruma getirme bölümünde yer alan karmaşıklık türünün bir örneği için bkz. Update bölgesinde yeniden çizme .

Vektör grafikleri

WPF, vektör grafiklerini işleme verileri biçimi olarak kullanır. ölçeklenebilir vektör grafikleri (SVG), Windows meta dosyaları (. wmf) ve TrueType yazı tiplerini içeren vektör grafikleri — veri işleme verilerini depolar ve grafik temel sürümlerini kullanarak bir görüntüyü yeniden oluşturmayı açıklayan yönergelerin bir listesini olarak iletir. Örneğin, TrueType yazı tipleri bir dizi pikseli, eğrileri ve komutları tanımlayan ana hat yazı tipleridir. Vektör grafiklerinin önemli avantajlarından biri, herhangi bir boyuta ve çözünürlüğe ölçeklendirebilme olanağıdır.

Vektör grafiklerinden farklı olarak, bit eşlem grafik veri işleme verilerini görüntünün piksel piksel gösterimi olarak, belirli bir çözüm için önceden işlenmiş olarak saklar. Bit eşlem ve vektör grafik biçimleri arasındaki önemli farklılıklardan biri, orijinal kaynak görüntüsüne uygunluk olur. Örneğin, bir kaynak görüntünün boyutu değiştirildiğinde, bitmap grafik sistemleri görüntüyü uzarken vektör grafik sistemleri görüntüyü ölçeklenirken görüntünün aslına uygunluk düzeyini korur.

Aşağıdaki çizimde %300 tarafından yeniden boyutlandırılmış bir kaynak görüntü gösterilmektedir. Kaynak görüntü, vektör grafik görüntüsü olarak ölçeklendirilmesi yerine bir bit eşlem grafik görüntüsü olarak uzatılır görünen deformasyonları fark edin.

Differences between raster and vector graphics

Aşağıdaki biçimlendirmede Path tanımlı iki öğe gösterilmektedir. İkinci öğe, ScaleTransform ilk öğenin çizim yönergelerini %300 oranında yeniden boyutlandırmak için bir kullanır. Öğelerin içindeki çizim yönergelerinin Path değişmeden kaldığına dikkat edin.

<Path
  Data="M10,100 C 60,0 100,200 150,100 z"
  Fill="{StaticResource linearGradientBackground}"
  Stroke="Black"
  StrokeThickness="2" />

<Path
  Data="M10,100 C 60,0 100,200 150,100 z"
  Fill="{StaticResource linearGradientBackground}"
  Stroke="Black"
  StrokeThickness="2" >
  <Path.RenderTransform>
    <ScaleTransform ScaleX="3.0" ScaleY="3.0" />
  </Path.RenderTransform>
</Path>

Çözümleme ve Device-Independent grafikleri hakkında

Ekranınızdaki metin ve grafiklerin boyutunu tespit eden iki sistem faktörü vardır: çözünürlük ve DPı. Çözüm, ekranda görünen piksel sayısını açıklar. Çözünürlük daha yüksek olduğundan, piksellerin daha küçük olduğundan, grafiklerin ve metinlerin daha küçük görünmesine neden olur. 1024 x 768 olarak ayarlanan monitörde görüntülenen bir grafik, çözüm 1600 x 1200 olarak değiştirildiğinde çok daha küçük görünür.

Diğer sistem ayarı olan DPı, piksel cinsinden bir ekran boyutunu tanımlar. çoğu Windows sistem dpı 96 ' dir ve bu da ekran inç 96 piksel olur. DPı ayarı arttırıldığında ekran daha büyük olur; DPı 'yi düşürmek ekranı daha küçük hale getirir. Bu, bir ekran inç ' in gerçek dünya ile aynı boyutta olmadığı anlamına gelir; Çoğu sistemde büyük olasılıkla değildir. DPı 'yi artırdıkça DPı kullanan grafikler ve metin daha büyük hale gelir çünkü inç ekran boyutunu artırmış olursunuz. DPı 'nin artırılması metnin daha kolay okunmasını, özellikle de yüksek çözünürlükte kullanılabilmesini sağlayabilir.

Tüm uygulamalar DPı duyarlı değildir: bazıları, birincil ölçü birimi olarak donanım pikselleri kullanır; Sistem DPI 'sını değiştirmenin bu uygulamalar üzerinde hiçbir etkisi yoktur. Diğer birçok uygulama, yazı tipi boyutlarını betimleyen DPı kullanan birimleri kullanır, ancak diğer her şeyi de anlatmak için pikselleri kullanır. DPı 'nın çok küçük veya çok büyük olması, uygulamaların metni sistemin DPı ayarıyla ölçeklendirilebildiğinden, ancak uygulamaların kullanıcı arabirimi olmadığı için bu uygulamalarda düzen sorunlarına neden olabilir. Bu sorun WPF kullanılarak geliştirilen uygulamalar için ortadan kaldırılmıştır.

WPF, donanım pikselleri yerine, ana ölçü birimi olarak cihazdan bağımsız pikseli kullanarak otomatik ölçeklendirmeyi destekler; uygulama geliştiricisinden ek bir iş olmadan grafik ve metin ölçeği düzgün şekilde ölçeklendirin. Aşağıdaki çizimde, WPF metin ve grafiklerin farklı DPı ayarlarında nasıl göründüğü hakkında bir örnek gösterilmektedir.

Graphics and text at different DPI settings
Farklı DPı ayarlarındaki grafikler ve metinler

VisualTreeHelper sınıfı

VisualTreeHelperSınıfı, görsel nesne düzeyinde programlama için alt düzey işlevsellik sağlayan ve yüksek performanslı özel denetimler geliştirme gibi çok özel senaryolarda yararlı olan bir statik yardımcı sınıftır. Çoğu durumda, ve gibi daha üst düzey WPF çerçeve nesneleri, daha CanvasTextBlock fazla esneklik ve kullanım kolaylığı sunar.

Isabet Testi

sınıfı, VisualTreeHelper varsayılan isabet testi desteği ihtiyaçlarınızı karşılamazsa görsel nesnelerde isabet testi için yöntemler sağlar. Bir geometri veya nokta koordinat değerinin, denetim veya grafik öğesi gibi belirli bir nesnenin sınırı içinde olup olmadığını belirlemek için sınıfındaki HitTestVisualTreeHelper yöntemleri kullanabilirsiniz. Örneğin, bir nesnenin sınırlayıcı dikdörtgeni içindeki fare tıklamanın bir dairenin geometrisi içinde olup olmadığını belirlemek için isabet testi kullanabilirsiniz. Ayrıca kendi özel isabet testi hesaplamalarınızı gerçekleştirmek için isabet testinin varsayılan uygulamasını geçersiz kılmayı da seçebilirsiniz.

Isabet testi hakkında daha fazla bilgi için bkz. Görsel Katmanda Isabet Testi.

Görsel Ağacı Numaralar

sınıfı, VisualTreeHelper bir görsel ağacının üyelerini numaralara eklemek için işlevsellik sağlar. Üst öğe almak için yöntemini GetParent çağırma. Bir görsel nesnesinin alt veya doğrudan alt nesnesini almak için yöntemini GetChild çağırabilirsiniz. Bu yöntem, belirtilen Visual dizinde üst öğenin bir alt öğesi döndürür.

Aşağıdaki örnekte, bir görsel nesne hiyerarşisinin tüm işleme bilgilerini seri hale getirmeyle ilgileniyorsanız kullanmak istemeniz gereken bir teknik olan görsel nesnesinin tüm alt yapılarını nasıl listeleyebilirsiniz?

// Enumerate all the descendants of the visual object.
static public void EnumVisual(Visual myVisual)
{
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(myVisual); i++)
    {
        // Retrieve child visual at specified index value.
        Visual childVisual = (Visual)VisualTreeHelper.GetChild(myVisual, i);

        // Do processing of the child visual object.

        // Enumerate children of the child visual object.
        EnumVisual(childVisual);
    }
}
' Enumerate all the descendants of the visual object.
Public Shared Sub EnumVisual(ByVal myVisual As Visual)
    For i As Integer = 0 To VisualTreeHelper.GetChildrenCount(myVisual) - 1
        ' Retrieve child visual at specified index value.
        Dim childVisual As Visual = CType(VisualTreeHelper.GetChild(myVisual, i), Visual)

        ' Do processing of the child visual object.

        ' Enumerate children of the child visual object.
        EnumVisual(childVisual)
    Next i
End Sub

Çoğu durumda mantıksal ağaç, WPF uygulamasındaki öğelerin daha kullanışlı bir gösterimidir. Mantıksal ağacı doğrudan değiştirmese de, uygulamanın bu görünümü özellik devralma ve olay yönlendirmeyi anlamak için yararlıdır. Görsel ağacından farklı olarak, mantıksal ağaç gibi görsel olmayan veri nesnelerini temsil ListItem eder. Mantıksal ağaç hakkında daha fazla bilgi için bkz. WPF'de Ağaçlar.

sınıfı, VisualTreeHelper görsel nesnelerin sınırlayıcı dikdörtgenini döndüren yöntemler sağlar. çağırarak görsel nesnesinin sınırlayıcı dikdörtgenini GetContentBounds getirebilirsiniz. çağırarak görsel nesnesinin kendisi de dahil olmak üzere bir görsel nesnesinin tüm alt öğelerinin sınırlayıcı dikdörtgenini GetDescendantBounds getirebilirsiniz. Aşağıdaki kod, görsel nesnesinin ve tüm alt öğelerinin sınırlayıcı dikdörtgenini nasıl hesaplayabilirsiniz?

// Return the bounding rectangle of the parent visual object and all of its descendants.
Rect rectBounds = VisualTreeHelper.GetDescendantBounds(parentVisual);
' Return the bounding rectangle of the parent visual object and all of its descendants.
Dim rectBounds As Rect = VisualTreeHelper.GetDescendantBounds(parentVisual)

Ayrıca bkz.