Egy tetszőleges Wpf alkalmazás fejlesztésekor hamar felmerülhet a kérdés, vajon a konstruktor hol hívódik meg? Átnézve a file-okat, amelyeket a VisualStudio hozott létre, az alkalmazáshoz sehol se lehet a konstruktor meghívására utaló kódot találni.
A VisualStudio által készített projektben ilyen nincs is. Ez persze nem azt jelenti, hogy nem lehet.
A projektet közelebbről megvizsgálva található benne egy App.xaml én annak a mögöttes kódja.
Az XAML file tartalma hasonló az alábbihoz (leszámítva az osztály elnevezést)
<Application x:Class="Wpf08_BeforeConstructor.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" StartupUri="MainWindow.xaml"> <Application.Resources> </Application.Resources> </Application>
A program ablak megjelenítés céljából a fontos értékadás a StartupUri attributumban találaható.
A megatott érték annak a Window-nak a neve amely a program indulásakor látható lesz.
Amennyiben a projekthez hozzáadásra kerül egy új Window (add/new item/Window(WPF)), akkor annak nevét megadva immáron az lesz a kezdőablak.
A konstruktor meghívását a keretrendszer a háttérben elvégzi.
A legritkább esetek közé tartozik, hogy egy komplett rendszer rögtön az UI megmutatásával indul.
Valójában előtte számos inicializálás és vizsgálat lezajlik, sőt jónéhány paramétert is átadásra kerülhet.
Ahhoz, hogy a konstuktor meghívása már az általunk felügyelt kódból történjen néhány apró változtatásra van szükség.
A legelső, hogy az előbbi StartupUri="MainWindow.xaml" attributumot ki kell törölni és helyette az alábbi attributum kell: Startup="ApplicationStartup"
Az App.xaml új tartalma:
<Application x:Class="Wpf08_BeforeConstructor.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Startup="ApplicationStartup"> <Application.Resources> </Application.Resources> </Application>
A Startup attributum meghatározza az induláskor lefuttatandó metódus nevét.
Ebből következőleg valahol kell egy ApplicationStartup nevű metódus.
Az App.xaml.cs file-t megnyitva egy teljesen üres osztály látható. A számunkra szükséges kódot itt kell elhelyezni.
public partial class App : Application { public void ApplicationStartup(Object sender, StartupEventArgs e) { } }
A program indításakor immáron ez az eljárás hívódik meg. A Wpf ablak konstruktorának a meghívását is ebből (vagy valamely ebből meghívott eljárásból) célszerű végrehajtani.
A konstruktor jelenleg az alábbi kinézetű
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } }
Mivel a konstrukor meghívása immáron kódból történik, ezért tetszőleges paraméter is átadható.
Tételezzük fel, hogy egy string paraméter átadása szükséges.
Ebben az esetben a konstrukor: public MainWindow(string someString)
A meghívása az App.xaml.cs ApplicationStratup-ból történik
public partial class App : Application { public void ApplicationStartup(Object sender, StartupEventArgs e) { var window = new MainWindow("hello world"); // itt még tetszőleges, a Window-ban található általad megírt metódus meghívható // pl Init() window.Show(); } }
Ezzel a módszerrel immáron számos ellenőrzés elvégezhető mielőtt az UI meghívásra kerülne.
Számos szerviz injektálható a konstruktoron keresztül (pl Log), amelyek létrehozásához a Wpf ablaknak semmi köze nincs, és illik már készen átadni.
Nincsenek megjegyzések:
Megjegyzés küldése