2013. április 12., péntek

Wpf #8 A konstruktor elött

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