2011-09-29 78 views
8

WPF真的讓我擺脫我的神經在這裏。我配置了一些帶有一些複雜內容(網格,按鈕等)的彈出窗口。在文本框MouseDown預覽事件中,我將其StableOpen屬性設置爲False,將IsOpen設置爲True。彈出窗口永不關閉

THS的是,它打開,但從來沒有單擊窗口外的任何地方時關閉。

有什麼建議嗎?

謝謝!

UPDATE:

我彈出了裏面的按鈕。當我點擊其中一個時,彈出窗口會在我點擊它之外時關閉。事件路由發生了一些奇怪的事情嗎?

+0

你試過手動關閉它像你有任何關閉按鈕嗎?或將ESC鍵等鍵映射到彈出窗口。 –

+0

我可以這樣做,但我需要它失去焦點時自動關閉。 –

+0

你可以添加簡單的XAML來證明這個問題(也可以幫助你調試)? –

回答

4

看起來像彈出窗口將不會關閉,如果由任何其他控件事件打開。我只是將IsOpen屬性綁定到ToggleButton的IsChecked屬性來模擬組合框。

感謝您的答案。

+0

我同意,同樣的事情爲我工作。奇怪的行爲,但工作。在代碼中爲IsOpenProperty創建了一個綁定到一個切換按鈕IsChecked屬性,它工作正常。我要買它 :) – TravisWhidden

0

我在文本框的MouseDown預覽事件上設置了IsOpen。

它設置的是什麼? TextBox託管在哪裏?

我只能猜測提供的信息很少,但我會說當你點擊Popup以外的地方時,你的事件處理程序正在觸發並再次打開它。

+0

該文本框位於窗口中使用的用戶控件中。在用戶控件中,無論何時單擊文本框,我都會設置IsOpen = true。當彈出窗口失去焦點時,它永遠不會關閉。 –

0

您可以使用LostFocus事件彈出窗口。如果焦點不在彈出框內,請將它的IsOpen設置爲false以關閉它。

+0

它什麼也沒做。如果我將彈出的IsOpen屬性設置爲true來啓動窗口,它將正常工作。如果我在文本框PreviewMouseButtonDown事件上設置它不起作用。 –

0

我也有這個問題,除了在按鈕的PreviewMouseButtonUp事件。假設Popups存在一些錯誤並試圖在Tunneling事件中打開它們,這是非常準確的,並且讓我走上了修補程序的路徑(這更通用一些)。

我需要通過偵聽冒泡事件而不是隧道事件來解決這個問題(主機控件是通用的/可能是幾種類型的控件),特別是使用AddHandler(RoutedEvent,Delegate,Boolean)方法來捕獲處理的事件。從隧道過渡到起泡時

WAG問題在於某處。

0

我用後面的代碼初始化彈出,我發現,如果從如鼠標事件的其他UI動作跑同步沒有關閉。要解決此問題,我運行它異步:

public static void ShowPopupMessage(string message) 
    { 
     DispatcherHelper.UIDispatcher.BeginInvoke(new Action(() => 
     { 
      var popup = new Popup 
      { 
       Child = new AutoHideMessage(message), 
       StaysOpen = false, 
       IsOpen = true 
      }; 
     })); 
    }