2010-02-22 2 views
2

Je suis mon UserControl Contenir:pop-up Hiding sur la souris cliquez avec Popup.StaysOpen dans WPF

  • Bouton
  • Popup (contiennent bloc de texte)

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; 
} 

QUESTION: Je veux cacher le popup, lorsque la souris clique n'importe où en dehors du bouton btnShowPopup.

NOTE: J'ai essayé changement StaysOpen="false" et quand btnShowPopup.MouseDown événement: this.popup.IsOpen=!this.popup.IsOpen; Mais cette solution provoquent un autre problème: lorsque l'événement btnShowPopup.MouseUp, le Popup est disparaître.

Aidez-nous s'il vous plaît.

Répondre

3

Je voudrais essayer une approche plus WPF-esque. Au lieu de faire du code, j'essaierais de lier les propriétés. Si vous changez le bouton pour un ToggleButton, c'est facile. Vous voyez, ToggleButton a une propriété booléenne nommée 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> 

Qu'en pensez-vous?

2

Tio. C'est la solution que j'essaie aussi. Cependant, il y a deux problèmes avec cela.

1) Lorsque vous appuyez sur le bouton, le menu contextuel s'ouvre. Toutefois, si vous appuyez de nouveau sur le bouton, la fenêtre se ferme et s'ouvre rapidement à nouveau. Ce n'est pas le comportement que je m'attendais, je pensais qu'il se refermerait alors.

2) Si vous ne touchez pas au bouton à bascule, le menu contextuel reste ouvert.

Je googlé un peu, bien sûr, un autre type avait eu le même problème, et résolu: =)

check this out: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/f0502813-9c4f-4b45-bab8-91f98971e407

3

Définissez la propriété ClickMode="Press" sur le bouton à bascule.

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

Vous pouvez également lier la propriété StaysOpen sur le togglebutton:

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

Le problème pour moi était si je double clic sur mon DataGrid, Wich est dans le menu contextuel, la popup re ouvert directement, c'est pourquoi j'ai utilisé le multibinding. Ce que j'ai fait:

I Multi lié la propriété StayOpen sur IsMouseOver toggleButton et sur ma grille de données IsMouseOver qui est dans le popup.

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

Le 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(); 
    } 
} 

Hope it aider :-)

Questions connexes