2017-06-20 189 views
0

我是WPF的新手。在我的應用程序中,當主窗口中單擊顯示圖表按鈕時,我必須在彈出窗口中顯示圖表。當彈出窗口打開並顯示時,用戶應能夠更改主窗口中的值,以便圖表自動更新。WPF打開彈出窗口並在彈出窗口打開時在主窗口上工作

問題是,如何在用戶在主窗口中工作時顯示彈出窗口。當彈出窗口打開時,Window.ShowDialog()將不允許在主窗口中工作。而當我使用Window.Show()時,當焦點被設置爲mainwindow時,彈出窗口轉到後面,圖表不顯示。

如何在彈出窗口顯示內容時使用戶能夠在主窗口中工作。

在此先感謝

回答

2

彈出不應與Window.ShowDialog()打開,因爲這將使它莫代爾(直到被關閉,你將無法返回到主窗口。)

如果您打開彈出窗口Window.Show(),您可以通過將TopMost設置爲true來告訴彈出窗口保持最佳狀態。

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

你甚至可以通過事後該窗口上調用.Activate()回拉將焦點轉移到主窗口。

0

如果您在單獨的線程上顯示彈出窗口,它不會停止阻止您的主窗口,例如

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

他想在第二個窗口中顯示一個圖表,但不能用'MessageBox'來實現。 – Gareth

+0

我以消息框爲例,我沒有提供完整的解決方案 – stuicidle

+0

我競爭這是多麼有用,因爲你只是在另一個線程上調用'show'方法。此外,這是關於'messagebox',這與op的問題無關。 爲了澄清,我還沒有嘗試過這一點,但由於WPF使用了一個主要的'ui線程',這樣做的最終結果可能只是稍微多一些開銷而沒有實際收益。 我甚至認爲這可能會導致運行時錯誤,因爲嘗試跨線程訪問 –

1

,你可以窩在圖表中的彈出,而不是在一個窗口中,然後啓動它像這樣

<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,或者在主窗口的一部分中放置「附加信息」,然後通過更改可見性來顯示/隱藏圖表等內容。

+0

切換彈出窗口包含一個錯誤;)你也可以簡單地寫成'popup.IsOpen =!popup.IsOpen;'。 –

+0

雖然我認爲線程示例對於這樣的事情是相當複雜的,並且最好單獨留置(由於增加了複雜性,因爲OP想從第一個UI線程更新其彈出窗口的內容),所以我同意使用在xaml中實際的'Popup'。 –

+0

@TimothyGroote我知道你可以做popup.IsOpen =!popup.IsOpen;但我認爲這可能有點微妙並且被遺漏。我同意,在這種情況下,彈出窗口幾乎可以肯定是更好的解決方案,我只是認爲我會提供一個替代方案。 – Gareth