Предположим, у вас есть 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
Handler значение 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));