2011-04-28 64 views
9

我有一個包含Togglebutton和Popup的控件。當點擊ToggleButton時,彈出窗口出現。當ToggleButton未選中時,彈出窗口應該關閉。此外,從彈出窗口中單擊應導致它關閉,並導致Togglebutton取消選中。wpf中的Popup和Togglebutton交互

我已經通過將Popup的StaysOpen屬性設置爲false,並將切換按鈕的IsChecked屬性設置爲雙向綁定到Popup的IsOpen屬性來進行設置。

除了一種情況以外,一切正常 - 選中該按鈕並打開彈出窗口,單擊按鈕不會導致彈出窗口關閉,或者按鈕返回未選中狀態。

我相信這一定是因爲單擊該按鈕會導致Popup的StaysOpen邏輯將Popup的IsOpen屬性設置爲false。反過來,這會將Togglebutton設置爲未選中狀態。這必須發生在我點擊按鈕之前 - 所以點擊重新檢查按鈕,即競爭條件。

任何想法如何我可以得到我想要的行爲?

回答

9

如果你的假設是正確的,你需要自定義彈出類像下面這樣:

public class MyPopup : Popup { 
    protected override void OnPreviewMouseLeftButtonDown(MouseButtonEventArgs e) { 
     bool isOpen = this.IsOpen; 
     base.OnPreviewMouseLeftButtonDown(e); 

     if (isOpen && !this.IsOpen) 
      e.Handled = true; 
    } 
} 

您可能需要從if語句刪除!this.IsOpen。如果您改用MyPopup,它將阻止MouseLeftButtonDown事件到達ToggleButton。

+0

這是完美的,謝謝。 – 2011-04-28 16:39:19

+1

這種方法的一個問題是,如果您在彈出窗口外單擊,它實際上不會點擊任何內容。你不想點擊「ToggleButton」,但你想點擊其他所有 – svick 2012-10-31 15:31:44

1

的解決方案是設置一雙向Popup的ISOPEN屬性之間的結合和器isChecked切換按鈕的屬性 - THEN切換按鈕的ClickMode屬性設置爲。瞧!

+3

也不工作..點擊外部彈出不關閉彈出 – mike01010 2013-02-23 00:39:37

+0

@ mike01010我堅信這是一個錯誤... – torvin 2015-10-04 23:47:34

7

上述兩個解決方案都有問題。這是另一種解決方案,它使用事件處理程序而不是綁定,但可避免使用MyPopup解決方案指出的點擊問題,以及ClickMode = Press的問題。 的XAML看起來像:

<ToggleButton Name="OptionsButton" Checked="OptionsButton_OnChecked" Unchecked="OptionsButton_OnUnchecked" /> 
<Popup Name="OptionsPopup" StaysOpen="False" Closed="OptionsPopup_OnClosed"/> 

和代碼:

void OptionsPopup_OnClosed(object sender, EventArgs e) 
    { 
     if (OptionsButton != Mouse.DirectlyOver) 
      OptionsButton.IsChecked = false; 
    } 

    void OptionsButton_OnChecked(object sender, RoutedEventArgs e) 
    { 
     OptionsPopup.IsOpen = true; 
    } 

    void OptionsButton_OnUnchecked(object sender, RoutedEventArgs e) 
    { 
     OptionsPopup.IsOpen = false; 
    } 
+3

您可以通過將OptionsPopup.IsOpen綁定到OptionsButton.IsChecked,a.la來擺脫OnChecked和OnUnchecked處理程序。 ''。確保你設置**'Mode = OneWay' **。 – kcnygaard 2014-01-10 17:45:43