기본 창 앞에 대화 상자를 표시하는 WPF
메인 창 앞에 대화창(예: 로그인 / 옵션 등)을 표시하는 방법은 무엇입니까?
제가 시도한 것은 다음과 같습니다(분명히 한 번은 효과가 있었지만 이제는 그렇지 않습니다).
XAML:
<Application ...
Startup="Application_Startup">
응용 프로그램:
public partial class App : Application
{
private void Application_Startup(object sender, StartupEventArgs e)
{
Window1 myMainWindow = new Window1();
DialogWindow myDialogWindow = new DialogWindow();
myDialogWindow.ShowDialog();
}
}
결과: 먼저 myDialogWindow가 표시됩니다.창이 닫히면 Window1이 예상대로 표시됩니다.그러나 Window1을 닫으면 응용 프로그램이 전혀 닫히지 않습니다.
다음은 저에게 효과적인 전체 솔루션입니다.
App.xaml에서 다음을 제거합니다.StartupUri
내용물, 추가Startup
처리기:
<Application x:Class="MyNamespace.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Startup="ApplicationStart">
</Application>
App.xaml.cs 에서 핸들러를 다음과 같이 정의합니다.
public partial class App
{
private void ApplicationStart(object sender, StartupEventArgs e)
{
//Disable shutdown when the dialog closes
Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;
var dialog = new DialogWindow();
if (dialog.ShowDialog() == true)
{
var mainWindow = new MainWindow(dialog.Data);
//Re-enable normal shutdown mode.
Current.ShutdownMode = ShutdownMode.OnMainWindowClose;
Current.MainWindow = mainWindow;
mainWindow.Show();
}
else
{
MessageBox.Show("Unable to load data.", "Error", MessageBoxButton.OK);
Current.Shutdown(-1);
}
}
}
네, 죄송합니다. 여기 해결책이 있습니다.
제 원래 질문은 거의 효과가 있었습니다. 단 한 가지 추가해야 할 것은 애플리케이션 XAML에서 StartupUri를 제거한 후 Show to main 창을 추가하는 것입니다.
즉, 다음과 같습니다.
<Application x:Class="DialogBeforeMainWindow.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Startup="Application_Startup">
위에서 StartupUri가 제거되었습니다.
내 기본 창을 추가합니다.()도 표시:
public partial class App : Application
{
private void Application_Startup(object sender, StartupEventArgs e)
{
Window1 myMainWindow = new Window1();
DialogWindow myDialogWindow = new DialogWindow();
myDialogWindow.ShowDialog();
myMainWindow.Show();
}
}
WPF 세트App.Current.MainWindow
첫 번째 창이 열려 있습니다.보조 창 생성자에 대한 제어 권한이 있는 경우 다음과 같이 설정합니다.App.Current.MainWindow = Null
주 창이 생성되면, 그것은 다음에 할당될 것입니다.App.Current.MainWindow
아무런 개입 없이 예상대로의 재산.
public partial class TraceWindow : Window
{
public TraceWindow()
{
InitializeComponent();
if (App.Current.MainWindow == this)
{
App.Current.MainWindow = null;
}
}
}
액세스 권한이 없는 경우에도 설정할 수 있습니다.MainWindow
주 창의 생성자 내에 있습니다.
만약 당신이Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;
대화상자의 생성자에 추가합니다.
protected override void OnClosed(EventArgs e) {
base.OnClosed(e);
Application.Current.ShutdownMode = ShutdownMode.OnMainWindowClose;
}
대화 상자 클래스에 들어가면 응용 프로그램의 기본 동작을 변경할 걱정이 없습니다.시작 절차를 조정하지 않고 기존 앱에 로그인 화면을 스냅하고 싶을 때 유용합니다.
그래서 당신은 하나의 창을 보여주고 다른 창을 보여주고 싶지만, 그 창이 닫히면 앱을 종료하고 싶습니까?Shutdown Mode(종료 모드)를 OnMainWindowClose(OnMainWindowClose(온메인 윈도우 닫기)로 설정하고 메인 윈도우를 Window1(윈도우 1)로 설정해야 할 수도 있습니다.
Window1 myMainWindow = new Window1();
Application.Current.ShutdownMode = ShutdownMode.OnMainWindowClose;
Application.Current.MainWindow = myMainWindow;
DialogWindow myDialogWindow = new DialogWindow();
myDialogWindow.ShowDialog();
여기, 이렇게 하세요.이렇게 하면 실제로 기본 창이 변경되고 응용 프로그램 개체의 설정을 변경할 필요 없이 올바르게 작동합니다.
응용 프로그램 시작을 위한 이벤트 핸들러를 제거하고 app.xaml 파일에 StartupUri를 설정해야 합니다.
public partial class App : Application
{
bool init = false;
protected override void OnActivated(EventArgs e)
{
base.OnActivated(e);
if (!init)
{
this.MainWindow.Closing += new System.ComponentModel.CancelEventHandler(MainWindow_Closing);
init = true;
}
}
void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
Window toClose = this.MainWindow;
this.MainWindow = new Window2();
this.MainWindow.Show();
}
}
기본 창 앞에서 로그인 화면의 로그를 해제해야 할 때도 동일한 문제가 발생합니다.
주 창에 이 줄을 추가합니다.
Application.Current.MainWindow = this; Application.Current.ShutdownMode = ShutdownMode.OnMainWindowClose;
기본 창을 해결하거나 그냥 호출
var mainWindow = new MainWindow()
loginScreen을 호출합니다.화면을 표시()하거나 로그인합니다.대화 상자 표시()
언급URL : https://stackoverflow.com/questions/1539958/wpf-showing-dialog-before-main-window
'programing' 카테고리의 다른 글
새 파일이 없는 경우 파일에 쓰고 파일이 있는 경우 파일에 추가 (0) | 2023.05.24 |
---|---|
루비에서 숫자 배열을 합치는 방법은 무엇입니까? (0) | 2023.05.24 |
VB.NET에서 문자열 배열 선언 및 초기화 (0) | 2023.05.19 |
항목() 대신 반복 항목()을 사용해야 하는 경우는 언제입니까? (0) | 2023.05.19 |
복제 세트 몽고 도커-구성 (0) | 2023.05.19 |