,你可以窩在圖表中的彈出,而不是在一個窗口中,然後啓動它像這樣
<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線程方法的一個優點是您可以擁有第二個功能齊全的窗口,而不是彈出窗口。
這兩種方法的問題是,當你移動你的主窗口時,你的第二個窗口將不會隨之移動。這就是說,至少在第二個窗口方法中,第二個窗口與第一個窗口無關,比彈出方法更清晰。解決此問題的方法包括使用question中建議的adorner,或者在主窗口的一部分中放置「附加信息」,然後通過更改可見性來顯示/隱藏圖表等內容。
他想在第二個窗口中顯示一個圖表,但不能用'MessageBox'來實現。 – Gareth
我以消息框爲例,我沒有提供完整的解決方案 – stuicidle
我競爭這是多麼有用,因爲你只是在另一個線程上調用'show'方法。此外,這是關於'messagebox',這與op的問題無關。 爲了澄清,我還沒有嘗試過這一點,但由於WPF使用了一個主要的'ui線程',這樣做的最終結果可能只是稍微多一些開銷而沒有實際收益。 我甚至認爲這可能會導致運行時錯誤,因爲嘗試跨線程訪問 –