Существует ли способ запустить приложение WPF без StartUpUri, который не повреждает что-то еще?

Я пытался в течение многих часов перейти к сути дела, где я могу запустить приложение WPF и иметь полный контроль. Я хочу смочь создать ViewModel, создать Представление (Окно), установить контекст данных Представления, чтобы быть ViewModel, затем показать Представление.

Я попробовал много методов, самое многообещающее существо для изменения App.xaml, чтобы быть страницей и затем добавлением моего собственного Основного метода. К сожалению, это не работает правильно, потому что VS2010 затем не показывает стили от App.xaml в разработчике, хотя они действительно работают при запущении приложения.

Существует ли способ сделать то, что я хочу? В противном случае, как люди обычно запускают приложения MVVM в WPF, создавая ViewModel за пределами самого Представления?

22
задан Bill Jeeves 9 August 2010 в 10:57
поделиться

3 ответа

Я бы использовал событие Startup. Вы можете добавить это в App.xaml и удалить строку StartupUri. Когда вы добавите его, Visual Studio может создать для вас событие в файле App.xaml.cs. Вы можете инициализировать вашу ViewModel и View внутри.

25
ответ дан 29 November 2019 в 04:12
поделиться

Самый простой способ назначить экземпляр ViewModel контексту данных представления - это использовать код за окном.

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

        DataContext = new myViewModel();
    }
}

Что касается первой части вашего вопроса, вы можете указать элемент управления вашего приложения в событии 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>

Code Behind:

public partial class App : Application
{
    private void Application_Startup(object sender, StartupEventArgs e)
    {
        // Place your code here
    }
}
1
ответ дан 29 November 2019 в 04:12
поделиться

в нашем приложении мы выбрали способ, который вы уже предложили: написать новый метод Main. Также необходимо внести некоторые изменения в настройки приложения проекта (отсутствие объекта startup). Приложение xaml должно выглядеть примерно так:

<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>

Код за ним будет выглядеть примерно так:

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;
    }
}

Посмотрите на событие Startup Event и обратите внимание, что в App.xaml не указан StartupUri по умолчанию

Вы также можете передать DataContext в новый конструктор вашего MainWindow, или создать DataContext прямо в xaml.

2
ответ дан 29 November 2019 в 04:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: