2017-06-20 3 views
0

WPFが新しくなった。私のアプリケーションでは、メインウィンドウでショーチャートボタンをクリックすると、ポップアップウィンドウにグラフを表示する必要があります。ポップアップが開いて表示されている間、ユーザーはメインウィンドウの値を変更できるので、グラフが自動的に更新されます。WPFがポップアップウィンドウを開いてポップアップが開いている間にメインウィンドウで作業する

問題は、ユーザーがメインウィンドウで作業中にポップアップを表示する方法です。 Window.ShowDialog()は、ポップアップが開いている間、メインウィンドウでは動作しません。 Window.Show()を使用すると、フォーカスがメインウィンドウに設定されていると、ポップアップが背面に移動し、チャートが表示されません。

ポップアップがコンテンツを表示しているときにメインウィンドウで作業する方法を教えてください。事前に

おかげ

答えて

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

彼は2番目のウィンドウにグラフを表示したいので、 '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は、あなたのオプションの多くを説明しています。

また、articleのように別のUIスレッドでWindowsを起動してみることもできます。このようなもの

<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スレッドアプローチの利点の1つは、ポップアップではなく完全に機能する第2のウィンドウを持つことができることです。

両方の方法の問題は、メインウィンドウを移動すると、2つ目のウィンドウが移動しないことです。これは、少なくとも2番目のウィンドウのアプローチでは、2番目のウィンドウがポップアップのアプローチよりも最初のウィンドウから独立していることが明確になります。この問題を解決するには、questionadornerを使用するか、メインウィンドウの一部を「追加情報」として設定し、可視性を変更してグラフのようなものを表示/非表示にすることができます。

+0

ポップアップの切り替えにはエラーがあります;) 'popup.IsOpen =!popup.IsOpen;'のように簡単に書くこともできます。 –

+0

スレッドの例は、このようなものではかなり複雑で、(OPは最初のUIスレッドからポップアップの内容を更新したいので追加された複雑さのために)一番良いものです。 xamlの実際の 'Popup'。 –

+0

@TimothyGroote popup.IsOpen =!popup.IsOpen;を行うことができます。しかし、私はそれが少し微妙であり、見逃されるかもしれないと思った。私は同意する、ポップアップは、ほとんどの場合、この場合のより良い解決策は、私はちょうど私が代替案を提示すると思った。 – Gareth

関連する問題