Проблемы при запуске приложения WPF - PullRequest
5 голосов
/ 20 мая 2010

Мой мозг по всей карте сейчас пытается полностью понять Единство. Поэтому я решил просто погрузиться и начать добавлять его в ветку, чтобы посмотреть, куда он меня приведет. Как ни странно (а может и нет), я застрял, просто пытаясь загрузить свое чертово приложение.

Кажется, что правильный способ сделать это - переопределить OnStartup в App.cs. Я удалил свой StartupUri из App.xaml, чтобы он не создавал мой графический интерфейс XAML. Мой App.cs теперь выглядит примерно так:

public partial class App : Application
{
    private IUnityContainer container { get; set; }

    protected override void OnStartup(StartupEventArgs e)
    {
        container = new UnityContainer();
        GUI gui = new GUI();
        gui.Show();
    }

    protected override void OnExit(ExitEventArgs e)
    {
        container.Dispose();
        base.OnExit(e);
    }
}

Проблема в том, что при запуске приложения ничего не происходит! Я ставлю точку останова в назначении container, и она никогда не попадает в цель.

Чего мне не хватает? В настоящее время для App.xaml установлено значение ApplicationDefinition, но я ожидаю, что это сработает, потому что какой-то пример кода Unity + WPF, который я смотрю ( из Codeplex ), делает то же самое, за исключением того, что он работает!

Я также запустил приложение с одного шага, и в итоге оно попало на первую строчку в App.xaml. Когда я вхожу в эту строку, тогда приложение просто начинает работать, но я ничего не вижу (и моя точка останова не достигнута). Если я сделаю то же самое в примере приложения, то, войдя в App.xaml, вы попадете прямо в OnStartup, что я и ожидал. Argh!

Я также только что создал новое приложение WPF с нуля, удалил StartupUri, переопределил OnStartup (), и это также работает. WTH?

Плохо ли просто помещать конструкцию Unity в обработчик событий Window_Loaded моего графического интерфейса? Действительно ли должно быть на уровне приложения?

Ответы [ 4 ]

4 голосов
/ 20 мая 2010

Дважды проверьте, что x: Class в App.xaml в том же пространстве имен / классе, что и в вашем App.xaml.cs. Легко скопировать / вставить из другого проекта и забыть изменить это.

Если по какой-либо причине вам не удается решить эту проблему, удалите App.xaml и добавьте Main(), что делает new App().Run(). Если это тоже не сработает, то здесь что-то действительно странное.

1 голос
/ 07 ноября 2013

В моем случае я попал в " что-то действительно странное ", на которое ссылался Жюльен Лебосквейн.

Я продолжал проверять и перепроверять имена, пространства имен, обработчики событий и т. Д. И не видел ничего плохого, но мой WPF MainWindow.xaml продолжал открываться первым, минуя требуемый метод запуска.

В конце концов, я удалил MainWindow.xaml ... но все равно сначала он появился. В этот момент я очистил решение, удалил двоичные файлы с диска (после изменения загрузочного проекта), закрыл и снова открыл решение.

Это «исправило» мою проблему.

1 голос
/ 20 мая 2010

Ваша проблема, похоже, вообще не связана с Unity ... Убедитесь, что:

  • объект запуска имеет значение YourProject.App (на странице свойств проекта)
  • действие сборки для App.xaml установлено в "ApplicationDefinition"

В противном случае, я не вижу причин, почему это не должно работать ...


Обновление: просто еще одна идея ... Попробуйте установить StartupUri обратно в App.xaml и вызвать базовую реализацию в OnStartup:

protected override void OnStartup(StartupEventArgs e)
{
    container = new UnityContainer();
    base.OnStartup(e);
}
0 голосов
/ 07 апреля 2017

У меня была похожая проблема - конструктор моего приложения и OnStartup не вызывались (точки прерывания не были достигнуты).В случае, если кто-то еще сталкивается с этим потоком, вот еще одна вещь, которая может пойти не так.

У меня есть решение с несколькими приложениями, одно из которых - просто утилита, которую я использую для управления некоторыми файлами XML.Он мало привык, так что я об этом забыл.Первоначально мои сборки были для «Любого процессора», но недавно мне пришлось изменить их на «x86» из-за библиотеки, которую я использовал.Сегодня мне нужно было запустить эту утилиту, но она зависала, и в отладчике ничего не вызывалось в классе App.После проверки пространств имен (которые были в порядке), я решил очистить проект (как предложено выше).Когда я попытался запустить приложение, я получил ошибку, что VS не может найти EXE.По-видимому, VS запускал старый EXE-файл «Any CPU», который он обнаружил в выходном каталоге, который падал, а затем был удален, когда я очистил проект.Я проверил Build |Configuration Manager, и, конечно же, я не выбрал служебное приложение для сборки "x86".Как только я добавил это, все работало отлично.Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...