Opsi Window
Referensi lengkap untuk semua opsi window.
Wails menyediakan API manajemen window terpadu yang berfungsi di semua platform. Buat window, kendalikan perilakunya, dan kelola beberapa window dengan kontrol penuh atas pembuatan, tampilan, perilaku, dan siklus hidup.
package main
import "github.com/wailsapp/wails/v3/pkg/application"
func main() { app := application.New(application.Options{ Name: "My App", })
// Create a window window := app.Window.New()
// Configure it window.SetTitle("Hello Wails") window.SetSize(800, 600) window.Center()
// Show it window.Show()
app.Run()}Itu saja! Anda sudah memiliki window lintas platform.
Cara paling sederhana untuk membuat window:
window := app.Window.New()Yang Anda dapatkan:
Buat window dengan konfigurasi kustom:
window := app.Window.NewWithOptions(application.WebviewWindowOptions{ Title: "My Application", Width: 1200, Height: 800, X: 100, // Position from left Y: 100, // Position from top AlwaysOnTop: false, Frameless: false, Hidden: false, MinWidth: 400, MinHeight: 300, MaxWidth: 1920, MaxHeight: 1080,})Opsi umum:
| Opsi | Tipe | Deskripsi |
|---|---|---|
Title | string | Judul window |
Width | int | Lebar window dalam piksel |
Height | int | Tinggi window dalam piksel |
X | int | Posisi X (dari kiri) |
Y | int | Posisi Y (dari atas) |
AlwaysOnTop | bool | Jaga window di atas window lain |
Frameless | bool | Hapus title bar dan border |
Hidden | bool | Mulai dalam keadaan tersembunyi |
MinWidth | int | Lebar minimum |
MinHeight | int | Tinggi minimum |
MaxWidth | int | Lebar maksimum |
MaxHeight | int | Tinggi maksimum |
Lihat Opsi Window untuk daftar lengkap.
Berikan nama pada window agar mudah diambil kembali:
window := app.Window.NewWithOptions(application.WebviewWindowOptions{ Name: "main-window", Title: "Main Application",})
// Later, find it by nameif mainWindow, ok := app.Window.GetByName("main-window"); ok { mainWindow.Show()}Kasus penggunaan:
// Show windowwindow.Show()
// Hide windowwindow.Hide()
// Check if visibleif window.IsVisible() { fmt.Println("Window is visible")}Kasus penggunaan:
// Set sizewindow.SetSize(1024, 768)
// Set positionwindow.SetPosition(100, 100)
// Centre on screenwindow.Center()
// Get current sizewidth, height := window.Size()
// Get current positionx, y := window.Position()Sistem koordinat:
// Minimisewindow.Minimise()
// Maximisewindow.Maximise()
// Fullscreenwindow.Fullscreen()
// Restore to normalwindow.Restore()
// Check stateif window.IsMinimised() { fmt.Println("Window is minimised")}
if window.IsMaximised() { fmt.Println("Window is maximised")}
if window.IsFullscreen() { fmt.Println("Window is fullscreen")}Transisi status:
Normal ←→ MinimisedNormal ←→ MaximisedNormal ←→ Fullscreen// Set titlewindow.SetTitle("My Application - Document.txt")
// Set background colour — RGBA value (helper for RGB)window.SetBackgroundColour(application.NewRGBA(0, 0, 0, 255))
// Set always on topwindow.SetAlwaysOnTop(true)
// Set resizablewindow.SetResizable(false)// Close window — dispatches WindowClosing; a RegisterHook can call e.Cancel().window.Close()Tidak ada metode window.Destroy() di v3 — gunakan Close() dan dengarkan dengan OnWindowEvent (tidak dapat dibatalkan) atau hook dengan RegisterHook (dapat memanggil e.Cancel() untuk menjaga window tetap terbuka).
if window, ok := app.Window.GetByName("settings"); ok { window.Show()}Setiap window memiliki ID unik:
id := window.ID()fmt.Printf("Window ID: %d\n", id)
// Find by IDif found, ok := app.Window.GetByID(id); ok { found.Focus()}Dapatkan window yang sedang fokus:
current := app.Window.Current()if current != nil { current.SetTitle("Active Window")}Dapatkan semua window:
windows := app.Window.GetAll()fmt.Printf("Total windows: %d\n", len(windows))
for _, w := range windows { fmt.Printf("Window: %s (ID: %d)\n", w.Name(), w.ID())}app.Window.OnCreate(func(window application.Window) { fmt.Printf("Window created: %s\n", window.Name())
// Configure new windows window.SetMinSize(400, 300)})Untuk mencegah window ditutup, gunakan RegisterHook dengan event WindowClosing:
window.RegisterHook(events.Common.WindowClosing, func(event *application.WindowEvent) { if hasUnsavedChanges() { // Ask user for confirmation result := showConfirmDialog("Unsaved changes. Close anyway?") if result != "yes" { // Cancel the close event event.Cancel() } }})Penting: RegisterHook mencegat event close sebelum terjadi. Panggil event.Cancel() untuk mencegah window ditutup. Ini berfungsi untuk penutupan yang dipicu pengguna (mengklik tombol X).
Untuk melakukan cleanup saat window ditutup, gunakan OnWindowEvent dengan event WindowClosing:
window.OnWindowEvent(events.Common.WindowClosing, func(event *application.WindowEvent) { fmt.Println("Window is closing") // Cleanup resources})// Main windowmainWindow := app.Window.NewWithOptions(application.WebviewWindowOptions{ Name: "main", Title: "Main Application", Width: 1200, Height: 800,})
// Settings windowsettingsWindow := app.Window.NewWithOptions(application.WebviewWindowOptions{ Name: "settings", Title: "Settings", Width: 600, Height: 400, Hidden: true, // Start hidden})
// Show settings when neededsettingsWindow.Show()Window dapat berkomunikasi via event:
// In main windowapp.Event.Emit("data-updated", map[string]interface{}{ "value": 42,})
// In settings windowapp.Event.On("data-updated", func(event *application.CustomEvent) { data := event.Data.(map[string]interface{}) value := data["value"].(int) fmt.Printf("Received: %d\n", value)})Lihat Event untuk selengkapnya.
WebviewWindowOptions tidak memiliki field Parent. Buat child sebagai window normal dan lampirkan ke parent sebagai sheet modal:
// Create child windowchildWindow := app.Window.NewWithOptions(application.WebviewWindowOptions{ Title: "Child Window",})
// Attach to the parent — presents as a sheet on macOS.mainWindow.AttachModal(childWindow)Perilaku:
Dukungan platform:
Fitur khusus Windows:
// Flash taskbar buttonwindow.Flash(true) // Start flashingwindow.Flash(false) // Stop flashing
// Trigger Windows 11 Snap Assist (Win+Z)window.SnapAssist()Tidak ada SetIcon per-window — ikon aplikasi diatur pada app via app.SetIcon([]byte) (atau untuk ikon window khusus Linux, field application.LinuxWindow.Icon saat pembuatan window).
Snap Assist: Menampilkan opsi layout snap Windows 11 untuk window.
Kedip taskbar: Berguna untuk notifikasi saat window diminimalkan.
Fitur khusus macOS:
// Transparent title barwindow := app.Window.NewWithOptions(application.WebviewWindowOptions{ Mac: application.MacWindow{ TitleBar: application.MacTitleBar{ AppearsTransparent: true, }, Backdrop: application.MacBackdropTranslucent, },})Tipe backdrop:
MacBackdropNormal - Window standarMacBackdropTranslucent - Latar belakang transparanMacBackdropTransparent - Sepenuhnya transparanCollection behavior: Kendalikan bagaimana window berperilaku di seluruh Spaces:
MacWindowCollectionBehaviorCanJoinAllSpaces - Terlihat di semua SpacesMacWindowCollectionBehaviorFullScreenAuxiliary - Dapat menutupi aplikasi fullscreenFullscreen native: Fullscreen macOS membuat Space baru (virtual desktop).
Fitur khusus Linux:
// Set window icon (per-window struct is LinuxWindow, not the app-level LinuxOptions)window := app.Window.NewWithOptions(application.WebviewWindowOptions{ Linux: application.LinuxWindow{ Icon: iconBytes, },})Catatan desktop environment:
Tiling window manager (Hyprland, Sway, i3, dll.):
Minimise() dan Maximise() mungkin tidak berfungsi seperti yang diharapkan — WM mengontrol geometri windowSetSize() dan SetPosition() bersifat advisory dan mungkin diabaikanFullscreen() umumnya berfungsi seperti yang diharapkan// Create splash screensplash := app.Window.NewWithOptions(application.WebviewWindowOptions{ Title: "Loading...", Width: 400, Height: 300, Frameless: true, AlwaysOnTop: true,})
// Show splashsplash.Show()
// Initialise applicationtime.Sleep(2 * time.Second)
// Hide splash, show main windowsplash.Close()mainWindow.Show()var settingsWindow *application.WebviewWindow
func showSettings() { if settingsWindow == nil { settingsWindow = app.Window.NewWithOptions(application.WebviewWindowOptions{ Name: "settings", Title: "Settings", Width: 600, Height: 400, }) }
settingsWindow.Show() settingsWindow.Focus()}window.RegisterHook(events.Common.WindowClosing, func(event *application.WindowEvent) { if hasUnsavedChanges() { // Show dialog result := showConfirmDialog("Unsaved changes. Close anyway?") if result != "yes" { // Cancel the close event event.Cancel() } }})Kemungkinan penyebab:
Solusi:
window.Show()window.Center()window.Focus()Penyebab: Skala DPI di Windows/Linux
Solusi:
// Wails handles DPI automatically// Just use logical pixelswindow.SetSize(800, 600)Penyebab: Aplikasi keluar saat window terakhir ditutup
Solusi:
app := application.New(application.Options{ Mac: application.MacOptions{ ApplicationShouldTerminateAfterLastWindowClosed: false, },})Opsi Window
Referensi lengkap untuk semua opsi window.
Beberapa Window
Pola untuk aplikasi multi-window.
Window Tanpa Frame
Buat chrome window kustom.
Event Window
Tangani event siklus hidup window.
Pertanyaan? Tanyakan di Discord atau lihat contoh window.