我是WPF的新手。在我的应用程序中,当在主窗口中单击显示图表按钮时,我必须在弹出窗口中显示图表。当弹出窗口打开并显示时,用户应该能够更改主窗口中的值,以便图表自动更新。
问题是,如何在用户在主窗口中工作时显示弹出窗口。当弹出窗口打开时,Window.ShowDialog()将不允许在主窗口中工作。当我使用Window.Show()时,当焦点设置为mainwindow时,弹出窗口会转到后面并且不显示图表。
如何在弹出窗口显示内容时让用户在主窗口中工作。
提前致谢
答案 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();
}