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

Ответы на вопрос(6)

Ваш ответ на вопрос