Zobrazení zobrazení XNA přímo v okně WPF
shrnutí
Popisuje, jak vykreslovat přímo v okně WPF pomocí XNA.
Provozní prostředí
Požadavky
Podporované verze XNA |
|
Podporované platformy |
|
Požadovaná verze Vertex Shader systému Windows | 1.1 |
Windows Požadovaná verze pixel shaderu | 1.1 |
Provozní prostředí
nástupiště |
hmota
Při použití XNA v aplikacích WPF jsem k zobrazení zobrazení použil ovládací prvek WindowsFormsHost, ale nyní chci k zobrazení mnohoúhelníku použít pouze okno WPF. "Použití XNA v aplikacích WPF" je tak trochu reprezentace, takže vysvětlím rozdíly.
Aliasy jmenného prostoru
// 名前空間エイリアス
using Xna = Microsoft.Xna.Framework;
using XnaGraphics = Microsoft.Xna.Framework.Graphics;
Vzhledem k tomu, že struktury Color a Matrix jsou pokryty obory názvů XNA Framework a WPF, je nutné zadat název struktury z oboru názvů, abyste ji mohli použít. Zdá se mi však, že je to pokaždé dlouhé, takže vytvářím alias jmenného prostoru. Například "Microsoft.Xna.Framework.Rectangle" lze nyní zadat jako "Xna.Rectangle".
časovač
Od rozhraní .NET Framework 3.0 je k dispozici třída časovače s názvem "System.Windows.Threading.DispatcherTimer" a tato třída časovače se používá k vykreslení každého snímku. WPF používá DispatcherTimer k povolení zpracování ve stejném vlákně jako uživatelské rozhraní.
<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 metodu, kterou DispatcherTimer volá v pravidelných intervalech.
// タイマー
this.timer = new DispatcherTimer();
this.timer.Tick += new EventHandler(dispatcherTimer_Tick);
this.timer.Interval = new TimeSpan(0, 0, 0, 0, 16);
this.timer.Start();
Jedná se o proces nastavení časovače. Po vytvoření instance DispatcherTimer a nastavení metody na volání a časového intervalu spustí metoda DispatcherTimer.Start časovač.
Získání okenní kliky
Chcete-li vytvořit zařízení Direct3D, potřebujete okenní kliku. WPF ale nemá koncept popisovače okna, takže neexistuje způsob, jak ho získat přímo z Window třídy.
Vzhledem k tomu, že existují časy, kdy je vyžadován popisovač okna, jako v tomto případě, lze popisovač okna získat prostřednictvím třídy "System.Windows.Interop.WindowInteropHelper" jako interoperabilitu pro kód Win32. (toto je třída Window)
// ウィンドウハンドルを取得する
IntPtr handle = new WindowInteropHelper(this).Handle;
Tento popisovač použijte při vytváření zařízení Direct3D. Pokud se však pokusíte získat popisovač okna v metodě OnInitialized, vrátí hodnotu 0, pravděpodobně proto, že okno ještě nebylo vytvořeno. V této ukázce je zařízení vytvořeno v metodě OnSourceInitialized.
Vykreslit do určené oblasti
Cílovou oblast můžete zadat jako druhý argument metody GraphicsDevice.Present. V ukázce se ho snažím nakreslit na pozici (50, 50) jako offset. Velikost je stejná jako velikost backbufferu (300, 300). Prvním argumentem je oblast, ze které se má kreslit, a pokud je zadána hodnota null, použije se původní vyrovnávací 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čení zařízení
Když zavřete okno, ničíte své zařízení. Původně jsem to chtěl řešit metodou Dispose, ale protože třída WPF Window ve výchozím nastavení IDisposable nedědí, napsal jsem to místo toho 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
Pokud spustíte ukázkový program, můžete jej spustit s obrázkem obrazovky, jako je ten na začátku článku.
Na první pohled se vykresluje dobře, ale když změním velikost okna přetažením myší, pohled při změně velikosti bliká nebo mizí. Zdá se, že je to v rozporu s vykreslováním WPF a zkoušel jsem spoustu věcí, ale nemohl jsem to vyřešit.
Pokud používáte XNA, zdá se bezpečnější použít ovládací prvek WindowsFormsHost.
Program vyžaduje rozhraní .NET Framework 3.0, nejnovější běhové prostředí DirectX a Microsoft XNA Framework Redistributable 2.0. Kromě toho je jako hardwarový požadavek vyžadována "grafická karta, která podporuje Pixel Shader 1.1 nebo vyšší".
Projekt byl navíc vytvořen v "Visual Studio 2008 Professional Edition". Připravte prostředí pro Visual Studio 2008.