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.
A WPF animációs motor számos funkciót kínál a keretalapú animációk létrehozásához. Vannak azonban olyan alkalmazásforgatókönyvek, amelyekben a képkockánkénti renderelés finomabb szabályozására van szükség. A CompositionTarget objektum lehetőséget nyújt egyedi animációk létrehozására, amelyek keretenként hívhatók vissza.
CompositionTarget egy statikus osztály, amely azt a megjelenítési felületet jelöli, amelyen az alkalmazás rajzolva van. A Rendering esemény minden alkalommal megjelenik, amikor az alkalmazás jelenete megrajzolódik. A képkockasebesség az a szám, amely meghatározza, hogy a jelenet másodpercenként hányszor kerül kirajzolásra.
Megjegyzés:
A CompositionTargethasználatával készült teljes kódmintát a A CompositionTarget-mintacímű témakörben talál.
példa
A Rendering esemény a WPF-renderelési folyamat során aktiválódik. A következő példa bemutatja, hogyan regisztrál egy EventHandler delegáltat a statikus Rendering metódusra a CompositionTarget-n.
// Add an event handler to update canvas background color just before it is rendered.
CompositionTarget.Rendering += UpdateColor;
' Add an event handler to update canvas background color just before it is rendered.
AddHandler CompositionTarget.Rendering, AddressOf UpdateColor
A renderelési eseménykezelő metódussal egyéni rajztartalmakat hozhat létre. Ezt az eseménykezelő metódust a rendszer egyszer keretenként hívja meg. Minden alkalommal, amikor a WPF a vizualizációfán lévő tartós renderelési adatokat a kompozíciós jelenet grafikonja felé mozgatja, a rendszer meghívja az eseménykezelő metódust. Emellett, ha a vizualizációfa módosítása a kompozíciós jelenet grafikonjának frissítését kényszeríti, az eseménykezelő metódust is meghívja a rendszer. Vegye figyelembe, hogy az eseménykezelő metódus az elrendezés kiszámítása után lesz meghívva. Az eseménykezelő metódusban azonban módosíthatja az elrendezést, ami azt jelenti, hogy az elrendezést még egyszer kiszámítja a renderelés előtt.
Az alábbi példa bemutatja, hogyan adhat meg egyéni rajzot egy CompositionTarget eseménykezelő metódusban. Ebben az esetben a Canvas háttérszíne az egér koordináta-pozíciója alapján színértékkel lesz rajzolva. Ha az egeret a Canvasbelülre helyezi, a háttér színe megváltozik. Emellett az átlagos képkockasebesség kiszámítása az aktuális eltelt idő és a renderelt keretek teljes száma alapján történik.
// Called just before frame is rendered to allow custom drawing.
protected void UpdateColor(object sender, EventArgs e)
{
if (_frameCounter++ == 0)
{
// Starting timing.
_stopwatch.Start();
}
// Determine frame rate in fps (frames per second).
long frameRate = (long)(_frameCounter / this._stopwatch.Elapsed.TotalSeconds);
if (frameRate > 0)
{
// Update elapsed time, number of frames, and frame rate.
myStopwatchLabel.Content = _stopwatch.Elapsed.ToString();
myFrameCounterLabel.Content = _frameCounter.ToString();
myFrameRateLabel.Content = frameRate.ToString();
}
// Update the background of the canvas by converting MouseMove info to RGB info.
byte redColor = (byte)(_pt.X / 3.0);
byte blueColor = (byte)(_pt.Y / 2.0);
myCanvas.Background = new SolidColorBrush(Color.FromRgb(redColor, 0x0, blueColor));
}
' Called just before frame is rendered to allow custom drawing.
Protected Sub UpdateColor(ByVal sender As Object, ByVal e As EventArgs)
If _frameCounter = 0 Then
' Starting timing.
_stopwatch.Start()
End If
_frameCounter = _frameCounter + 1
' Determine frame rate in fps (frames per second).
Dim frameRate As Long = CLng(Fix(_frameCounter / Me._stopwatch.Elapsed.TotalSeconds))
If frameRate > 0 Then
' Update elapsed time, number of frames, and frame rate.
myStopwatchLabel.Content = _stopwatch.Elapsed.ToString()
myFrameCounterLabel.Content = _frameCounter.ToString()
myFrameRateLabel.Content = frameRate.ToString()
End If
' Update the background of the canvas by converting MouseMove info to RGB info.
Dim redColor As Byte = CByte(_pt.X / 3.0)
Dim blueColor As Byte = CByte(_pt.Y / 2.0)
myCanvas.Background = New SolidColorBrush(Color.FromRgb(redColor, &H0, blueColor))
End Sub
Előfordulhat, hogy az egyéni rajz különböző sebességgel fut különböző számítógépeken. Ennek az az oka, hogy az egyéni rajz nem független a képkockasebességtől. A futó rendszertől és a rendszer számítási feladatától függően a Rendering esemény másodpercenként eltérő számú alkalommal hívható meg. A WPF-alkalmazást futtató eszközök grafikus hardverképességének és teljesítményének meghatározásáról a Grafikus megjelenítési szintekcímű témakörben olvashat.
A renderelési EventHandler delegált hozzáadása vagy eltávolítása az esemény végrehajtása közben késleltetve lesz, amíg az esemény be nem fejeződik. Ez összhangban van a MulticastDelegate-alapú események a Common Language Runtime (CLR) által történő kezelésével. Azt is vegye figyelembe, hogy a renderelési események nem garantáltan egyetlen adott sorrendben sem hívhatók meg. Ha több EventHandler delegáltja van, amelyek egy bizonyos sorrendre támaszkodnak, akkor egyetlen Rendering eseményt kell regisztrálnia, és magának kell a delegáltakat a megfelelő sorrendben összekapcsolnia.
Lásd még
.NET Desktop feedback