2017-07-17 10 views
0

私はC#でポップアップウィンドウを作成しました。ボタンがあり、ユーザーがボタンをクリックするとウィンドウがポップアップします。私の問題は、ユーザーがボタンを複数回クリックした場合、ウィンドウが複数回開かれることです。ユーザーがウィンドウを開くと、ユーザーがボタンをクリックしたときにウィンドウを再び開くことはしません。達成することは可能ですか?ウィンドウを作るマイウィンドウが複数回開かれないようにする

は次のようにポップアップ表示:私はWPFを使用しています

PopUp myPopUp = new PopUp(); 
myPopUp.show(); 

+3

あなたが使っているものをGUI APIを教えます。明らかな答えは、ウィンドウがすでに開いているかどうかを追跡する変数を保持し、再びオープンしないことです。その変数は単にウィンドウへの参照であっても簡単に起動できます。私はあなたが尋ねたい質問は既にStack Overflowで答えられていると確信していますが、あなたが投稿した質問はあまりにも曖昧で、重複する質問が正しいかどうかを知ることさえできません。 –

+0

私はインターネットを検索し、私の質問に対する答えを見つけることができませんでした。私はこれに新しいので、私の質問が曖昧だった場合はごめんなさい、私はこれを私の将来の質問で考えるでしょう – Anna

+0

また、あなたは、最初にボタンを無効にすることができますポップアップ。 –

答えて

5

ユーザーは、ポップアップが、私がポップアップするとnullにその参照を設定してポップアップを閉じるの参照を保持するクラスのメンバを、作成し開いた後に、メインウィンドウにアクセスする必要がある場合:

PopPp myPopUp = null; 

private void OpenPopUp() 
{ 
    if(myPopUp == null) 
    { 
     myPopUp = new PopUp(); 
     myPopUp.Closed += (x,y) => { myPopUp = null; }; 
     myPopUp.Show(); 
    } 
} 

場合ユーザーはメインウィンドウと対話する必要はありませんが、ポップアップが開かれている間はShowDialogを使用してください。これは、ポップアップが閉じられるまで、メインウィンドウに任意の入力を防ぐことができます:あなたも困っていません

PopUp myPopUp = new PopUp(); 
myPopUp.ShowDialog(); 
+0

私はwpfを使用しています。フォームではないので、最初の例がうまくいくかどうかはわかりません。 – Anna

+0

私はWPFで作業するために私の答えを編集しました。質問をするときには常に、タグとして使用するUIフレームワークを含める必要があります。 –

+0

ありがとう!できます。私は私の将来の質問を書くときにそれを考えるでしょう。私がこれを書いていたとき、私は速すぎたと思います。 – Anna

2

Showの代わりにShowDialogを使用することをお勧めします。ユーザーは、ボタンをもう一度クリックするためにポップアップを閉じる必要があります。そのコードは次のようになります。

PopUp myPopUp = new PopUp(); 
myPopUp.ShowDialog(); 

さもないと、あなたはボタンが戻って有効にする必要がある点を見つける必要があり、この場合にbuttonName.Enabled = !buttonName.Enabled;を使用して最初のクリック後、ボタンを無効にする必要があります。

+0

ありがとう! ShowDialogを使用して私の問題を解決:)私はあなたの助けに感謝! – Anna

+0

しかし、今私は私のメインウィンドウと対話することはできません。@ un-lucky – Anna

+0

@Anna簡単な言葉で:ShowDialogはデフォルトで最上位です。 showDialogを使用して呼び出されたウィンドウを破棄(クローズ)しない限り、何もできません。 –

0

in-luckyと同じように、最良の選択肢はShowDialogです。ただし、モーダルダイアログにしたくない場合は、Application.Current.Windowsを入力すると、アプリケーションの開いているフォームのリストが表示されます。次に、フォームにコードが表示される前に、フォームがリストにあるかどうかを確認します。このような何か:また

if(Application.Current.Windows.OfType<Window>() 
    .Where(x => x.Name == "myPopUpName").FirstOrDefault() == null){ 
    PopUp myPopUp = new PopUp(); 
    myPopUp.show(); 
} 

、フォームの名前をハードコーディングしたくない場合、あなたはこのようにそれを行うことができます。

PopUp myPopUp = new PopUp(); 
if(Application.Current.Windows.OfType<Window>() 
    .Where(x => x.Name == myPopUp.Name).FirstOrDefault() == null){ 
    myPopUp.show(); 
} 

しかし、それはA作成されるため、これはいくつかのリソースを浪費フォームの新しいコピーを作成し、すでに開いている場合はそれを破棄します。

+0

私はフォームを使用していませんが、wpfです。でもありがとう! @RacilHilan – Anna

+0

そして、 'Application.OpenForms'の代わりに' Application.Current.Windows'を使うことができます。私の更新された答えを見てください。 –

関連する問題