문제

WPF에서 첫 번째 응용 프로그램을 작성하고 있으며 사용자가 모달 대화 창에 일부 데이터를 입력하려고합니다. 부모 창이 완전히 활성화되어 있기 때문에 WPF에서는 간단하지 않습니다. 새 자식 창을 만든 방법은 멈추고 자식 창이 Close () 호출 될 때까지 기다리지 않습니다. 대신 그것은 계속 앞으로 나아갑니다. 이것은 내가 원하는 것이 아닙니다.

어린이 창을 열게하려면 어떻게 부모의 창이 계속 실행되기 전에 부모 창이 자녀가 닫히기를 기다리게 할 수 있습니까?

도움이 되었습니까?

해결책

당신은 당신의 창을 사용하여 창을 보여 주셨습니까? Showdialog 방법?

설정하는 것을 잊지 마십시오 소유자 재산 기본 창으로의 대화 창에서. 이것은 Alt+Tabbing 등의 이상한 행동을 피할 수 있습니다.

다른 팁

이러한 답변 중 많은 것이 단순하며 누군가 WPF를 시작한다면 누군가에게 "ins-and-outs"를 알지 못할 수도 있습니다. .ShowDialog()! ".하지만 그게 방법입니다 ( .Show()) 기본 창의 사용을 차단하고 모달 창이 닫힐 때까지 코드를 계속하는 것을 막기 위해 사용하려는 것입니다.

먼저 2 개의 WPF 창이 필요합니다. (하나는 다른 하나를 부를 것입니다.)

첫 번째 창에서 MainWindow.xaml이라고 불렀으며 코드-비만이라고 가정 해 봅시다.

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
}

그런 다음 XAML에 버튼을 추가하십시오.

<Button Name="btnOpenModal" Click="btnOpenModal_Click" Content="Open Modal" />

그리고 마우스 오른쪽 버튼을 클릭하십시오 Click 루틴, "정의로 이동"을 선택하십시오. mainwindow.xaml.cs에서 당신을 위해 그것을 만들 것입니다 :

private void btnOpenModal_Click(object sender, RoutedEventArgs e)
{
}

이 기능 내에서는 페이지 클래스를 사용하여 다른 페이지를 지정해야합니다. 다른 페이지를 "modalwindow"라는 이름을 지정하여 페이지 클래스가되어 인스턴스화하는 방법입니다.

private void btnOpenModal_Click(object sender, RoutedEventArgs e)
{
    ModalWindow modalWindow = new ModalWindow();
    modalWindow.ShowDialog();
}

모달 대화 상자에서 설정해야 할 값이 있다고 가정 해 봅시다. 텍스트 상자와 버튼을 만듭니다 ModalWindow XAML :

<StackPanel Orientation="Horizontal">
    <TextBox Name="txtSomeBox" />
    <Button Name="btnSaveData" Click="btnSaveData_Click" Content="Save" /> 
</StackPanel>

그런 다음 이벤트 핸들러를 만듭니다 (또 다른 Click 이벤트) 다시 사용하여 텍스트 상자 값을 공개 정적 변수에 저장합니다. ModalWindow 그리고 전화 this.Close().

public partial class ModalWindow : Window
{
    public static string myValue = String.Empty;        
    public ModalWindow()
    {
        InitializeComponent();
    }

    private void btnSaveData_Click(object sender, RoutedEventArgs e)
    {
        myValue = txtSomeBox.Text;
        this.Close();
    }
}

그런 다음, 당신의 후 .ShowDialog() 진술, 당신은 그 가치를 가져 와서 사용할 수 있습니다.

private void btnOpenModal_Click(object sender, RoutedEventArgs e)
{
    ModalWindow modalWindow = new ModalWindow();
    modalWindow.ShowDialog();

    string valueFromModalTextBox = ModalWindow.myValue;
}

Window.show Window에는 창이 표시되고 계속 실행됩니다. 비 블로킹 호출입니다.

Window.showDialog는 호출 스레드 (Kinda [1])를 차단하고 대화 상자를 표시합니다. 또한 부모/소유 창과의 상호 작용을 차단합니다. 대화 상자가 기각되면 (그 이유) showdialog는 발신자에게 돌아와서 Dialogresult에 액세스 할 수 있습니다 (원하는 경우).

1] 디스패처 프레임을 WPF Dipatcher에 밀어서 디스패처를 펌핑합니다. 이렇게하면 메시지 펌프가 계속 펌핑됩니다.

Window Object MyWindow가 주어지면 MyWindow.show ()는 Modelessly 및 MyWindow.showDialog ()가 모듈로 열립니다. 그러나 후자조차도 내가 기억하는 것에서 차단하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top