WPF проблема с ресурсы приложения и переопределением main

Статус: Offline
Реєстрація: 27.11.2008
Повідом.: 87
WPF проблема с ресурсы приложения и переопределением main

Проблема проявилась после определения ресурсов на уровне приложения. Итак дано:
-в файле App.xaml определяем ресурс приложения и удаляем StartupUri:
Код:
<Application x:Class="ResourcesAppTest.App"
             xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"             
             >
    <Application.Resources>
        <LinearGradientBrush x:Key="brushGradient" 
            StartPoint="0,0" 
            EndPoint="1,1">
            <LinearGradientBrush.GradientStops>
                <GradientStop Offset="0" Color="Black" />
                <GradientStop Offset="0.5" Color="Green" />
                <GradientStop Offset="1" Color="Gold" />
            </LinearGradientBrush.GradientStops>
        </LinearGradientBrush>
    </Application.Resources>
</Application>
-в свойствах App.xaml параметр BuildAction меняем на Page. Это необходимо для того чтобы в ручную прописать функцию Main.
-в файле App.xaml.cs прописываем функцию Main. В ручную ее прописываю так как в приложении необходимо авторизироваться, для этого я вызываю окно авторизации и если авторизация прошла успешно то далее уже вызываю основное окно.
Код:
namespace ResourcesAppTest
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {
        [STAThread]
        public static void Main()
        {
            App app = new App();
            app.InitializeComponent();

            LoginWindow log = new LoginWindow();
            log.ShowDialog();

            MainWindow mainWin = new MainWindow();
            mainWin.ShowDialog();
        } 
    }
}
LoginWindow - почти пустое окно которое при нажатии на кнопку OK возвращает DialogResult = true.
MainWindow - окно которое использует ресурсы уровня приложения.

В результате LoginWindow работает но mainWin.ShowDialog() выполняется какбуто асинхронно, т.е в дебагере реакции на mainWin.ShowDialog() никакой, т.е. продолжается выполнение функции Main и далее программа естественно завершается.

Возможно проблема сдесь даже и не в ресурсах приложения, т.к. если не вызывать log.ShowDialog тогда mainWin.ShowDialog работает.

Перед этим я не использовал ресурсы приложения и не делал
App app = new App();
app.InitializeComponent();
при этом все работало.
 
Оконное приложение может иметь только одно главное окно. В вашем случае это получается LoginWindow. Создавайте и отображайте LoginWindow из MainWindow.


Вот сдесь детально всё описано:
Тільки зареєстровані користувачі бачать весь контент у цьому розділі


Два момента. Первый:

The first Window to be instantiated in a standalone application becomes the main application window by default. This Window object is referenced by the Application.MainWindow property. The value of the MainWindow property can be changed programmatically if a different window than the first instantiated Window should be the main window.

Второй:

The life of an application ends when it is shut down, which can occur for the following reasons:
- A user closes every Window.
- A user closes the main Window.

Тоесть после строки

log.ShowDialog();

Приложение прекращает работу.
 
Останнє редагування:
Оконное приложение может иметь только одно главное окно. В вашем случае это получается LoginWindow. Создавайте и отображайте LoginWindow из MainWindow.


Вот сдесь детально всё описано:
Тільки зареєстровані користувачі бачать весь контент у цьому розділі


Тоесть после строки

log.ShowDialog();

Приложение прекращает работу.

Спасибо за ответ, но данный вопрос уже решил, и окна появляются одно за другим. Вот ссылка
Тільки зареєстровані користувачі бачать весь контент у цьому розділі
 
Последовательно можно показывать окна. Но в вашем случае LogonWindow будет изначально становиться как MainWindow у вашего еземпляра класса App. Если вас это устраивает.. то лучше конечно сделать через Startup event и ShutdownMode как предложили на stackoverflow.

void App_Startup(object sender, StartupEventArgs e)
{
ShutdownMode = ShutdownMode.OnExplicitShutdown;
// App.MainWindow = null
LoginWindow log = new LoginWindow();
// App.MainWindow = log
log.ShowDialog();
// App.MainWindow = null

ShutdownMode = ShutdownMode.OnLastWindowClose;
MainWindow mainWin = new MainWindow();
// App.MainWindow = mainWin
mainWin.Show();
}

Вот такая будет свистопляска с App.MainWindow.

Можно от неё избавиться если сразу создать mainWin = new MainWindow(). Но тогда теряется смысл всех этих действий..
 
Назад
Зверху Знизу