Application.LoadComponent заставляет приложение зависать при завершении работы - PullRequest
3 голосов
/ 13 октября 2010

Если я использую Application.LoadComponent() для загрузки UserControl, Page или Window, мое приложение зависает при попытке закрыть его.

Приложение, очевидно, закрывается, но процесс продолжает работать. Легко заметить при отладке.

Я тестировал его под Windows 7 64-битной и Vista 32-битной. В обоих случаях я использовал VS2008 и .NET 3.5.

Репро можно построить, создав приложение wpf следующим образом:


    public partial class Window1 : Window {
        public Window1() {
            InitializeComponent();
        }
        public void LoadCopy() {
            var uri = new Uri("/WpfApplication1;component/window1.xaml", UriKind.Relative);
            var copy = (Window)Application.LoadComponent(uri);
            MessageBox.Show(copy.Title);
        }
        private void Button_Click(object sender, EventArgs e) {
            LoadCopy();
        }
    }

Кто-нибудь знает, что может происходить? И как это решить?

Ответы [ 3 ]

1 голос
/ 19 октября 2010

Попробуйте назначить владельца созданной сборке, т.е.

copy.Owner = this;

После этого я смог закрыть ваш пример.

1 голос
/ 19 октября 2010

Я думаю, это потому, что вы вызываете LoadComponent () для того, что также является вашим главным окном (http://msdn.microsoft.com/en-us/library/system.windows.application.mainwindow.aspx), то есть для запуска uri, в вашем случае Window1.Программа, вероятно, входит в какой-то цикл, когда вы закрываете его, потому что закрытие главного окна по умолчанию закрывает приложение, и ваши два экземпляра Window1 ждут друг друга (AKA тупик)!Хотя, по-видимому, только после того, как приложение стало невидимым (таким образом, оно, кажется, закрылось).

Если вам все еще нужно использовать функцию LoadComponent () в Window1, я думаю, вам не нужно делать это при запуске, изменив StartupUriвашего приложения:

<Application
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 StartupUri="Window1.xaml"> <!-- change this -->
</Application>

Или измените Application.ShutdownMode (http://msdn.microsoft.com/en-us/library/system.windows.application.shutdownmode.aspx) на OnLastWindowClose:

<Application
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 StartupUri="Window1.xaml"
 ShutdownMode="OnLastWindowClose">
</Application>
0 голосов
/ 18 октября 2010

Я собрал ваше приложение на Windows 7 32bit под .Net 4.0 и 3.5.Я отлично работаю для меня.Я думаю, что ваша проблема зависит от конфигурации.Какая конфигурация у вас есть?Вы ссылаетесь на какие-либо сборки, кроме ссылок на проекты WPF по умолчанию?

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