2010-02-22 152 views
2

我得到了我的用戶包含:隱藏彈出單擊與Popup.StaysOpen在WPF

  • 按鈕
  • 彈出(包含文本塊)

XAML

<UserControl> 
<button Name="btnShowPopup" Content="Button" Click="Button_Click"/> 
<Popup Name="popup" StaysOpen="true"> 
<TextBlock Text="Popup"/> 
</Popup> 
</UserControl> 

Code Behide

private void Button_Click(object sender, System.Windows.RoutedEventArgs e) 
{ 
    this.popup.IsOpen=!this.popup.IsOpen; 
} 

問題:當鼠標單擊btnShowPopup按鈕外的任何位置時,我想隱藏彈出窗口。

注:我嘗試改變StaysOpen="false"btnShowPopup.MouseDown事件: this.popup.IsOpen=!this.popup.IsOpen; 但這種方法會導致另一個問題:當btnShowPopup.MouseUp事件時,彈出窗口消失。

請幫忙。

回答

3

我會嘗試更多的WPF類型的方法。而不是在後面做代碼,我會嘗試綁定屬性。如果您更改了ToggleButton的按鈕,很容易。你看,ToggleButton有一個名爲IsChecked的布爾屬性

<ToggleButton x:Name="myToggle" /> 
<Popup x:Name="Popup" 
    IsOpen="{Binding Path=IsChecked, ElementName=myToggle}" 
    Placement="Right" 
    PlacementTarget="{Binding ElementName=myToggle}" 
    AllowsTransparency="True" 
    Focusable="False" 
    PopupAnimation="Fade" 
    StaysOpen="False"> 
    <Textblock Text="Here goes my content" /> 
</Popup> 

你覺得呢?

2

Tio。 這也是我正在嘗試的解決方案。但是它有兩個問題。

1)按下按鈕時,彈出窗口會打開,但如果再次按下按鈕,彈出窗口會關閉,然後再次快速打開。那不是我預期的行爲,我認爲它會再次關閉。

2)如果您遠離切換按鈕,彈出窗口保持打開狀態。

我用Google搜索了一下週圍,當然其他一些人曾經有過同樣的問題,並解決它:=)

檢查了這一點: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/f0502813-9c4f-4b45-bab8-91f98971e407

3

設置屬性ClickMode="Press"上的切換按鈕。

<ToggleButton x:Name="myToggle" ClickMode="Press" /> 
3

您還可以在StaysOpen屬性綁定的切換按鈕:

StaysOpen="{Binding ElementName=toggleButton,Path=IsMouseOver}" 

https://social.msdn.microsoft.com/Forums/vstudio/en-US/f0502813-9c4f-4b45-bab8-91f98971e407/popup-popupstaysopen-togglebutton-and-data-binding-helpful-tip?forum=wpf

,我的問題是,如果我點擊我的DataGrid翻一番,至極就是在彈出的彈出重新直接打開,這就是爲什麼我使用多重綁定。 我做了什麼:

我在IsMouseOver toggleButton和我的IsMouseOver數據網格上粘貼了StayOpen屬性,它在彈出窗口中。

<Popup.StaysOpen> 
    <MultiBinding Converter="{StaticResource MultiBinding_StayOpen}"> 
     <Binding ElementName="toggleButton" Path="IsMouseOver"/> 
     <Binding ElementName="dtg_loc" Path="IsMouseOver" /> 
    </MultiBinding> 
</Popup.StaysOpen> 

的multiBindingConverter:

public class MultiBinding_StayOpen : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 

     bool toggleIsMouseOver; 
     bool datagridIsMouseOver; 

     toggleIsMouseOver = System.Convert.ToBoolean(values[0]); 
     datagridIsMouseOver = System.Convert.ToBoolean(values[1]); 


     if (toggleIsMouseOver == false && datagridIsMouseOver == false) 
      return false; 

     if (toggleIsMouseOver == true && datagridIsMouseOver == false) 
      return true; 

     if (toggleIsMouseOver == true && datagridIsMouseOver == true) 
      return false; 

     return true; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

希望這有助於:-)