2010-08-09 12 views
18

He estado intentando durante horas llegar al punto en el que puedo iniciar una aplicación WPF y tener control total. Quiero poder crear un modelo de vista, crear una vista (ventana), configurar el contexto de datos de la vista para que sea el modelo de vista y luego mostrar la vista.¿Hay alguna manera de iniciar una aplicación WPF sin StartUpUri que no rompa otra cosa?

He intentado muchos métodos, el más prometedor es cambiar la App.xaml para que sea una página y luego agregar mi propio método Principal. Lamentablemente, esto no funciona correctamente porque VS2010 no muestra los estilos de la aplicación.xaml en el diseñador, aunque funcionan cuando se ejecuta la aplicación.

¿Hay alguna manera de hacer lo que quiero? Si no es así, ¿cómo las personas normalmente inician aplicaciones MVVM en WPF, creando un ViewModel fuera de la Vista?

+1

se puede ver los estilos en el diseñador si se utiliza en lugar del DynamicResource StaticResource. – amaca

Respuesta

20

Usaría el evento de Inicio. Puede agregar esto a App.xaml y eliminar la línea StartupUri. Cuando lo agrega, Visual Studio puede crear el evento para usted dentro del archivo App.xaml.cs. Puede inicializar su ViewModel y View dentro de.

+0

D'Oh, me gustaría haberlo sabido. Es perfecto, gracias! –

+12

lectores futuros, tenga en cuenta que debe asignar un evento NUEVO. NO use el método 'override void void anotado (StartupEventArgs e)', porque hay un error conocido en .NET 4.5 donde el compilador no puede cargar los recursos estáticos que ha especificado en el App.xaml. http://stackoverflow.com/questions/543414/wpf-app-xaml-file-does-not-get-parsed-if-my-app-does-not-set-a-startupuri – Heliac

1

La manera más simple de asignar una instancia de ViewModel al DataContext de la vista está en el código detrás de la ventana.

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     DataContext = new myViewModel(); 
    } 
} 

Para la primera parte de su pregunta, usted puede tener el control de de su aplicación en el evento de arranque

<Application x:Class="myApplication.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      StartupUri="MainWindow.xaml" Startup="Application_Startup"> 
    <Application.Resources> 

    </Application.Resources> 
</Application> 

código subyacente:

public partial class App : Application 
{ 
    private void Application_Startup(object sender, StartupEventArgs e) 
    { 
     // Place your code here 
    } 
} 
+0

Todo depende de lo que su modelo de vista necesite construir. Si tienes un contructor vacío, esto funciona bien. Si no lo haces, no es tan bonito. – digitalMoto

+0

Empecé a agregar una propiedad ViewModel a ViewWindow con las decoraciones de composición necesarias. La clase real para la máquina virtual es explícita, pero todas mis vistas tienen una propiedad "ViewModel". Hasta ahora, hace la vida mucho más fácil al tiempo que respeta el límite entre View y ViewModel. estoy usando un programa previo del Prisma en este punto, por lo que nunca dejar que la llamada App.xaml a mi concha a modo de StartupUri. digitalMoto

2

en nuestra aplicación, hemos elegido la manera que usted ya propuso: escribir un nuevo método Principal. También debe realizar algunos cambios en la configuración de la aplicación del proyecto (sin objeto de inicio). El xaml aplicación tiene que ser algo como esto:

<Application x:Class="EVOCURA.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      Startup="Application_Startup" 
      Exit="Application_Exit"> 

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 

      <!--Custom Controls--> 
      <ResourceDictionary Source="<your resources here>"/> 


     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 

el código detrás se verá algo como esto:

public sealed partial class App : Application 
{ 
    static App() 
    { } 

    public App() 
    { } 

    private void Application_Startup(object sender, StartupEventArgs e) 
    { 
     // create the main window and assign your datacontext 
     MainAppWindow main = new MainAppWindow(); 
     main.DataContext = <your datacontext here> 
     main.Show(); 
    } 

    [STAThreadAttribute] 
    public static int Main(string[] args) 
    { 
     App app = new App(); 

     app.InitializeComponent(); 
     app.Run(); 

     return 0; 
    } 
} 

Tenga una mirada en el evento de arranque y aviso, que no tiene valor predeterminado Se especificó StartupUri en App.xaml

También podría pasar el DataContext en un nuevo constructor de su MainWindow, o crear el DataContext directamente en xaml.

19

Esta es una manera sencilla ...

<Application 
    x:Class="Demo.Ux.WpfApp.App" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
</Application> 

Aquí es el App.xaml.cs básica

public partial class App 
{ 
    protected override void OnStartup(StartupEventArgs e) 
    { 
    try 
    { 
     var mainView = new MainView(); 
     mainView.Show(); 
     mainView.DataContext = new MainViewModel(); 
    } 
    catch (Exception ex) 
    { 
     Debug.WriteLine(ex); 
    } 
    } 
} 

Application.MainWindow se puede utilizar también. La primera ventana mostrada se asignará a MainWindow de forma automática. Por supuesto, puede omitir la creación de su mainView y escribir directamente en MainWindow, lo que adelgazaría la sintaxis también.

MainWindow = new MainView(); 
MainWindow.Show(); 
MainWindow.DataContext = new MainViewModel(); 

Una nota final, estoy haciendo la Show antes de que el aprieto de datos.Debe hacer esto para evitar una situación en la que el MainViewModel arroje una excepción durante la creación. Si no se ha mostrado el MainView, la aplicación se cerrará sin dejar que vea el error.

+0

general, esto es mejor que la respuesta aceptada. –

+3

!!! ¡NO LO HAGAS! Definitivamente va a tener problemas si posteriormente se querrá agregar recursos en App.xaml (ver http://stackoverflow.com/questions/543414/wpf-app-xaml-file-does-not-get-parsed-if -my-app-does-not-set-a-startupuri) La respuesta aceptada no tiene tal inconveniente. – Lu55

+1

Lu55 - Puede agregar recursos al código App.xaml sin problemas. Todo depende de la cantidad de trabajo que quieras hacer. Mi comprensión de la pregunta original fue: cómo crear una vista y un modelo de vista con control total fuera del startupuri normal. Si quieres conectar todo a mano. Puedes hacerlo. Preocuparse por cada posible variación de uso es solo un problema de endeudamiento. – digitalMoto

Cuestiones relacionadas