当弹出窗口打开时,WPF打开弹出窗口并在主窗口上工作

时间:2017-06-20 09:39:03

标签: c# wpf

我是WPF的新手。在我的应用程序中,当在主窗口中单击显示图表按钮时,我必须在弹出窗口中显示图表。当弹出窗口打开并显示时,用户应该能够更改主窗口中的值,以便图表自动更新。

问题是,如何在用户在主窗口中工作时显示弹出窗口。当弹出窗口打开时,Window.ShowDialog()将不允许在主窗口中工作。当我使用Window.Show()时,当焦点设置为mainwindow时,弹出窗口会转到后面并且不显示图表。

如何在弹出窗口显示内容时让用户在主窗口中工作。

提前致谢

3 个答案:

答案 0 :(得分:2)

不应该使用Window.ShowDialog()打开弹出窗口,因为这会使其成为模态(并且在关闭之前您将无法返回主窗口。)

如果您使用Window.Show()打开弹出窗口,则可以通过将TopMost设置为true来告诉弹出窗口保持最佳状态。

var popup = new PopupWindow();
popup.Show();
popup.TopMost = true;

您甚至可以通过在该窗口调用.Activate()将焦点拉回主窗口。

答案 1 :(得分:1)

您可以将图表嵌套在Popup而不是Window中,然后像这样启动它

<Button x:Name="button" Click="button_Click"/>
<Popup x:Name="popup" StaysOpen="true">
    <TextBlock Text="Clicked"/>
</Popup>

private void button_Click(object sender, RoutedEventArgs e)
{
    if (!popup.IsOpen) popup.IsOpen = true; // Open it if it's not open
    else popup.IsOpen = false; // Close it if it's open
}

article描述了您的更多选择。

或者,您可以尝试在单独的UI线程中启动Windows,如article所示。像这样的东西

<Button x:Name="button" Click="button_Click"/>

private void button_click(object sender, RoutedEventArgs e)
{
    Thread thread = new Thread(() =>
    {
        MyWindow w = new MyWindow();
        w.Show();

        w.Closed += (sender2, e2) =>
        w.Dispatcher.InvokeShutdown();

        System.Windows.Threading.Dispatcher.Run();
    });

    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();
}

弹出方法的优点是它更简单。多UI线程方法的一个优点是,您可以拥有第二个功能完备的窗口,而不是弹出窗口。

这两种方法的问题在于,当您移动主窗口时,第二个窗口不会随之移动。话虽这么说,至少在第二个窗口的方法中,你的第二个窗口是独立于你的第一个窗口,而不是弹出方法。此问题的解决方案包括使用此adorner中建议的question或将主窗口的一部分留作“附加信息”,然后您可以通过更改可见性来显示/隐藏图表等内容

答案 2 :(得分:0)

如果您在单独的线程上显示弹出窗口,它将不会阻止阻止您的主窗口,例如

public void MessageBoxShow(string Message)
{
    Thread errorMessageThread = new Thread(() =>
    {
        MessageBox.Show(Message);
    });
    errorMessageThread.IsBackground = true;
    errorMessageThread.Start();
}