Menampilkan tampilan XNA langsung di jendela WPF
ringkasan
Menjelaskan cara merender langsung di jendela WPF dengan XNA.
Lingkungan operasi
Prasyarat
Versi XNA yang Didukung |
|
Platform yang Didukung |
|
Versi Vertex Shader yang Diperlukan Windows | 1.1 |
Versi Pixel Shader yang Diperlukan Windows | 1.1 |
Lingkungan operasi
balei-balei |
zat
Dalam Menggunakan XNA di Aplikasi WPF, saya menggunakan kontrol WindowsFormsHost untuk menampilkan tampilan, tetapi sekarang saya hanya ingin menggunakan jendela WPF untuk menampilkan poligon. "Menggunakan XNA dalam Aplikasi WPF" adalah sedikit representasi, jadi saya akan menjelaskan perbedaannya.
Alias namespace
// 名前空間エイリアス
using Xna = Microsoft.Xna.Framework;
using XnaGraphics = Microsoft.Xna.Framework.Graphics;
Karena struktur Warna dan Matriks dicakup oleh namespace XNA Framework dan WPF, Anda harus menentukan nama struktur dari namespace untuk menggunakannya. Namun, sepertinya panjang setiap saat, jadi saya membuat alias namespace. Misalnya, "Microsoft.Xna.Framework.Rectangle" sekarang dapat ditentukan sebagai "Xna.Rectangle".
Timer
Sejak .NET Framework 3.0, kelas pengatur waktu yang disebut "System.Windows.Threading.DispatcherTimer" telah tersedia, dan kelas pengatur waktu ini digunakan untuk merender setiap bingkai. WPF menggunakan DispatcherTimer untuk mengizinkan pemrosesan pada utas yang sama dengan UI.
<summary>
タイマー
</summary>
private DispatcherTimer timer = null;
, mendeklarasikan DispatcherTimer.
<summary>
タイマーイベント
</summary>
<param name="sender"></param>
<param name="e"></param>
private void dispatcherTimer_Tick(object sender, EventArgs e)
{
this.Draw();
}
Menentukan metode yang dipanggil DispatcherTimer secara berkala.
// タイマー
this.timer = new DispatcherTimer();
this.timer.Tick += new EventHandler(dispatcherTimer_Tick);
this.timer.Interval = new TimeSpan(0, 0, 0, 0, 16);
this.timer.Start();
Ini adalah proses pengaturan timer. Setelah membuat instans DispatcherTimer dan mengatur metode untuk memanggil dan interval waktu, metode DispatcherTimer.Start memulai pengatur waktu.
Mendapatkan Pegangan Jendela
Untuk membuat perangkat Direct3D, Anda memerlukan gagang jendela. Namun, WPF tidak memiliki konsep pegangan jendela, jadi tidak ada cara untuk mendapatkannya langsung dari kelas Window.
Namun, karena ada kalanya pegangan jendela diperlukan, seperti dalam kasus ini, pegangan jendela dapat diperoleh melalui kelas "System.Windows.Interop.WindowInteropHelper" sebagai interop untuk kode Win32. (ini adalah kelas Window)
// ウィンドウハンドルを取得する
IntPtr handle = new WindowInteropHelper(this).Handle;
Gunakan pegangan ini saat membuat perangkat Direct3D. Namun, jika Anda mencoba mendapatkan pegangan jendela dalam metode OnInitialized, itu akan mengembalikan 0, mungkin karena jendela belum dibuat. Dalam sampel ini, perangkat dibuat dalam metode OnSourceInitialized.
Render ke Area yang Ditentukan
Anda dapat menentukan area tujuan sebagai argumen kedua dari GraphicsDevice.Present. Dalam sampel, saya mencoba menggambarnya pada posisi (50, 50) sebagai offset. Ukurannya sama dengan ukuran backbuffer (300, 300). Argumen pertama adalah area dari mana akan menggambar, dan jika null ditentukan, buffer asli digunakan.
// 描画先を指定する
Xna.Rectangle rect = new Xna.Rectangle(
50, 50,
(int)this.viewSize.Width, (int)this.viewSize.Height);
this.device.Present(null, rect, this.windowHandle);
Menghancurkan perangkat
Anda menghancurkan perangkat Anda saat menutup jendela. Awalnya, saya ingin menanganinya dengan metode Dispose, tetapi karena kelas WPF Window tidak mewarisi IDisposable secara default, saya menulisnya di sini sebagai gantinya.
<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);
}
eksekusi
Jika Anda menjalankan program sampel, Anda dapat menjalankannya dengan gambar layar seperti yang ada di awal artikel.
Sekilas, ini dirender dengan baik, tetapi ketika saya mengubah ukuran jendela dengan menyeretnya dengan mouse, tampilan berkedip atau menghilang selama pengubahan ukuran. Tampaknya bertentangan dengan rendering WPF, dan saya mencoba banyak hal tetapi tidak dapat menyelesaikannya.
Jika Anda menggunakan XNA, tampaknya lebih aman menggunakan kontrol WindowsFormsHost.
Program ini memerlukan .NET Framework 3.0, runtime DirectX terbaru, dan Microsoft XNA Framework Redistributable 2.0. Selain itu, sebagai persyaratan perangkat keras, diperlukan "kartu grafis yang mendukung Pixel Shader 1.1 atau lebih tinggi".
Selain itu, proyek ini dibuat di "Visual Studio 2008 Professional Edition". Siapkan lingkungan untuk Visual Studio 2008.