programacion - wpf c# mvvm
¿Hay una manera de iniciar una aplicación WPF sin StartUpUri que no rompa otra cosa? (4)
Aquí hay una manera simple ...
<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í está la aplicación básica.xaml.cs
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. La primera ventana mostrada se asignará automáticamente a MainWindow. Por supuesto, puede omitir la creación de su mainView
y escribir directamente en la MainWindow
que también reduciría la sintaxis.
MainWindow = new MainView();
MainWindow.Show();
MainWindow.DataContext = new MainViewModel();
Una nota final, estoy haciendo el Show
antes del enlace de datos. MainViewModel
hacer esto para evitar una situación en la que MainViewModel
lance una excepción durante la creación. Si no se muestra la vista principal, la aplicación se cerrará sin permitirle ver el error.
He intentado durante horas llegar al punto en el que puedo iniciar una aplicación WPF y tener el control total. Quiero poder crear un ViewModel, crear una Vista (Ventana), configurar el contexto de datos de la Vista para que sea el ViewModel, luego mostrar la Vista.
He probado muchos métodos, el más prometedor es cambiar el App.xaml para que sea una página y luego agregar mi propio método Main. Desafortunadamente, esto no funciona correctamente porque VS2010 no muestra los estilos de App.xaml en el diseñador, aunque sí funcionan cuando se ejecuta la aplicación.
¿Hay alguna manera de hacer lo que quiero? De lo contrario, ¿cómo suele la gente iniciar aplicaciones MVVM en WPF, creando un ViewModel fuera de la propia Vista?
En nuestra aplicación, hemos elegido la forma en que ya propuso: escribir un nuevo método Main. También debe realizar algunos cambios en la configuración de la aplicación del proyecto (sin objeto de inicio). La aplicación xaml tiene que verse algo así:
<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;
}
}
Eche un vistazo al evento de inicio y observe que no se especifica StartupUri predeterminado en App.xaml
También puede pasar el DataContext en un nuevo constructor de su MainWindow, o crear el DataContext directamente en xaml.
La forma más sencilla 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, puede tener el control de su aplicación en el evento StartUp
<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 detrás :
public partial class App : Application
{
private void Application_Startup(object sender, StartupEventArgs e)
{
// Place your code here
}
}
Yo 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 por usted dentro del archivo App.xaml.cs. Puede inicializar su ViewModel y View dentro.