WPF Popup скрывается проблема
Предположим, у вас естьToggleButton
для открытияPopup
То же поведение, что и у всех известных элементовComboBox
и т.п.
... что это за код:
<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>
Тогда в коде позади вы работаете с.IsOpen
заPopup
а также .IsChecked
заToggleButton
, Все работает, но проблема приходит, когда вы открываетеPopup
и нажмите за пределами границ.Popup
будет закрыт, ноToggleButton
остается проверенным.
Вы не можете установить вPopupOnClosed
Обработчик, которыйToggleButton.IsChecked = false
потому что, когда вы нажимаете наToggleButton
закрытьPopup
,Popup
закрывается, устанавливаетToggleButton.IsChecked = false
но в то же время вы нажали наToggleButton
и этопытается открыть Popup
снова. Таким образом, вы не можете закрыть его.
1st ToggleButtonClick:
-> ToggleButton IsChecked = true
2nd ToggleButtonClick:
-> ToggleButton IsChecked = false
-> ToggleButton IsChecked = true
Поэтому, если вы нажимаете кнопку Toggle, когда всплывающее окно открыто, оно мигает, но остается открытым.
Как бы вы решили эту проблему, пожалуйста?
Редакция:
Попробуйте это в MyWindow.XAML и добавьте свойство зависимостей IsDropDownOpen в код позади:
<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));