none
[MVVM]Comment contrôler soi-même la création de la classe MainWindow en WPF/Silverlight ? RRS feed

  • Question

  • Bonjour,

     

    J'ai trouvé des codes d'exemple d'applis WPF dans lequel dans la fichier App.Xam.cs, on avait ceci: 

        protected override void OnStartup(StartupEventArgs e)
        {
          base.OnStartup(e);
    
          var viewModel = new MainWindowViewModel();
    
          var mainWindow = new MainWindow();
          mainWindow.DataContext = viewModel;
          InitTrace();
          mainWindow.Show();
        }
    


    Et donc on controle soi-même la création de la classe MainWindow. Quand j'insère ce code dans le mine, évidemment il me crée deux fenêtres ! Et je n'arrive pas à voir ce qui diffère dans mon code et celui des exemples.

    Eventuellement, peut-on faire cela également en Silverlight ? Parce que je ne vois pas trop à quoi sert la classe MainWindow en Silverlight...

    Cordialement


    Philippe
    jeudi 25 novembre 2010 15:37

Réponses

  • Bonjour,

    En SilverLight, l'objet Application a une propriété RootVisual.

    Ce code devrait marcher:

    namespace SilverlightApplication
    {
     public partial class App : Application
     {
      public App()
      {
       InitializeComponent();
       this.Startup += this.Application_Startup;
      }
    
     private void Application_Startup(object sender, StartupEventArgs e)
     { 
      MainWindowViewModel viewModel = new MainWindowViewModel();
      MainWindow mainWindow = new MainWindow();
      mainWindow.DataContext = viewModel; 
      InitTrace();
      this.RootVisual = mainWindow();
     }
     }
    }
    
    

    lundi 29 novembre 2010 19:26

Toutes les réponses

  • Bonjour,

    MainWindow correspond à votre View et doit être de type Window, et MainWindowViewModel à votre ViewModel qui doit être une simple classe. Donc normalement la seulement fenêtre qui doit s'afficher est MainWindow. Votre ViewModel va permettre de renseigner le DataContext de votre View.

    On peut faire la même chose en Silverlight, mais la MainWindow sera un UserControl et MainWindowViewModel sera toujours une classe.


    Audrey - http://blogs.developpeur.org/audrey/ - http://msmvps.com/blogs/audrey - “This forum post is my own opinion and does not necessarily reflect the opinion or view of Microsoft, its employees, or other MVPs.”
    vendredi 26 novembre 2010 08:27
  • Merci de votre réponse mais je crois que je me suis mal exprimé.

    Mon but est de ne pas laisser le projet WPF par défaut créer une instance de la classe MainWindow, afin de pouvoir y attacher directement son DataContext. Je vois que c'est possible mais je ne sais pas comment faire, même si pourtant j'ai des codes d'exemple sous les yeux qui le font en overridant OnStartUp. Moi si j'override le OnStartUp je crée deux MainWindows !

    Ça m'intéresserait surtout de le faire en Silverlight car je ne comprends pas l'utilité de la classe MainWindow en SL (elle correspond à quoi graphiquement ?), et surtout je ne sais pas quand elle est créée. Est-ce dans son constructeur que l'on doit mettre les fonction d'initialisation ou dans celui de la classe App ?

     

    Cordialement


    Philippe
    vendredi 26 novembre 2010 15:28
  • Bonjour,

    En SilverLight, l'objet Application a une propriété RootVisual.

    Ce code devrait marcher:

    namespace SilverlightApplication
    {
     public partial class App : Application
     {
      public App()
      {
       InitializeComponent();
       this.Startup += this.Application_Startup;
      }
    
     private void Application_Startup(object sender, StartupEventArgs e)
     { 
      MainWindowViewModel viewModel = new MainWindowViewModel();
      MainWindow mainWindow = new MainWindow();
      mainWindow.DataContext = viewModel; 
      InitTrace();
      this.RootVisual = mainWindow();
     }
     }
    }
    
    

    lundi 29 novembre 2010 19:26
  • Merci !
    Philippe
    mercredi 1 décembre 2010 14:02
  • De rien!

    Par contre est-ce que quelqu'un sait si il y a un équivalent en WPF pour ma culture personnelle?

    Merci


    Christophe Argento
    Architecte .Net/Consultant chez Ineat Conseil
    Blog: http://christopheargento.com
    mercredi 1 décembre 2010 22:22
  • Oui regarde ici: http://binary-studio.com/blog/technical-blog/wpf-software-development-model-view-application-drag-and-drop/. Tu verras ce code:

    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {
    private void OnStartup(object senderStartupEventArgs e)
    {
    // Create the ViewModel and expose it using the View's DataContext
    var view = new MainView();
    view.DataContext = new MainViewModel();
    view.Show();
    }
    }


    Philippe
    jeudi 2 décembre 2010 08:11