2017-05-28 20 views
0

私は、操作が実行されたときにpopupを含むウィンドウを持っています。このポップアップを呼び出しました。例えば、ユーザが連続しているときinsertデータとショーポップアップ、衝突が発生するため閉鎖される。 私のコードは次のとおりです。ここでWpf新しいポップアップを開始すると自動的に前のポップアップを閉じる方法

public partial class AvinPopup : Window 
{ 
    static AvinPopup _popup; 
    static int timePopup = 0; 
    static string textPopUp = ""; 

    private AvinPopup() 
    { 
     InitializeComponent(); 
    } 
    private static void StartCloseTimer() 
    { 
     DispatcherTimer timer = new DispatcherTimer(); 
     timer.Interval = TimeSpan.FromSeconds((double)timePopup); 
     timer.Tick += TimerTick; 
     timer.Start(); 
    } 

    private static void TimerTick(object sender, EventArgs e) 
    { 
     DispatcherTimer timer = (DispatcherTimer)sender; 
     timer.Stop(); 
     timer.Tick -= TimerTick; 
     _popup.Close(); 
     _popup.popup.IsOpen = false; 

    } 
    public static void Show(string _textPopup, int _timePopup = 3) 
    { 
     timePopup = _timePopup; 
     textPopUp = _textPopup; 

     Thread newWindowThread = new Thread(ThreadStartPopup); 
     newWindowThread.SetApartmentState(ApartmentState.STA); 
     newWindowThread.IsBackground = true; 
     newWindowThread.Start(); 
    } 

    private static void ThreadStartPopup() 
    { 

     _popup = new AvinPopup(); 
     _popup.popup.VerticalOffset = System.Windows.SystemParameters.PrimaryScreenHeight - 200; 
     _popup.popup.HorizontalOffset = 100; /*System.Windows.SystemParameters.PrimaryScreenWidth +100;*/ 
     _popup.txtPopup.Text = textPopUp; 
     _popup.Show(); 
     StartCloseTimer(); 
     System.Windows.Threading.Dispatcher.Run(); 
    } 
+0

は、あなたの答えはhttps://stackoverflow.com/questions/8828240/listen-to-dependencyproperty-changed-event-and-get-the-old-value – Karolis

+0

ですShowメソッドまたはThreadStartPopupメソッドをポップアップが既に開いているかどうかチェックインしてみませんか? – elgonzo

+0

@elgonzoどうすれば確認できますか? – Mohadeseh

答えて

0
private static readonly ManualResetEventSlim _Blocker = new ManualResetEventSlim(false); 

private static void ThreadStartPopup() 
{ 
    _Blocker.Reset(); 
    System.Windows.Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => 
    { 
     if (_popup != null && _popup.IsOpen) 
      _popup.IsOpen = false; 

     _Blocker.Set(); 
    })); 

    _Blocker.Wait(); 
    _popup = new AvinPopup(); 
    _popup.popup.VerticalOffset = System.Windows.SystemParameters.PrimaryScreenHeight - 200; 
    _popup.popup.HorizontalOffset = 100; /*System.Windows.SystemParameters.PrimaryScreenWidth +100;*/ 
    _popup.txtPopup.Text = textPopUp; 
    _popup.Show(); 
    StartCloseTimer(); 
    System.Windows.Threading.Dispatcher.Run(); 
} 
+0

エラーが発生しました:別のスレッドが所有しているため、呼び出し元のスレッドはこのオブジェクトにアクセスできません。 – Mohadeseh

+0

私の例を編集しました。今度は 'Thread'が' ManualResetEventSlim'ブロッカーを有効にしています。その後、 'Dispatcher Operation'を呼び出して、それが終了した後、新しい' Thread'が継続します。 –

+0

もう一度このエラーが発生します。エラーは次のコードからのものです: 'if(_popup!= null && _popup.popup.IsOpen)'と '_popup.popup.IsOpen'がnullです。説明エラー:** StackTrace \t "でSystem.Windows.Threading.Dispatcher.VerifyAccess()System.Windows.Threading.DispatcherObject.VerifyAccess()でSystem.Windows.DependencyObject.GetValue(DependencyProperty dp)でSystem.Windows.Controls .Primitives.Popup.get_IsOpen()<> x。<> m0(<> c <> 4__this)文字列** – Mohadeseh

関連する問題