2009-08-26 27 views
3

winformアプリケーションの内部から起動しているWPFウィンドウがあります。私はそのWPFウィンドウの一度のインスタンスを一度に開くことができるようにしたいだけで、再度開くとそのユーザーに警告しません。一度に1つのWPFウィンドウしか開いていないことを確認するにはどうすればよいですか?

ウィンドウがwinformから起動されているため、WPFウィンドウが開いていることを検索しようとすると問題が発生します。私はnormalyやっていることはWinフォームを検索するとき、私はApplication.Current.OpenFormsに既存のものWinフォームのいずれかのインスタンスを検索し、WPFで私はApplication.Current.Windows

を検索するときに私が持っている問題は、内部から起動するときSystem.Windows.Application.CurrentがnullであるということですWPFウィンドウをそのように検索することはできません。開いているウィンドウの既存のインスタンスを検索する方法はありますか?

マイコード:

if (System.Windows.Application.Current != null) 
       { 
        foreach (System.Windows.Window win in System.Windows.Application.Current.Windows) 
        { 
         if (win is frmCaseWpf) 
         { 
          MessageBox.Show("You may have only one active case open at a time.", "Open Case", 
             MessageBoxButtons.OK, 
             MessageBoxIcon.Stop); 

          win.WindowState = System.Windows.WindowState.Normal; 
          win.Focus(); 
          win.Activate(); 
          return; 
         } 
        } 
       } 

答えて

4

静的アプリケーションオブジェクトを検索する代わりに、単一の静的変数を使用してウィンドウ内でこれを追跡することができます。あなたはどちらかの初期化ルーチンでは、ウィンドウを作成するとき

private static frmCaseWpf openWindow = null; // Assuming your class name is frmCaseWpf 

、またはOnLoaded、あなたはそれが仕事をしたいかに応じて、..::ちょうどウィンドウで変数を保つ

partial class frmCaseWpf { 
    public frmCaseWpf { 
     this.OnLoaded += frmCaseWpf_OnLoaded; 
    } 

    private void frmCaseWpf_OnLoaded(object sender, RoutedEventArgs e) 
    { 
     if (this.openWindow != null) 
     { 
       // Show message box, active this.openWindow, close this 
     } 
     this.openWindow = this; 
    } 
} 

あなたの場合このウィンドウを再利用できるようにするには、this.openWindow = nullを設定してください。あなたがウィンドウを閉じるときにも。

+0

'this.OpenWindow'は存在しません。代わりがありますか? – valsidalv

0

は、それは良いことfrmCaseWpfクラスsingletonになるだろう。あなたはできません別のインスタンスを作成

0

Windowインスタンスを検索しようとするのではなく、多くの人がセッション(またはシステム)のワイド「Mutex」または相互排他ロックを使用します。私はあなたのために書き直すつもりだったが、そのテクニックを実演している良いコードプロジェクトを見つけた。それは複雑ではなく、非常に簡単です。

http://www.codeproject.com/KB/cs/SingleInstanceAppMutex.aspx?msg=2908697

スニークピーク:このことができます

[STAThread] 
static void Main() 
{ 
    bool onlyInstance = false; 
    Mutex mutex = new Mutex(true, "UniqueApplicationName", out onlyInstance); 
    if (!onlyInstance) { 
     return; 
    } 
    Application.Run(new MainForm); 
    GC.KeepAlive(mutex); 
} 

希望。

(編集:もちろん、あなたの特定のユースケースのために、わずかにこれを変更する必要がありますが、それは一般的なアイデアをデモ)

+0

これはRussが求めていることではありません。彼は単一のインスタンスアプリケーションを作成しようとしていません。アプリケーションの特定のウィンドウを1回だけ表示することを望みます。 –

+0

urgh、right。私はそれを誤解した。それはどれくらい難しいですか?静的なフラグでそれを追跡してください。 – x0n

+0

@ x0n-だから私が選択した答えを選ぶ理由は、静的なフラグで追跡することで私の問題が解決されたからです。 私は決してそれをやったことがなかったので難しかったし、私のチームの誰もがかなり前に解雇されたので、もはや問題をはね返す人はあまりいない。 winformsとwpfの間の相互運用性に関するネット上の情報もたくさんありません。この特定のアプリケーションではかなり重いです。 – Russ

0

私は「正しい」プログラマは、しかし、私はこれを達成している本当にないです(ないリサイズ1から)WPFアプリケーションで次のように使用して:私はそれを開き、サブの外にウィンドウオブジェクトを作成していますので、基本的に

Dim wdwDetails As New detailsNew() 
Private Sub openNewDetails(ByVal recordID As String) 
    wdwDetails.Owner = Me 
    wdwDetails.recordID = recordID 
    wdwDetails.WindowStartupLocation = Windows.WindowStartupLocation.CenterOwner 
    wdwDetails.Show() 
End Sub 

、唯一の単一のウィンドウが存在します。 window open subへの新しい呼び出しでは、同じオブジェクトが使用されます。しかし、私はそれがトーマスが言及しているものだと思います。

私が言ったように、これがあなたを助けるかどうかはわかりません。

+0

明らかに私もVBではないC#です。 :) – TravisPUK

3

ここは私の役に立つものです。あなたは、新しいウィンドウを作成する前に

private About aboutWin; 
    private void AboutOpenClicked(object sender, RoutedEventArgs e) 
    { 
     if(aboutWin == null) 
     { 
      aboutWin = new About(); 
      aboutWin.Closed += (a, b) => aboutWin = null; 
      aboutWin.Show(); 
     } 
     else 
     { 

      aboutWin.Show(); 
     } 

    } 
0

あなたはウィンドウがロードされているかどうかを確認するためにXXXwindown.isLoadを使用することができます。私は、.NET 4.5を使用してい

if (!ChildWindow.IsLoaded) 
{ 
    childWindow= new ChildWindow(); 
    childWindow.Show(); 
} 
関連する問題