Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
-12 / 24 / 4
Регистрация: 22.06.2020
Сообщений: 376

Как далее поднять MainWindow?

26.01.2025, 13:32. Показов 3900. Ответов 47
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем,


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
try
{
    if()
     {
      //код
     }
    else()
    {
     // MesageBox.Show("не работает")
    }
 
}
catch
{
 
 
}
MainWindow далее подымается, если закомментировать messagebox. Если оставить ничего не открывается.

Как получить и сообщение и после того как его квитируешь получить и MainWindow?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.01.2025, 13:32
Ответы с готовыми решениями:

Связать переменные из mainwindow.h и mainwindow.cpp
Здравствуйте! Подскажите, пожалуйста: В файле mainwindow.cpp есть некоторая переменная state (переменная состояния), которой...

undefined reference to `mainwindow::~mainwindow()'
Не понимаю из-за чего ошибка mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include...

Invalid use of 'Ui::MainWindow::MainWindow
Доброго времени суток, не получается создать обработчик для пунктов меню созданного в дизайнере выдает ошибку: mainwindow.cpp:13: ошибка:...

47
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
26.01.2025, 21:35
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Wolfdp Посмотреть сообщение
в идеале стоит избегать таких подходов.
Мммм... а почему?
Нарочно не заключаю в тег [OFF], т.к. кажется что все же это "по теме", хоть и в чужой теме.

Иными словами - почему не может такой идеи существовать? Ну мы же делаем, не знаю, множество окон, вызываемых из "главного", причем все они со своими VM-мами, моделями, то да се... В случае многооконного приложения.
А здесь, перед вызовом "основного" окна - главным пусть пока будет окно авторизации. Если пользователь его прошел - главное окно станет теперь другое (всего лишь пара строчек в коде). Первое закрылось, второе показалось.

Ну, т.е. я как бы не вижу в этом проблемы. Тут всего лишь вызов и подмена того или иного окна, причем в самом начале практически (в App). Или, может, вы знаете о каких-то подводных камнях такого подхода?
0
Эксперт .NET
 Аватар для Rius
13846 / 7889 / 1706
Регистрация: 25.05.2015
Сообщений: 23,954
Записей в блоге: 14
26.01.2025, 21:39
Камни - смена (пересоздание) главного окна, провал главного или дочерних окон на задний план. Это не значит, что делать так нельзя.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
26.01.2025, 21:43
Цитата Сообщение от Rius Посмотреть сообщение
Камни - смена (пересоздание) главного окна, провал главного или дочерних окон на задний план.
Ну ведь в описываемом случае такого нет. Просто создается основное окно, если в первом все сделано как надо. А если не как надо, то зачем что-то вообще создавать?
0
Эксперт .NET
 Аватар для Rius
13846 / 7889 / 1706
Регистрация: 25.05.2015
Сообщений: 23,954
Записей в блоге: 14
26.01.2025, 21:43
Вроде бы, чего такого в открытии нового окна?
А если у юзера многомониторная конфигурация?.. Он окно перетащил на 3 монитор, ввёл данные, а новое окно открылось снова на первом, да ещё под сотней других окон.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
26.01.2025, 22:02
Rius, я просто логически, для понимания так сказать. Если это какой-то "паттерн" и этого требует, то понятно. Но скорее всего это должно чем-то объясняться тогда..

Добавлено через 4 минуты
Цитата Сообщение от Rius Посмотреть сообщение
Он окно перетащил на 3 монитор, ввёл данные,
А, ну это конечно уже частный случай. Если так судить, то сама виндовс в этом плане еще какая кривая - она тупо запоминает на каком мониторе закрыли окно, затем выводит окно UAC на том же мониторе, но приложение запускает на основном (если он включен). Т.е. эта фишка присуще многим приложухам, если с этим специально не бороться...

Добавлено через 13 минут
С мониторами как-бы не очень убедительно, тем более, что в моем случае первое окно не перетаскиваемое, а второе появится там же, где было первое.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
26.01.2025, 22:35
wizard41,
Я про общий подход, а не только текущий пример. В App может выполняться куча кода, скрытого под каким-нибудь InitialContainer где кто-то неосторожно закеширует главное окно (например через замыкание) и дальше ловиш неприятные баги. Элементарное window = Application.Current.MainWindow в каком-нибудь callback, и выловишь не сразу.

Ещё может появится желание приравнять Close главного окна к завершению приложения. Это как бы ошибка в самом подходе, но вылавливается такое тоже плохо.

Ну и в целом удобно что у тебя MainWindow -- синглтон. Обращаясь к нему всегда знаешь к чему кастануть, что он умеет и т.д. А с кучей окон это нужно накидывать интерфейсы и следить чтобы все их наследовали... не знаю, выглядит менее надёжно и удобно. Ну и можно позволить себе не париться с тем что это окно нужно постоянно откуда-то получать, а один раз вытянул и запомнил.

На всякий, я там писал "если заказчик требует говнокодить". То что будет использоваться многооконная архитектура -- не говнокод. Это просто менее надежный и удобный вариант (на мой взгляд). И чем проще приложение, тем менее критично будет то, что кто-то заменяет MainWindow в процессе. Скорее всего это можно будет ощутить только на каком-то реально крупном проекте с кучей народа и задач.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
26.01.2025, 23:12
Wolfdp, так то оно так... Но, похоже здесь описываются события, которые должны происходить уже после появления "настоящего" главного окна.
Я же про случай, когда его еще нет в природе, т.о. никому не на что ссылаться.

Наверное, сумбур вызвало нечеткое определение главного окна. На самом деле, первое окно совсем не обязательно должно быть MainWindow. А обычный диалог.
Студии под рукой нет, попробую импровизировать пример прямо тут (могут быть неточности):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//у нас есть некоторая коллекция сервисов
var services = new ServiceCollection();
//куда входит основная вьюшка
services.AddSingleton<MainWindowViewModel>();
 
//сюда же синглтон главного окна
services.AddSingleton(s =>
{
var model = s.GetRequiredService<MainWindowViewModel>();
var window = new MainWindow {DataContext = model};
return window;
});
 
//ну и там что-то еще...
 
//далее, переопределяем OnStartup, но вызываем не главное (основное) окно, а какое-то первое
protected override OnStartup()
{
 base.OnStartup();
 authModel = new AuthViewModel();
authModel.OnSigned += OnSigned; // здесь подписываемся на некоторое событие, по которому и произойдет создание главного окна
 _authWindow = new AuthWindow {DataContext=authModel};
_authWindow.ShowDialog();
}
 
//ну и здесь же в App этот метод, если мы туда попадаем:
void OnSigned()
{
MainWindow = Services.GetRequredService<MainWindow>();
MainWindow.Show();
 authModel.OnSigned -= OnSigned;
 _authWindow.Close();
}
То есть по сути, у нас никакого MainWindow еще нет, пока мы не вызовем его из диалога, в случае успешной авторизации. На этот же момент не существует ничего, что могло бы ссылаться на это главное окно.
Формально, пользователь может просто закрыть этот диалог (если он устал подбирать пароль) и все на этом и закончится не начавшись... )
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
28.01.2025, 14:13
Кхм.. в продолжение темы:
собственно, вот "простецкий" пример затеи с двумя окнами > второе запускается из первого, причем они не взаимосвязаны.
Без сервисов и без всего такого.

Предположим, первичное окно для входа такое:
XAML

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<Window x:Class="WpfApp1.Views.LoginView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"
        xmlns:components="clr-namespace:WpfApp1.Components"
        Title="Login View" Height="100" Width="250" ResizeMode="NoResize" WindowStartupLocation="CenterScreen">
 
    <Grid>
        <Grid VerticalAlignment="Center" Height="32">
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            <Button Content="Log In" FontWeight="DemiBold" Margin="2 2 1 2" Command="{Binding LoginCommand}"/>
            <Button Grid.Column="1" Content="Discard" Margin="1 2 2 2"
                    components:CloseOnClickBehaviour.IsEnabled="True"/>
        </Grid>
    </Grid>
</Window>

главное окно:
XAML
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<Window x:Class="WpfApp1.Views.MainView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"
        Title="Main View" Height="200" Width="350" ResizeMode="CanMinimize" WindowStartupLocation="CenterScreen">
 
    <Grid>
        <TextBlock Text="{Binding Text, FallbackValue=SomeText}" 
                   VerticalAlignment="Center" 
                   HorizontalAlignment="Center"
                   FontSize="24"/>
    </Grid>
</Window>

VM окна логина:
C#
1
2
3
4
5
6
7
8
9
10
using WpfApp1.Components;
namespace WpfApp1.ViewModels;
 
internal class LoginViewModel
{
    public Action? OnLogging;
 
    public RelayCommand LoginCommand =>
        new(_ => OnLogging?.Invoke());
}
VM основного окна:
C#
1
2
3
4
5
6
namespace WpfApp1.ViewModels;
 
internal class MainViewModel
{
    public string Text => "Главное окно";
}
Вся заварушка в классе App:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using System.Windows;
using WpfApp1.ViewModels;
using WpfApp1.Views;
 
namespace WpfApp1;
 
public partial class App : Application
{
    private LoginView? _loginView;
    private LoginViewModel? _loginViewModel;
 
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
 
        _loginViewModel = new LoginViewModel();
        _loginViewModel.OnLogging += OnLogging;
        _loginView = new LoginView { DataContext = _loginViewModel };
        _loginView.Closing += (s, _) => _loginViewModel = null;
        _loginView.Show();
    }
        
    private void OnLogging()
    {
        var mainwindow = new MainView { DataContext = new MainViewModel() };
        mainwindow.Show();
        _loginView?.Close();
    }
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.01.2025, 14:13

Расположить элементы массива так, чтобы первыми шли положительные элементы, далее - отрицательные, далее - нули
В заданном целочисленном вектореАп расположить элементы так, чтобы первыми шли положительные элементы, далее - отрицательные, далее - нули,...

Как закрыть окно MainWindow?
Здравствуйте У меня возникла следующая проблема: Не могу нормально удалить окно MainWindow. Функция close() вообще ничего ни...

Как убрать рамки в MainWindow
Добрый день! Появился простой, может быть, вопрос у зеленого в Qt: как убрать рамки около краев MainWindow? На скрине все видно

Как в WPF в MainWindow отключить ALT + F4?
Как в WPF в MainWindow отключить ALT + F4?

Как закрыть программу из конструктора mainwindow?
Как закрыть программу из конструктора mainwindow?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
48
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru