Supposons que vous ayez un ToggleButton
pour ouvrir un Popup
, même comportement que tous les éléments connus comme ComboBox
etc.WPF problème Popup cachette
... qui est ce code:
<ToggleButton x:Name="PART_OpenToggleButton"
Focusable="False"
IsChecked="False"
Template="{StaticResource MyToggleButton}">
<Grid>
<Popup x:Name="PART_PopupControl"
Style="{StaticResource MyPopupStyle}"
StaysOpen="False"
VerticalAlignment="Bottom"
IsOpen="False"
PlacementTarget="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ToggleButton, AncestorLevel=1}}" />
</Grid>
</ToggleButton>
Puis dans le code derrière vous travaillez avec . IsOpen
pour Popup
et. IsChecked
pour ToggleButton
. Tout fonctionne, mais le problème arrive lorsque vous ouvrez le Popup
et cliquez en dehors des frontières. Le Popup
sera fermé mais le ToggleButton
sera vérifié.
Vous ne pouvez pas définir dans le gestionnaire PopupOnClosed
que ToggleButton.IsChecked = false
, parce que lorsque vous cliquez sur le ToggleButton
pour fermer la Popup
, le Popup
se ferme, définit ToggleButton.IsChecked = false
mais au moment de Sime vous avez cliqué sur le ToggleButton
et essaie d'ouvrir le à nouveau. Donc vous ne pouvez pas le fermer.
1er ToggleButtonClick:
-> ToggleButton IsChecked = true
2ème ToggleButtonClick:
-> ToggleButton IsChecked = false
-> ToggleButton IsChecked = true
Donc, si vous cliquez sur le bouton à bascule en Popup étant ouvert, il clignote, mais reste ouvert.
Comment pourriez-vous résoudre ce problème, s'il vous plaît?
ÉDITÉE:
Essayez ceci dans un MyWindow.XAML et ajouter la propriété de dépendance IsDropDownOpen dans le code derrière, s'il vous plaît:
<Grid>
<ToggleButton x:Name="PART_OpenToggleButton"
Focusable="False"
Height="20"
Width="50"
IsChecked="{Binding ElementName=TestWindow, Mode=TwoWay, Path=IsDropDownOpen}">
<Grid>
<Popup x:Name="PART_PopupControl"
Width="100"
Height="100"
StaysOpen="False"
Focusable="False"
VerticalAlignment="Bottom"
IsOpen="{Binding ElementName=TestWindow, Path=IsDropDownOpen}"
PlacementTarget="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ToggleButton, AncestorLevel=1}}">
</Popup>
</Grid>
</ToggleButton>
</Grid>
public bool IsDropDownOpen
{
get { return (bool)GetValue(IsDropDownOpenProperty); }
set { SetValue(IsDropDownOpenProperty, value); }
}
public static readonly DependencyProperty IsDropDownOpenProperty =
DependencyProperty.Register("IsDropDownOpen", typeof(bool), typeof(Window), new UIPropertyMetadata(false));
Prenez un coup d'oeil à: http://stackoverflow.com/questions/13687463/wpf-popup-staysopen-false-still-keep-the-popup-open-while-clicking-outside – SepehrM