Zobrazenie XNA priamo v okne WPF
súhrn
Popisuje, ako prekresliť priamo v okne WPF pomocou XNA.
Prevádzkové prostredie
Predpoklady
Podporované verzie XNA |
|
Podporované platformy |
|
Windows vyžaduje verziu tieňovača vrcholov | 1.1 |
Windows vyžaduje verziu Pixel Shader | 1.1 |
Prevádzkové prostredie
nástupište |
látka
V časti Používanie XNA v aplikáciách WPF som na zobrazenie použil ovládací prvok WindowsFormsHost, ale teraz chcem na zobrazenie polygónu použiť iba okno WPF. "Používanie XNA v aplikáciách WPF" je trochu reprezentácia, takže vysvetlím rozdiely.
Aliasy priestoru názvov
// 名前空間エイリアス
using Xna = Microsoft.Xna.Framework;
using XnaGraphics = Microsoft.Xna.Framework.Graphics;
Keďže štruktúry Color a Matrix sú pokryté priestormi názvov XNA Framework a WPF, musíte zadať názov štruktúry z menného priestoru, aby ste ju mohli použiť. Zdá sa však, že je zakaždým dlhý, takže vytváram alias menného priestoru. Napríklad "Microsoft.Xna.Framework.Rectangle" je teraz možné zadať ako "Xna.Rectangle".
časovač
Od rozhrania .NET Framework 3.0 je k dispozícii trieda časovača s názvom "System.Windows.Threading.DispatcherTimer" a táto trieda časovača sa používa na vykreslenie každej snímky. WPF používa DispatcherTimer na umožnenie spracovania v rovnakom vlákne ako používateľské rozhranie.
<summary>
タイマー
</summary>
private DispatcherTimer timer = null;
, deklarujúc DispatcherTimer.
<summary>
タイマーイベント
</summary>
<param name="sender"></param>
<param name="e"></param>
private void dispatcherTimer_Tick(object sender, EventArgs e)
{
this.Draw();
}
Definuje metódu, ktorú DispatcherTimer volá v pravidelných intervaloch.
// タイマー
this.timer = new DispatcherTimer();
this.timer.Tick += new EventHandler(dispatcherTimer_Tick);
this.timer.Interval = new TimeSpan(0, 0, 0, 0, 16);
this.timer.Start();
Toto je proces nastavenia časovača. Po vytvorení inštancie DispatcherTimer a nastavení metódy volania a časového intervalu metóda DispatcherTimer.Start spustí časovač.
Získanie okennej kľučky
Na vytvorenie zariadenia Direct3D potrebujete okennú rukoväť. WPF však nemá koncept popisovača okna, takže neexistuje spôsob, ako ho získať priamo z triedy Window.
Keďže sú však chvíle, keď je potrebná okenná rukoväť, ako v tomto prípade, je možné ju získať prostredníctvom triedy "System.Windows.Interop.WindowInteropHelper" ako interop pre kód Win32. (toto je trieda Window)
// ウィンドウハンドルを取得する
IntPtr handle = new WindowInteropHelper(this).Handle;
Túto rukoväť použite pri vytváraní zariadenia Direct3D. Ak sa však pokúsite získať kľučku okna v metóde OnInitialized, vráti 0, pravdepodobne preto, že okno ešte nebolo vytvorené. V tejto ukážke je zariadenie vytvorené v metóde OnSourceInitialized.
Prekresliť do určenej oblasti
Cieľovú oblasť môžete zadať ako druhý argument GraphicsDevice.Present. Vo vzorke sa ho snažím nakresliť na pozícii (50, 50) ako posun. Veľkosť je rovnaká ako veľkosť backbufferu (300, 300). Prvý argument je oblasť, z ktorej sa má čerpať, a ak je zadaná hodnota null, použije sa pôvodná vyrovnávacia pamäť.
// 描画先を指定する
Xna.Rectangle rect = new Xna.Rectangle(
50, 50,
(int)this.viewSize.Width, (int)this.viewSize.Height);
this.device.Present(null, rect, this.windowHandle);
Zničenie zariadenia
Keď zatvoríte okno, zničíte svoje zariadenie. Pôvodne som to chcel riešiť metódou Dispose, ale keďže trieda WPF Window štandardne nededí IDisposable, napísal som ju sem.
<summary>
ウインドウが閉じたとき
</summary>
<param name="e"></param>
protected override void OnClosed(EventArgs e)
{
if (this.device != null)
{
this.device.Dispose();
this.device = null;
}
base.OnClosed(e);
}
poprava
Ak spustíte vzorový program, môžete ho spustiť s obrázkom obrazovky, ako je ten na začiatku článku.
Na prvý pohľad sa vykresľuje dobre, ale keď zmením veľkosť okna potiahnutím myšou, zobrazenie počas zmeny veľkosti bliká alebo zmizne. Zdá sa, že je to v rozpore s vykresľovaním WPF a vyskúšal som veľa vecí, ale nepodarilo sa mi to vyriešiť.
Ak používate XNA, zdá sa byť bezpečnejšie použiť ovládací prvok WindowsFormsHost.
Program vyžaduje rozhranie .NET Framework 3.0, najnovší modul runtime DirectX a Microsoft XNA Framework Redistributable 2.0. Okrem toho sa ako hardvérová požiadavka vyžaduje "grafická karta, ktorá podporuje Pixel Shader 1.1 alebo vyšší".
Okrem toho bol projekt vytvorený v "Visual Studio 2008 Professional Edition". Príprava prostredia pre Visual Studio 2008.