Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ez a témakör áttekintést nyújt a WPF-vizualizációs rétegről. A WPF-modellben a Visual renderelési támogatás osztályának szerepére összpontosít.
A vizualizáció objektum szerepköre
Az Visual osztály az az alapvető absztrakció, amelyből minden FrameworkElement objektum származik. Emellett belépési pontként szolgál az új vezérlők WPF-ben való írásához, és sok szempontból a Win32-alkalmazásmodell ablakfogópontjaként (HWND) is felfogható.
A Visual objektum egy alapvető WPF-objektum, amelynek elsődleges feladata a renderelés támogatása. A felhasználói felület vezérlői( például Button és TextBox) a Visual osztályból származnak, és a renderelési adatok megőrzésére használják. Az Visual objektum a következőhöz nyújt támogatást:
Kimeneti megjelenítés: A vizualizáció megmaradó, szerializált rajztartalmának renderelése.
Átalakítások: Átalakítások végrehajtása vizualizáción.
Kivágás: Vizuális elemek kivágási régiójának támogatása.
Találattesztelés: Annak meghatározása, hogy egy koordináta vagy geometria egy vizualizáció határán belül található-e.
Határolókeret-számítások: Egy vizualizáció határoló téglalapjának meghatározása.
Az Visual objektum azonban nem támogatja a nem renderelt funkciókat, például:
Eseménykezelés
Elrendezés
Stílusok
Adatkötés
Globalizáció
Visual nyilvános absztrakt osztályként jelenik meg, amelyből a gyermekosztályokat le kell származtatni. Az alábbi ábra a WPF-ben közzétett vizuális objektumok hierarchiáját mutatja be.
DrawingVisual osztály
A DrawingVisual egy egyszerű rajzosztály, amely alakzatok, képek vagy szövegek megjelenítésére szolgál. Ez az osztály könnyűsúlyúnak tekinthető, mivel nem biztosít elrendezést vagy eseménykezelést, ami javítja a futási teljesítményét. Ezért a rajzok ideálisak hátterekhez és ClipArt-elemekhez. Ez DrawingVisual használható egyéni vizualizációs objektum létrehozásához. További információért lásd a DrawingVisual objektumok használatát: .
Viewport3DVisual osztály
Ez Viewport3DVisual hidat biztosít a 2D Visual és Visual3D az objektumok között. Az Visual3D osztály az összes 3D vizualizációelem alaposztálya. A(z) Viewport3DVisual megköveteli, hogy meghatározzon egy Camera értéket és egy Viewport értéket. A kamera lehetővé teszi a jelenet megtekintését. A kitekintő meghatározza, hogy a vetítés hol található a 2D felületre. További információ a WPF 3D-ről: 3D grafikus áttekintés.
ContainerVisual osztály
Az ContainerVisual osztály egy objektumgyűjtemény Visual tárolójaként használatos. Az DrawingVisual osztály az ContainerVisual osztályból származik, így vizuális objektumok gyűjteményét is tartalmazhatja.
Rajztartalom vizuális objektumokban
Az Visual objektumok vektorgrafikus utasításlistaként tárolják a renderelési adatokat. Az utasításlista minden eleme alacsony szintű grafikus adatokat és a kapcsolódó erőforrásokat jelöl szerializált formátumban. A renderelési adatoknak négy különböző típusa lehet, amelyek rajztartalmakat tartalmazhatnak.
Rajztartalom típusa | Leírás |
---|---|
Vektorgrafika | A vektorgrafikus adatokat, valamint az esetleges kapcsolódó Brush és Pen információkat jelöli. |
Kép | Az adott régióban lévő kép, amelyet egy Rect határoz meg. |
Glif | Olyan rajzot jelöl, amely egy GlyphRunadott betűtípus-erőforrásból származó karaktersorozatot jelenít meg. Így jelenik meg a szöveg. |
Videó | Videoképet megjelenítő rajzot jelöl. |
A DrawingContext lehetővé teszi, hogy vizuális tartalommal töltsön fel egy Visual -t. Amikor egy DrawingContext objektum rajzparancsait használja, valójában renderelési adatok készletét tárolja, amelyeket később a grafikus rendszer fog használni; nem valós időben rajzol a képernyőre.
WPF-vezérlő (például egy Button) létrehozásakor a vezérlő implicit módon renderelési adatokat hoz létre magának a rajznak. Például a Content tulajdonság beállítása Button vezérlő esetén a vezérlő egy karakterjel renderelő megjelenítését tárolja.
Az A Visual a tartalmát egy vagy több Drawing objektumként írja le, amely egy adott objektumon DrawingGroupbelül található. A DrawingGroup az átlátszatlansági maszkokat, az átalakításokat, a bitképeffektusokat és az ezekre alkalmazott egyéb műveleteket is leírja. DrawingGroup a rendszer a következő sorrendben alkalmazza a műveletet a tartalom megjelenítésekor: OpacityMask, Opacity, BitmapEffect, ClipGeometry, GuidelineSet, majd Transform.
Az alábbi ábrán a műveletek megjelenítési sorrendje DrawingGroup látható.
A DrawingGroup-műveletek sorrendje
További információ: Rajzobjektumok áttekintése.
Tartalom rajzolása a vizualizáció rétegében
Soha ne példányosíts közvetlenül DrawingContext; azonban bizonyos metódusokból, például DrawingGroup.Open és DrawingVisual.RenderOpenis beszerezhet egy rajzkörnyezetet. Az alábbi példa lekér egy DrawingContext a DrawingVisual-ból, és egy téglalap rajzolásához használja.
// 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
Rajztartalom számbavétele a vizualizáció rétegében
Az egyéb felhasználási módokon kívül Drawing objektumok objektummodellt is biztosítanak a Visualtartalmának számbavételéhez.
Megjegyzés:
Amikor a vizualizáció tartalmát sorolja fel, Drawing objektumokat nyer vissza, és nem a renderelési adatok mögöttes ábrázolását vektorgrafikus utasításlistaként.
Az alábbi példa a GetDrawing metódust használja egy DrawingGroupVisual értékének lekéréséhez és számbavételéhez.
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.
}
}
}
A vizualizációobjektumok használata vezérlők létrehozásához
A WPF számos objektuma más vizuális objektumokból áll, ami azt jelenti, hogy a leszármazott objektumok különböző hierarchiáit tartalmazhatják. A WPF felhasználói felületének számos eleme, például a vezérlők, több vizuális objektumból állnak, amelyek különböző megjelenítési elemeket képviselnek. A Button vezérlő például számos más objektumot is tartalmazhat, beleértve a ClassicBorderDecorator, ContentPresenter és a TextBlock-t.
Az alábbi kód egy korrektúrában definiált Button vezérlőelemet mutat be.
<Button Click="OnClick">OK</Button>
Ha az alapértelmezett Button vezérlőt alkotó vizualizációs objektumok számbavételét szeretné használni, az alábbi ábrán látható vizualizációs objektumok hierarchiája látható:
A Button vezérlő tartalmaz egy ClassicBorderDecorator elemet, amely viszont tartalmaz egy ContentPresenter elemet. Az ClassicBorderDecorator elem felel a szegély és a háttér rajzolásáért.Button Az ContentPresenter elem felelős a Button tartalmának megjelenítéséért. Ebben az esetben, mivel szöveget jelenít meg, az ContentPresenter elem tartalmaz egy TextBlock elemet. Az a tény, hogy a Button vezérlő a ContentPresenter-et használja, azt jelenti, hogy a tartalom más elemekkel is képviselhető, például egy Image-vel vagy egy geometriával, mint egy EllipseGeometry.
Vezérlősablonok
A vezérlők vezérlőhierarchiává való kiterjesztésének kulcsa a ControlTemplate. A vezérlősablonok a vezérlőelemek alapértelmezett vizualizációs hierarchiáit határozzák meg. Amikor explicit módon hivatkozik egy vezérlőre, implicit módon hivatkozik annak vizualizációs hierarchiájára. Felülbírálhatja a vezérlősablon alapértelmezett értékeit, így testre szabott vizuális megjelenést hozhat létre egy vezérlőhöz. Módosíthatja például a vezérlőelem háttérszínértékét Button , hogy lineáris színátmeneti színértéket használjon a folytonos színérték helyett. További információ: Gombstílusok és sablonok.
A felhasználói felület elemei, például a Button vezérlők, számos vektorgrafikus utasításlistát tartalmaznak, amelyek egy vezérlő teljes renderelési definícióját írják le. Az alábbi kód egy korrektúrában definiált Button vezérlőelemet mutat be.
<Button Click="OnClick">
<Image Source="images\greenlight.jpg"></Image>
</Button>
Ha a vezérlőt alkotó Button vizuális objektumokat és vektorgrafikai utasításlistákat szeretné számba adni, az alábbi ábrán látható objektumok hierarchiáját találja:
A Button vezérlő tartalmaz egy ClassicBorderDecorator elemet, amely viszont tartalmaz egy ContentPresenter elemet. Az ClassicBorderDecorator elem felelős a gomb szegélyét és hátterét alkotó minden különálló grafikus elem megrajzolásáért. Az ContentPresenter elem felelős a Button tartalmának megjelenítéséért. Ebben az esetben, mivel egy képet jelenít meg, az ContentPresenter elem tartalmaz egy Image elemet.
A vizualizációs objektumok és a vektorgrafika-utasítások hierarchiájáról számos megjegyzést érdemes megjegyezni:
A hierarchia sorrendje a rajzadatok megjelenítési sorrendjét jelöli. A gyökérvizualizációs elemből a gyermekelemek bejáródnak, balról jobbra, felülről lefelé. Ha egy elem vizuális gyermekelemekkel rendelkezik, azokat előbb átvizsgálják, mint az elem testvéreit.
A hierarchia nem levélcsomópont-elemei, például ContentPresenter, a gyermekelemek tárolására szolgálnak - nem tartalmaznak utasításlistákat.
Ha egy vizualizációelem vektorgrafikus utasításlistát és vizualizációs gyermekeket is tartalmaz, a szülővizualizációelemben lévő utasításlista a vizuális gyermekobjektumok rajzai előtt jelenik meg.
A vektorgrafika-utasítások listájában lévő elemek balról jobbra jelennek meg.
Vizuális fa
A vizualizációfa az alkalmazás felhasználói felületén használt összes vizuális elemet tartalmazza. Mivel a vizualizációelemek tartós rajzinformációkat tartalmaznak, a vizualizációs fára jelenetdiagramként tekinthet, amely tartalmazza a megjelenítési eszköz kimenetének megírásához szükséges összes renderelési információt. Ez a fa az alkalmazás által közvetlenül létrehozott összes vizuális elem felhalmozása, akár kódban, akár korrektúrában. A vizualizációfa tartalmazza az elemek, például vezérlők és adatobjektumok sablonbővítésével létrehozott összes vizuális elemet is.
Az alábbi kód egy korrektúrában definiált StackPanel elemet mutat be.
<StackPanel>
<Label>User name:</Label>
<TextBox />
<Button Click="OnClick">OK</Button>
</StackPanel>
Ha a jelölőnyelvi példa StackPanel elemét alkotó vizuális objektumokat szeretné számba venni, az alábbi ábrán a vizuális objektumok hierarchiáját találja.
Megjelenítési sorrend
A vizualizáció fa határozza meg a WPF-vizualizációk és rajzobjektumok megjelenítési sorrendjét. A bejárás sorrendje a gyökérvizualizációval kezdődik, amely a vizualizációfán a legfelső csomópont. A gyökérvizualizáció gyermekei ezután balról jobbra haladnak. Ha egy vizuális elemnek vannak gyermekei, a vizuális elem gyermekei kerülnek feldolgozásra a vizuális elem testvérei előtt. Ez azt jelenti, hogy a gyermekvizualizáció tartalma a vizualizáció saját tartalma előtt jelenik meg.
Gyökérvizualizáció
A gyökérvizualizáció a vizualizációfa-hierarchia legfelső eleme. A legtöbb alkalmazásban a gyökérvizualizáció alaposztálya vagy Window, vagy NavigationWindow. Ha azonban vizuális objektumokat üzemeltet egy Win32-alkalmazásban, a gyökérvizuál valójában a Win32-ablakban üzemeltetett legfelső vizuális objektum lenne. További információ : Oktatóanyag: Visual Objects üzemeltetése Win32-alkalmazásban.
Kapcsolat a logikai fával
A WPF logikai fa egy alkalmazás futásidejű elemeit jelöli. Bár közvetlenül nem módosítja ezt a fát, az alkalmazás ezen nézete hasznos a tulajdonságöröklés és az esemény-útválasztás megértéséhez. A vizuális fával ellentétben a logikai fa képes nem vizuális adatobjektumokat, például ListItem ábrázolni. A logikai fa sok esetben nagyon szorosan megfelel egy alkalmazás jelölődefinícióinak. Az alábbi kód egy korrektúrában definiált DockPanel elemet mutat be.
<DockPanel>
<ListBox>
<ListBoxItem>Dog</ListBoxItem>
<ListBoxItem>Cat</ListBoxItem>
<ListBoxItem>Fish</ListBoxItem>
</ListBox>
<Button Click="OnClick">OK</Button>
</DockPanel>
Ha a korrektúra-példában szereplő elemet alkotó DockPanel logikai objektumokat szeretné számba adni, az alábbiakban látható logikai objektumok hierarchiáját találja:
Logikai fa diagramja
A vizualizációs fa és a logikai fa is szinkronizálva van az aktuális alkalmazáselem-készlettel, amely az elemek hozzáadását, törlését vagy módosítását tükrözi. A fák azonban az alkalmazás különböző nézeteit jelenítik meg. A vizuális fával ellentétben a logikai fa nem bontja ki egy vezérlő ContentPresenter elemét. Ez azt jelenti, hogy egy logikai fa és egy vizuális fa között nincs közvetlen egy-az-egyhez megfeleltetés azonos objektumhalmaz esetén. Valójában a LogicalTreeHelper objektum metódusának GetChildren és a VisualTreeHelper objektum metódusának meghívása GetChild ugyanazt az elemet használja, mint egy paraméter, eltérő eredményeket eredményez.
További információ a logikai fáról az alábbi hivatkozásnál található: Fák a WPF.
Vizualizációfa megtekintése XamlPad használatával
A WPF eszköz, az XamlPad lehetővé teszi a jelenleg definiált XAML-tartalomnak megfelelő vizualizációs fa megtekintését és feltárását. Kattintson a Vizualizációfa megjelenítése gombra a menüsávon a vizualizációfa megjelenítéséhez. Az alábbiakban az XAML-tartalomnak a XamlPad Visual Tree Explorer panelén látható vizuális fa csomópontokká váló kiterjesztését szemléltetjük:
Figyelje meg, hogy a Label, TextBoxés Button vezérlők mindegyike külön vizuális objektumhierarchiát jelenít meg a XamlPad Visual Tree Explorer paneljén. Ennek az az oka, hogy a WPF-vezérlők rendelkeznek a ControlTemplate vezérlő vizualizációs fájával. Amikor explicit módon hivatkozik egy vezérlőre, implicit módon hivatkozik annak vizualizációs hierarchiájára.
Profilkészítési vizualizáció teljesítménye
A WPF teljesítményprofilozási eszközökkel rendelkezik, amelyekkel elemezheti az alkalmazás futásidejű viselkedését, és meghatározhatja az alkalmazható teljesítményoptimalizálási típusokat. A Visual Profiler eszköz a teljesítményadatok gazdag, grafikus nézetét nyújtja közvetlenül az alkalmazás vizualizációs fájához való leképezéssel. Ebben a képernyőképen a Visual Profiler CPU-használat szakasza pontos bontásban mutatja be az objektumok WPF-szolgáltatások, például a renderelés és az elrendezés használatát.
Visual Profiler megjelenítési kimenete
Vizualizációs megjelenítési viselkedés
A WPF számos olyan funkciót vezet be, amelyek befolyásolják a vizuális objektumok renderelési viselkedését: megtartott módú ábrákat, vektorgrafikákat és eszközfüggetlen ábrákat.
Megtartott módú ábrák
A Visual objektum szerepének megértéséhez az egyik kulcs az azonnali mód és a megtartott módú grafikus rendszerek közötti különbség megértése. A GDI-n vagy GDI+-n alapuló standard Win32-alkalmazások azonnali módú grafikus rendszert használnak. Ez azt jelenti, hogy az alkalmazás felelős az ügyfélterület érvénytelenített részének újrafestéséért olyan műveletek miatt, mint például az ablak átméretezése vagy egy objektum vizuális megjelenésének megváltozása.
Ezzel szemben a WPF megtartott módú rendszert használ. Ez azt jelenti, hogy a vizualizációs megjelenésű alkalmazásobjektumok szerializált rajzadatok készletét határozzák meg. A rajzadatok definiálása után a rendszer felelős az alkalmazásobjektumok rendereléséhez szükséges újrafestési kérelmek megválaszolásáért. Futtatáskor is módosíthatja vagy létrehozhat alkalmazásobjektumokat, és továbbra is a rendszerre támaszkodva válaszolhat a festőkérelmekre. A megtartott módban lévő grafikus rendszerek ereje abban rejlik, hogy a rajzadatokat mindig szerializált állapotban őrzi meg az alkalmazás, a renderelés felelősségét azonban a rendszerre bízza. Az alábbi ábra bemutatja, hogy az alkalmazás hogyan támaszkodik a WPF-re a festékkérelmekre való válaszadáshoz.
Intelligens újrarajzolás
A megtartott módú ábrák használatának egyik legnagyobb előnye, hogy a WPF hatékonyan optimalizálja az alkalmazásban újrarajzolt elemeket. Még akkor sem kell általában speciális célú kódot írnia az optimalizált újrarajzoláshoz, ha egy összetett, változó szintű átlátszatlanságú jelenettel rendelkezik. Hasonlítsa össze ezt a Win32-programozással, amelyben nagy energiát fordíthat az alkalmazás optimalizálására a frissítési régióban történő újraírás mennyiségének minimalizálásával. A Win32-alkalmazások újraírásának optimalizálásával kapcsolatos összetettség típusát a frissítési régióban találhatja meg.
Vektorgrafika
A WPF vektorgrafikát használ renderelő adatformátumként. A vektorgrafika – amely magában foglalja a méretezhető vektorgrafikát (SVG), a Windows metafájlokat (.wmf) és a TrueType betűtípusokat – a renderelési adatokat tárolja, és továbbítja azokat a grafikus primitív képekkel való újbóli létrehozását leíró utasítások listájaként. A TrueType betűtípusok például vonalakat, görbéket és parancsokat leíró vázlat betűtípusok, nem pedig képponttömbök. A vektorgrafika egyik fő előnye, hogy bármilyen méretre és felbontásra skálázható.
A vektorgrafikától eltérően a bitképek a kép képpontonkénti ábrázolásaként tárolják az adatokat, előre renderelve egy adott felbontáshoz. A bitkép és a vektorgrafika formátuma között az egyik legfontosabb különbség az eredeti forráskép megbízhatósága. Ha például módosítja a forráskép méretét, a bitképes grafikus rendszerek megnyújtják a képet, míg a vektorgrafikus rendszerek méretezik a képet, megőrizve a kép hűségét.
Az alábbi ábrán egy 300%által átméretezett forráskép látható. Figyelje meg azokat a torzításokat, amelyek akkor jelennek meg, amikor a forráskép bitképként van kiosztva, és nem vektorgrafikus képként skálázva.
Az alábbi korrektúra két Path definiált elemet mutat be. A második elem egy ScaleTransform segítségével 300%méretre átméretezi az első elem rajzi utasításait. Figyelje meg, hogy a Path elemek rajzi utasításai változatlanok maradnak.
<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>
A(z) felbontás és a Device-Independent grafika ismertetése
Két rendszertényező határozza meg a képernyő szövegének és ábráinak méretét: a felbontást és a DPI-t. A felbontás a képernyőn megjelenő képpontok számát ismerteti. Ahogy a felbontás egyre nagyobb lesz, a képpontok kisebbek lesznek, így a képek és a szövegek kisebbek lesznek. Egy 1024 x 768-ra beállított monitoron megjelenített ábra sokkal kisebbnek fog tűnni, ha a felbontást 1600 x 1200-ra módosítják.
A másik rendszerbeállítás, a DPI a képpontokban kifejezett képernyőméretet írja le. A Legtöbb Windows-rendszer 96 DPI-vel rendelkezik, ami azt jelenti, hogy a képernyő hüvelyk 96 képpont. A DPI-beállítás növelésével növeli a képernyő hüvelykben mért nagyságát; a DPI csökkentésével csökken a képernyő hüvelykben mért nagysága. Ez azt jelenti, hogy a képernyő hüvelyk nem azonos méretű, mint egy valós hüvelyk; a legtöbb rendszeren valószínűleg nem. A DPI növelése során a DPI-vel tisztában lévő grafikus elemek és szövegek nagyobbak lesznek, mivel megnövelte a képernyő hüvelykméretét. A DPI növelésével könnyebben olvashatók a szövegek, különösen nagy felbontásban.
Nem minden alkalmazás DPI-tudatos: egyes alkalmazások a hardveres képpontokat használják elsődleges mértékegységként; a RENDSZER DPI-jének módosítása nincs hatással ezekre az alkalmazásokra. Sok más alkalmazás DPI-vel kapcsolatos egységeket használ a betűméretek leírására, de képpontok használatával minden mást leír. Ha a DPI túl kicsi vagy túl nagy, elrendezési problémákat okozhat ezeknek az alkalmazásoknak, mert az alkalmazások szövegének mérete a rendszer DPI-beállításával van skálázva, de az alkalmazások felhasználói felülete nem. Ez a probléma a WPF használatával fejlesztett alkalmazások esetében megszűnt.
A WPF támogatja az automatikus skálázást úgy, hogy az eszközfüggetlen képpontot használja elsődleges mértékegységként a hardveres képpontok helyett; a grafikus és szöveges skálázás megfelelően, az alkalmazás fejlesztőjének további munkája nélkül. Az alábbi ábrán egy példa látható arra, hogyan jelennek meg a WPF-szövegek és -ábrák különböző DPI-beállításoknál.
Grafika és szöveg különböző DPI-beállításoknál
VisualTreeHelper osztály
Az VisualTreeHelper osztály egy statikus segédosztály, amely alacsony szintű funkciókat biztosít a vizuális objektum szintjén történő programozáshoz, ami nagyon specifikus helyzetekben hasznos, például nagy teljesítményű egyéni vezérlők fejlesztése. A legtöbb esetben a magasabb szintű WPF-keretrendszer objektumai, például Canvas és TextBlock, nagyobb rugalmasságot és könnyű használatot biztosítanak.
Ütközésvizsgálat
Az VisualTreeHelper osztály metódusokat biztosít a vizuális objektumokon végzett találatteszteléshez, ha az alapértelmezett találatteszt-támogatás nem felel meg az igényeinek. Az HitTest osztály metódusaival VisualTreeHelper meghatározhatja, hogy egy geometria- vagy pontkoordináta-érték egy adott objektum, például vezérlő vagy grafikus elem határán belül van-e. Például a találattesztelés használatával megállapíthatja, hogy egy egérkattintás az objektum határoló téglalapján belül esik-e a kör geometriájába. A találattesztelés alapértelmezett implementációját módosíthatja, hogy saját egyéni találatteszt-számításokat hajtson végre.
A találatok tesztelésével kapcsolatos további információkért lásd: Hit Testing in the Visual Layer.
A vizuális fa számbavétele
Az VisualTreeHelper osztály funkcióval rendelkezik a vizualizációfa tagjainak számbavételéhez. A szülő lekéréséhez szólítsa/használja meg a GetParent módszert. A vizuális objektum gyermekének vagy közvetlen leszármazottjának lekéréséhez hívja meg a GetChild metódust. Ez a metódus a szülő gyermekét Visual adja vissza a megadott indexben.
Az alábbi példa bemutatja, hogyan lehet számba venni egy vizualizációs objektum összes leszármazottját. Ezt a technikát érdemes lehet használni, ha egy vizualizációs objektumhierarchia összes renderelési információját szeretné szerializálni.
// 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
A legtöbb esetben a logikai fa a WPF-alkalmazások elemeinek hasznosabb ábrázolása. Bár közvetlenül nem módosítja a logikai fát, az alkalmazás ezen nézete hasznos a tulajdonságöröklés és az esemény-útválasztás megértéséhez. A vizuális fával ellentétben a logikai fa képes nem vizuális adatobjektumokat, például ListItem ábrázolni. További információ a logikai fáról az alábbi hivatkozásnál található: Fák a WPF.
Az VisualTreeHelper osztály metódusokat biztosít a vizuális objektumok határoló téglalapjának visszaadására. A vizuális objektum határoló téglalapját visszaadhatja a GetContentBounds hívásával. A vizuális objektum összes leszármazottjának, beleértve magát a vizuális objektumot is, határoló téglalapját visszaadhatja GetDescendantBounds meghívásával. Az alábbi kód bemutatja, hogyan számíthatod ki egy vizuális objektum és annak összes leszármazottjának határoló téglalapját.
// 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)
Lásd még
.NET Desktop feedback